Socket.io + PhoneGap

Posted

技术标签:

【中文标题】Socket.io + PhoneGap【英文标题】: 【发布时间】:2012-05-31 01:43:00 【问题描述】:

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

(在应该支持 socket.io 的 ios 上)

Access-Control-Allow-Origin 不允许 Origin null。

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

谢谢!!

【问题讨论】:

【参考方案1】:

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

见Faq:

问。无法加载指向外部主机的链接和从外部主机导入的文件?

A.最新代码具有新的白名单功能。如果您引用外部主机, 您必须在“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/基本 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 服务器的主机名替换 HOST!

【讨论】:

这只有安卓吗?我正在为 iOS 构建并且没有 cordova.xml,只有一个 cordova.plist。你在iOS上做过吗?谢谢! 是(cordova.xml 仅适用于 android)。对于 iOS,您必须将 HOST 放在 PhoneGap.plist 中(请参阅 ***.com/a/8972890/584545) 将主机添加到白名单中没有任何作用,因为设置了 orgin,这就是问题所在。下面的 Shazron(他创建了 PhoneGap)有正确的想法,我只是不知道该怎么做。 对于 android 和 iOS,我使用 cordova 的白名单插件实现了它。 github.com/apache/cordova-plugin-whitelist【参考方案2】:

使用 PhoneGap 使用 file:// 协议打开网页

使用 file:// 协议没有为 WebSocket 连接设置源,因此如果服务器没有设置 Access-Control-Allow-,浏览器将引发该安全异常启用CORS的响应的Origin标头

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

安卓:https://github.com/anismiles/websocket-android-phonegap

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

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

【讨论】:

【参考方案3】:

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

(可以通过 NSURLProtocol 做到这一点,但我不想在不知道修复的情况下进入这个兔子洞)

【讨论】:

以上是关于Socket.io + PhoneGap的主要内容,如果未能解决你的问题,请参考以下文章

未找到 Socket.io.js(node.js + express + socket.io)

socket.io 中文手册 socket.io 中文文档

socket.io 中文手册 socket.io 中文文档

socket.io 中文手册 socket.io 中文文档

socket.io 中 io.on 和 socket.on 的区别

学习 Socket.io