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)