Socket.IO を PhoneGap とともに使用しようとすると、次のエラーが発生します。
(socket.ioをサポートする必要があるiOSの場合)
Origin nullはAccess-Control-Allow-Originでは許可されていません。
これは、私のアプリがfile://
プロトコル。これを回避するにはどうすればよいですか?
ありがとう!!
Socketio HostをPhoneGap.plistの「ExternalHosts」キーに追加する必要があります。
FAQ を参照してください:
Q.外部ホストへのリンクとインポートされたファイルが読み込まれませんか?
A.最新のコードには新しいホワイトリスト機能があります。外部ホストを参照している場合は、PhoneGap.plistの「ExternalHosts」キーの下にホストを追加する必要があります。ワイルドカードは問題ありません。したがって、「 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サーバーのホスト名で置き換える必要があるホスト!
PhoneGapを使用して、file://プロトコルを使用してWebページを開きます
file://プロトコルでは、OriginはWebSocket接続に設定されていないため、サーバーがAccess-Control-Allow-Originヘッダーから応答を有効にする [〜#〜] cors [〜#〜]
次のようなPhoneGapプラグインの使用を検討してください。これは、ネイティブコードを使用して接続を処理しますが、WebView内で(うまくいけば標準互換の)WebSocket APIを有効にします
Android: https://github.com/anismiles/websocket-Android-phonegap
iPhone: https://github.com/remy/PhoneGap-Plugin-WebSocket
これらのプラグインは私が見つけた最初のプラグインであり、どれだけ積極的に開発されて安定しているかはわかりません
したがって、PhoneGapのfile:// urlプロトコルで開いたWebページがヘッダー "Access-Control-Allow-Origin:*"を送信する場合、理論的にはすべてsocket.ioで動作するはずです。
(NSURLProtocolを使用してこれを行うことは可能ですが、修正を知らずにこのうさぎの穴を下りたくありませんでした)