Socket.io + PhoneGap

时间:2012-05-24 13:05:25

标签: javascript node.js cordova socket.io

当我尝试将Socket.IOPhoneGap一起使用时,我收到此错误:

(在iOS上应该支持socket.io)

  

Access-Control-Allow-Origin不允许使用原点。

这是因为我的应用程序是通过file://协议提供的。我该怎么做才能解决这个问题?

谢谢!

3 个答案:

答案 0 :(得分:19)

您必须将socketio主机添加到PhoneGap.plist中的“ExternalHosts”键。

请参阅Faq

  

Q值。是否加载了外部主机的链接和导入的文件?

     

一个。最新代码具有新的白名单功能。如果您正在引用外部主机,   您必须在“ExternalHosts”键下的PhoneGap.plist中添加主机。通配符都可以。   因此,如果您要连接到“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);
    });
});

你必须用socket.io服务器的主机名替换主机!

答案 1 :(得分:5)

使用PhoneGap,使用 file:// 协议

打开网页

使用 file:// 协议,没有为WebSocket连接设置原点,因此如果服务器未设置 Access-Control-Allow-,浏览器将引发该安全性异常启用CORS

的响应的原始标头

考虑使用如下的一些PhoneGap插件,它使用本机代码来处理连接,但在webviews中启用(希望是标准兼容的)WebSocket API

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

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

这些插件只是我发现的第一个,不确定它们有多少是积极开发和稳定的

答案 2 :(得分:2)

因此,如果在PhoneGap中使用file:// url协议打开的网页是发送标题“Access-Control-Allow-Origin:*” - 理论上它应该与socket.io一起使用?

(可以通过NSURLProtocol这样做,但我不想在不知道修复的情况下离开这个兔子洞)