PhoneGapでSocket.IOを使用しようとすると、次のエラーが発生します。
(socket.ioがサポートされるべきiOSの場合)
Origin nullは、Access-Control-Allow-Originでは許可されていません。
これは、私のアプリがfile://
プロトコルを介して提供されているためです。これを回避するにはどうすればよいですか?
ありがとう!!
PhoneGap.plist の「ExternalHosts」キーに socketio ホストを追加する必要があります。
よくある質問を参照してください:
Q. 外部ホストへのリンクおよび外部ホストからインポートされたファイルがロードされませんか?
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);
});
});
HOST を socket.io サーバーのホスト名に置き換える必要があります。
PhoneGap を使用すると、file://プロトコルを使用して Web ページが開かれます。
file://プロトコルではオリジンが WebSocket 接続に設定されていないため、サーバーがAccess-Control-Allow-Originヘッダーを応答に設定しないと、ブラウザーはそのセキュリティ例外を発生させ、 CORSを有効にします。
次のような PhoneGap プラグインの使用を検討してください。これは、ネイティブ コードを使用して接続を処理しますが、Web ビュー内で (できれば標準互換の) WebSocket API を有効にします。
アンドロイド: 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 を介して行うことは可能ですが、修正を知らずにこのうさぎの穴を掘り下げたくありませんでした)