2012-05-24 3 views
21

Lorsque je tente d'utiliser Socket.io avec PhoneGap je reçois cette erreur:Socket.io + PhoneGap

(sur iOS où socket.io doit être pris en charge)

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

Ceci est parce que mon application est servi via le protocole file://. Que puis-je faire pour contourner cela?

Merci!

Répondre

5

En utilisant PhoneGap la page Web est ouvert en utilisant le fichier : // protocole

Avec fichier : // protocole pas d'origine est défini sur la connexion WebSocket, de sorte que le navigateur soulèvera cette exception de sécurité si la serveur ne définit pas le Access-Control-Allow-Origin en-tête à la réponse permettant CORS

certains plug-in Pensez à utiliser PhoneGap comme suit, qui utilise le code natif pour gérer la connexion, mais permet à un (je l'espère normalisation compatible) WebS API ocket dans la webviews

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

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

Ces plugins ne sont que les premiers je trouve, ne sais pas à quel point ils sont activement développé et stable

2

Donc, si le page Web ouverte avec le fichier: // protocole url dans PhoneGap était d'envoyer l'en-tête "Access-Control-Allow-Origin: *" - théoriquement tout devrait fonctionner avec socket.io?

(il est possible de le faire par NSURLProtocol, mais je ne voulais pas aller dans ce trou de lapin sans connaître le correctif)

19

Vous devez ajouter l'hôte socketio à la touche « ExternalHosts » dans PhoneGap. plist.

Voir Faq:

Q. Links to and imported files from external hosts don't load?

A. The latest code has the new white-list feature. If you are referencing external hosts, you will have to add the host in PhoneGap.plist under the "ExternalHosts" key. Wildcards are ok. So if you are connecting to " http://phonegap.com ", you have to add "phonegap.com" to the list (or use the wildcard "*.phonegap.com" which will match subdomains as well). (Note: If you open the plist file in Xcode, you won't need to fiddle with the XML syntax.)

pour Android vous devez éditer cordova.xml et ajouter l'accès à l'hôte socketio:

<access origin="HOST*"/> 

index.html (avec socketio exemple):

... 
<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 (côté serveur javascript/Exemple de socketio de base):

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); 
    }); 
}); 

L'hôte vous devez remplacer par le nom d'hôte de votre serveur socket.io!

+1

Est-ce seulement Android? Je construis pour iOS et n'ai pas de cordova.xml, seulement un cordova.plist. Avez-vous fait cela sur iOS? Merci! – fancy

+2

Oui (cordova.xml est uniquement android). Pour iOS, vous devez mettre l'HÔTE dans PhoneGap.plist (voir http: // stackoverflow.com/a/8972890/584545) –

+0

Ajout d'un hôte à la liste blanche ne fait rien pour régler l'orgin, qui est le problème. Shazron, ci-dessous (qui crée PhoneGap) a la bonne idée, je ne sais pas comment faire ça. – fancy