Socket.io + PhoneGap

fan*_*ncy 22 javascript node.js socket.io cordova

当我尝试使用PhoneGap的Socket.IO时,我收到此错误:

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

Access-Control-Allow-Origin不允许使用null.

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

谢谢!!

小智 19

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

常见问题:

问:无法加载外部主机的链接和导入的文件?

答:最新的代码具有新的白名单功能.如果要引用外部主机,则必须在"ExternalHosts"键下的PhoneGap.plist中添加主机.通配符都可以.因此,如果您要连接到" http://phonegap.com ",则必须将"phonegap.com"添加到列表中(或使用与子域匹配的通配符"*.phonegap.com").(注意:如果您在Xcode中打开plist文件,则无需使用XML语法.)

对于android,您必须编辑cordova.xml并添加对socketio主机的访问权限:

<access origin="HOST*"/> 
Run Code Online (Sandbox Code Playgroud)

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>
...
Run Code Online (Sandbox Code Playgroud)

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);
    });
});
Run Code Online (Sandbox Code Playgroud)

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

  • 是(cordova.xml仅限android).对于iOS,您必须将HOST放在PhoneGap.plist中(请参阅http://stackoverflow.com/a/8972890/584545) (2认同)

BFi*_*Fil 5

使用PhoneGap,使用file:// protocol 打开网页

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

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

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

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

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