Подтвердить что ты не робот

Socket.io + PhoneGap

Когда я пытаюсь использовать Socket.io с PhoneGap, я получаю эту ошибку:

(на iOS, где должен поддерживаться socket.io)

Origin null is not allowed by Access-Control-Allow-Origin.

Это связано с тем, что мое приложение обслуживается через протокол file://. Что я могу сделать, чтобы обойти это?

Спасибо!!

4b9b3361

Ответ 1

Вы должны добавить хост socketio к ключу "ExternalHosts" в PhoneGap.plist.

См. Faq:

Q. Ссылки на и импортированные файлы с внешних хостов не загружаются?

а. Последний код имеет новую функцию белого списка. Если вы ссылаетесь на внешние хосты, вам нужно будет добавить хост в PhoneGap.plist под ключ "ExternalHosts". Подстановочные знаки в порядке. Поэтому, если вы подключаетесь к " http://phonegap.com, вам нужно добавить" phonegap.com "в список (или использовать подстановочный знак" *.phonegap.com" который также будет соответствовать поддоменам). (Примечание: если вы открываете plist файл в Xcode, вам не нужно будет возиться с синтаксисом XML.)

Для android вам нужно отредактировать файл cordova.xml и добавить доступ к хосту socketio:

<access origin="HOST*"/> 

index.html(с примером socketio):

...
<script src="HOST/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect('HOST');
    socket.on('news', function (data) {
        socket.emit('my other event', { my: 'data' });
    });
</script>
...

app.js(пример на стороне сервера javascript/basic socketio):

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {

socket.emit('news', { hello: 'world' });
    socket.on('my other event', function (data) {
        console.log(data);
    });
});

В HOST вам нужно заменить имя хоста вашего сервера socket.io!

Ответ 2

Используя PhoneGap, веб-страница открывается с использованием файла://protocol

С файлом://протокол no origin не установлен в соединение WebSocket, поэтому браузер будет поднимать это исключение безопасности, если сервер не установит заголовок Access-Control-Allow-Origin ответа, позволяющего CORS

Рассмотрите возможность использования какого-либо плагина PhoneGap, например следующего, который использует собственный код для обработки соединения, но включает в себя (надеюсь, совместимый со стандартом) API WebSocket внутри веб-просмотров

Android: https://github.com/anismiles/websocket-android-phonegap

iPhone: https://github.com/remy/PhoneGap-Plugin-WebSocket

Эти плагины - это только первые, которые я нашел, не уверен, насколько они активно развиты и стабильны.

Ответ 3

Итак, если веб-страница открылась с файлом://протокол url в PhoneGap должен был отправить заголовок "Access-Control-Allow-Origin: *" - теоретически все должно работать с socket.io?

(это можно сделать через NSURLProtocol, но я не хотел спускаться с этой кроличьей дыры, не зная исправить)