Socket.io + PhoneGap

当我尝试使用PhoneGap使用Socket.io时出现此错误:

(在支持socket.io的iOS上)

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

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

谢谢!!

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

看常见问题 :

问:来自外部主机的链接和导入的文件不加载?

答:最新的代码有新的白名单function。 如果您正在引用外部主机,则必须在“ExternalHosts”键下的PhoneGap.plist中添加主机。 通配符是好的。 因此,如果您连接到“ http://phonegap.com ”,则必须将“phonegap.com”添加到列表中(或者使用通配符“*。phonegap.com”,它将与子域名匹配)。 (注意:如果您在Xcode中打开plist文件,则不需要摆弄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!

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

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

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

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

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

这些插件只是我发现的第一个,不知道他们积极发展和稳定

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

(可以通过NSURLProtocol来做到这一点,但我不想在不知道修正的情况下继续下去)