2013-09-01 3 views
1

Я разрабатываю приложение, которое проверяет, обновлена ​​ли моя база данных, и если это так, мое приложение отображает новые значения.Сервер отправил события - междоменное Safari

стороне клиента:

if(typeof(EventSource)!=="undefined") { 
    var eSource = new EventSource("http://mydomain.org/app.php"); 
    eSource.onmessage = function(event) {} 
} 

стороне сервера:

<?php 
header("Content-Type: text/event-stream"); 
header("Cache-Control: no-cache"); 
header("Access-Control-Allow-Origin: *"); 
echo "data:Hello World\n\n"; 
?> 

Теперь все работает в Firefox и Chrome. Приложение будет работать в браузере, основанном на Safari. В Safari, я получаю

SECURITY_ERR: DOM Exception 18: An attempt was made to break through the security policy of the user agent. 

Так эта проблема имеет что-то делать с кросс-происхождения проводки, даже если Access-Control-Allow-Origin имеет подстановочные. Любой способ сделать эту работу в Safari?

ответ

1

WebKit еще не поддерживает CORS в SSE. Решения:

  1. Fetch из того же происхождения, new EventSource("/app.php");

  2. Использование CORS-Aware polyfill для Safari. https://github.com/Yaffle/EventSource

  3. Создать IFRAME в том же происхождении, что ваш поток SSE (http://mydomain.org/iframe.html), читать то же происхождение потока в IFRAME, и использовать postMessage() для отправки события другого происхождения.

+0

Решение 1. HTML-файл должен запускаться с жесткого диска (например, виджет в браузере). Решение 3. Пользователь может предоставить параметры для стилизации, поэтому с помощью iFrame невозможно стилизовать элементы из другого источника. Кажется, мне нужно будет найти решение 2. –

+0

@TomBroucke iframe может быть невидимым. – Kornel

+0

Да, я раньше не использовал postMessage(), но это похоже на очень хорошее решение моей проблемы. благодаря –

0

Какая версия Safari? Я считаю, что CORS для EventSource был сломан до Chrome 25+ и Safari 6.1+.

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