22

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

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

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

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

谢谢!!

4

3 回答 3

19

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

常见问题

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

A. 最新代码新增白名单功能。如果您引用外部主机,则必须在“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!

于 2012-06-04T18:48:29.150 回答
5

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

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

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

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

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

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

于 2012-05-24T13:33:24.887 回答
2

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

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

于 2012-05-25T04:38:15.577 回答