2016-07-26 2 views
13

Этот вопрос:Local Storage Междоменное - Safari отключает его по умолчанию

Я использовал GitHub проект Офир Даган: Сохранение междоменное локальное хранилище.

Он реализует html5 локальное хранилище: https://github.com/ofirdagan/cross-domain-local-storage


Проблема:

Safari не позволяет куки третьих лиц по умолчанию (другие браузеры позволяют это).

Safari предпочтения частной жизни:

enter image description here

по умолчанию: "Разрешить из сайтов я посещаю".

Я читал об этих параметрах:

  1. Всегда блокировать - Блокировать все первые сторонние куки и блокировать все сторонние куки.

  2. Разрешить только с текущего сайта - Разрешить все файлы cookie сторонних производителей и блокировать все сторонние файлы cookie.

  3. Позвольте от веб-сайтов, которые я посещаю - Разрешить все первые сторонние куки и блокировать все сторонние куки, если что третья сторона не была первая партия в свое время (на основе текущих печеньем и истории просмотра).

  4. Всегда разрешать - Разрешить все файлы cookie сторонних производителей и разрешить использование всех сторонних файлов cookie.


Решение Я попытался:

Локальное хранилище с фрейма (пикселя) - Я не думаю, что это больше не работает на сафари - Is there any workaround to set third party cookie in Iframe for safari?


Я думаю, что существует способ совместного использования локального хранилища между сайтами сторонних производителей и сторонними сайтами в Safari. (Facebook.com и Booking.com обмениваются данными между разными доменами).

Мне удалось добиться этого, удалив API и написав его самостоятельно. Но я не хочу удалять API и реализовывать его самостоятельно (надеюсь, что есть небольшое исправление для поддержки Safari):

Iframe.html:

window.addEventListener('cors_event', function(event) { 
    if(event.event_id === 'my_cors_message'){ 
     if (event.data.options.funcName == "SetItem") { 
      localStorage.setItem(event.data.options.key, event.data.options.value); 
     } 
     else if (event.data.options.funcName == "GetItem") { 
      return localStorage.getItem(event.data.options.key); 
     } 
    } 
}); 

MainPage:

<iframe id="target" src="iframe.html" frameborder="1"></iframe> 

<script> 

    var target = document .getElementById('target'); 
    target.onload = function(){ 
     target.contentWindow.postMessage('set', '*') 
    } 
</script> 

Так кто-то знает, как я могу достичь этого, изменив некоторые API-интерфейсы для поддержки Safari?

Любая помощь оценена!

+0

Не путайте печенье и локальное хранилище. Это разные вещи. Файлы cookie вообще не связаны с локальным хранилищем. Поэтому, если вы используете локальное хранилище, политика обработки файлов cookie не может вызвать проблемы с локальным хранилищем. – hindmost

+0

Я знаю, что Cookies и локальное хранилище разные. Но когда я перехожу к: «Всегда разрешать», локальное хранилище считывается из кросс-домена. Я предполагаю, что локальное хранилище связано с данными «и веб-сайта». Я могу отправить вам пример для этого. (Хранение данных в локальном хранилище сайта X, а затем перейдите на сайт Y, который пытается прочитать данные). –

+1

В какой версии сафари это поведение изменилось? – mash

ответ

6

Вы можете попробовать Store.JS. В соответствии с Документами:

store.js предоставляет простой API для кросс-браузер локального хранения

+5

Работает ли store.js кросс-домен? Я вижу, где он говорит кросс-браузер, но не вижу ссылки на кросс-домен (что очень отличается). –

+0

Incase кто-то задается вопросом, что это не работает перекрестный домен для Safari. Поэтому, если ваш домен верхнего уровня является 'site-a.com', а ваш iframe -' site-b.com', данные для 'site-b' будут удалены. –

3

Заметки о Safari 7+ (OSX, IOS)

Все междоменное локальный доступ к хранилищу по умолчанию отключена с Safari 7+. Это результат настройки конфиденциальности «Блокировать файлы cookie и других веб-сайтов», установленных на «От третьих лиц и рекламодателей». Любой клиентский код кросс-хранилища не будет разбиваться, однако он будет иметь доступ только к изолированному изолированному локальному хранилищу. Таким образом, ни одна из данных, ранее установленных другими источниками, не будет доступна. Если есть опция, можно вернуться к использованию корневых файлов cookie для этих пользовательских агентов или запросить данные из хранилища на стороне сервера.

подробнее см это lib

Смежные вопросы