Как определить приватный просмотр в iOS 11 Mobile Safari или MacOS High Sierra Safari?

В новом iOS 11 Safari и MacOS High Sierra Safari этот трюк, видя, что window.localStorage.setItem('test', 1); (см. qaru.site/info/100144/...), больше не работает, потому что он больше не выдает ошибку, а также правильно устанавливает элемент localStorage. Кто-нибудь выяснил какой-либо другой способ проверить режим частного просмотра в новых версиях Safari?

Ответ 1

На самом деле не пробовал, но читал документ Apple:

https://support.apple.com/kb/ph21413?locale=en_US

В нем перечислены различные характеристики просмотра частного режима (~ snip):

Когда вы используете окно частного просмотра:

  • Каждая вкладка в окне изолирована от других, поэтому веб-сайты просмотр в одной вкладке не может отслеживать просмотр в других вкладках.

  • Safari не помнит веб-страницы, которые вы посещаете, или ваш автозаполнение информация.

  • Safari не хранит ваши открытые веб-страницы в iCloud, поэтому они arent отображается при просмотре всех открытых вкладок с других устройств.

  • Ваш недавний поисковый запрос включен в список результатов при использовании поле "Умный поиск".

  • Элементы, которые вы загружаете, входят в список загрузок. (Предметы оставайтесь на своем компьютере.)

  • Если вы используете Handoff, частные окна просмотра не передаются на ваш iOS или других компьютеров Mac.

  • Safari не запоминает изменения в ваших файлах cookie или другом веб-сайте данные. Safari также спрашивает веб-сайты и другие, которые предоставляют эти сайты с содержанием (включая рекламодателей), чтобы не отслеживать ваши просматривая, хотя для соблюдения этого запроса соблюдаются веб-сайты.

  • Плагины, поддерживающие Private Browsing, перестают хранить файлы cookie и другие отслеживание информации.

Из вышеизложенного, в частности, я нашел интересным, что Safari специально просит веб-сайты "не отслеживать" просмотр. Это потенциально может быть механизмом поиска, чтобы определить, пользуетесь ли вы приватным просмотром.

См. этот ответ для примера:

Реализация Не отслеживать в asp.net mvc

Опять же, не были проверены и не уверены, если он будет работать, но если список не содержит других потенциальных вариантов. НТН.

Ответ 2

Цитата с сайта apple. https://support.apple.com/kb/ph21413?locale=en_US

Сайты не могут изменять информацию, хранящуюся на вашем устройстве, поэтому службы обычно доступные на таких сайтах, могут работать по-разному, пока вы не off Частный просмотр

Итак, сохраните тестовую переменную, измените ее значение, затем прочитайте тестовую переменную. Если вы получаете исключение, не можете найти переменную, значение не изменилось или вы вернете значение null/ undefined, они скорее всего будут в частном режиме.

Кроме того, при приватном просмотре у вас нет сохраненной истории поиска. Итак, перенаправляйте на новую страницу на своем сайте при запуске, а затем проверяйте, есть ли у вас предыдущая история. Если нет, и тот факт, что вы получаете Do Not Track, скорее всего, означает, что вы находитесь в приватном режиме на сафари.

Обратите внимание, что я не тестировал это. Это основано на информации, предоставленной Apple в приведенной выше ссылке.

Ответ 3

Я нахожу решение здесь:

https://gist.github.com/cou929/7973956#gistcomment-2272103

var isPrivate = false;
try {
   window.openDatabase(null, null, null, null);
} catch (_) {
   isPrivate = true;
}
alert((isPrivate ? 'You\'re' : 'You aren\'t')  + ' in private browsing mode');

Надеюсь, это поможет:)

Ответ 4

Что я понял, Safari выбрасывает ошибку "Квота превышена" в частном режиме. Итак, вот что я сделал!

isPrivateMode: function () {
  if (localStorage.length === 0) {
    try {
      localStorage.setItem('isLocalStorageAvaialble', 'That is being tested!');
      localStorage.removeItem('isLocalStorageAvaialble');
      return false;
    } catch (e) {
      return true;
    }
  }
}

Проверка длины localStorage важна для того, чтобы, если вы пытаетесь использовать этот метод в браузере, который поддерживает localStorage, но заполнен, вы все равно получите ошибку "Quota Exceeded". В частном режиме длина localStorage всегда равна 0.

Надеюсь, это поможет!