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

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


person JYeh    schedule 16.08.2017    source источник


Ответы (4)


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

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

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

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

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

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

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

  • Ваши недавние поисковые запросы не включаются в список результатов, когда вы используете поле интеллектуального поиска.

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

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

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

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

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

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

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

Опять же, не тестировал и не уверен, будет ли он работать, но если нет, в списке есть другие возможные варианты. HTH.

person kvr    schedule 25.08.2017

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

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');

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

person GOR BAND    schedule 04.12.2017

Цитата с веб-сайта Apple. https://support.apple.com/kb/ph21413?locale=en_US

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

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

В качестве альтернативы, при приватном просмотре у вас нет доступной сохраненной истории поиска. Итак, перенаправьте на новую страницу вашего сайта при запуске, а затем проверьте, есть ли у вас предыдущая история. Если нет, и тот факт, что вы получаете «Не отслеживать», скорее всего, означает, что вы находитесь в частном режиме на сафари.

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

person thatguy    schedule 25.08.2017

Я понял, что 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, но заполнен, вы все равно получите ошибку «Превышена квота». В приватном режиме длина localStorage всегда равна 0.

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

person Shreerang    schedule 15.01.2018