2012-05-24 12 views
21

Quando provo ad usare Socket.io con PhoneGap ottengo questo errore:Socket.io + PhoneGap

(su iOS in cui socket.io dovrebbe essere sostenuta)

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

Questo perché la mia app è servito tramite il protocollo file://. Cosa posso fare per aggirare questo?

Grazie !!

risposta

5

Utilizzando PhoneGap la pagina web viene aperta utilizzando il file : // protocollo

Con file: // protocollo n origine è impostata la connessione WebSocket, quindi il browser sollevare tale eccezione di sicurezza se il Server non imposta il intestazione Access-Control-Allow-Origin per la risposta consentendo CORS

considerare l'utilizzo di alcuni plug-in PhoneGap come la seguente, che utilizza codice nativo per gestire la connessione, ma consente a un (si spera standard- compatibile) WebS ocket API all'interno del visualizzazioni

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

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

questi plugin sono solo i primi che ho trovato, non so quanto sono sviluppati in modo attivo e stabile

2

Quindi, se il la pagina web aperta con il file: // url protocollo in PhoneGap era di inviare l'intestazione "Access-Control-Allow-Origin: *" - teoricamente dovrebbe funzionare tutto con socket.io?

(è possibile farlo attraverso NSURLProtocol, ma non ho voglia di andare su questa tana del coniglio senza conoscere la correzione)

19

Si deve aggiungere l'host socketio al tasto "ExternalHosts" in PhoneGap. plist.

Vedi 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.)

per Android si deve modificare cordova.xml e aggiungere l'accesso all'host socketio:

<access origin="HOST*"/> 

index.html (con socketio esempio):

... 
<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 (lato server JavaScript/esempio di base 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); 
    }); 
}); 

L'HOST è necessario sostituire con il nome host del server socket.io!

+1

È solo Android? Sto costruendo per iOS e non ho un cordova.xml, solo un cordova.plist. Hai fatto questo su iOS? Grazie! – fancy

+2

Sì (cordova.xml è solo Android). Per iOS devi inserire l'HOST in PhoneGap.plist (vedi http: // StackOverflow.it/a/8972890/584545) –

+0

L'aggiunta di un host alla lista bianca non ha nulla per quanto riguarda l'impostazione dell'origin, che è il problema. Shazron, di seguito (chi crea PhoneGap) ha l'idea giusta, io proprio non so come farlo. – fancy