Socket.io在本地UIWebView中无法升级

我已经好几天没有运气了。 任何帮助非常感谢

我意识到这是一个节点问题和iOS问题之间的交叉 – 事先道歉。 我正在尝试使用UIWebView(不是phonegap)在本地iOS应用程序中显示使用HTML5 / JS的简单协作白板。 JS使用socket.io连接到一个Node.js服务器来进行实时的涂鸦。

在浏览器中运行HTML / JS,包括移动Safari浏览器,套接字工作的很好。 但是,当相同的代码在webView中本机运行时,它将连接到服务器,但不会完成升级过程,因此服务器会将连接降级到轮询。

行为与NGINX代理是否正在被使用(它们被正确转发)以及是否使用ws:或wss:相同。

这是一个问题,因为实时绘图创build了太多的传输请求,导致应用程序缓慢,绘图不良,以及socket.io库引发错误:

在“socket.io/socket.io.js 4720行”错误:调用了太多次之后。

我有一个NSURLProtocol的子类来捕获和查看socket.io请求。 我可以修改请求,使服务器开心,但我不知道要修改什么。 输出,显示request.URL.absoluteString,request.allHTTPHeaderFields和request.HTTPBody,以及响应。

z2015-02-13 03:36:07.424 DrawApp[2286:553479] ||--------------------------------------------------------------- 2015-02-13 03:36:07.426 DrawApp[2286:553479] Request URL: http://192.168.0.16:8081/socket.io/socket.io.js 2015-02-13 03:36:07.432 DrawApp[2286:553479] RequestHead: { Accept = "*/*"; Referer = "http://192.168.0.16:8081/mobilechat/16074204562:troy"; "User-Agent" = "Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466"; } 2015-02-13 03:36:07.434 DrawApp[2286:553479] RequestBody: (null) 2015-02-13 03:36:07.446 DrawApp[2286:553479] ---------------------------------------------------------------|| 2015-02-13 03:36:07.455 DrawApp[2286:553456] ||--------------------------------------------------------------- 2015-02-13 03:36:07.455 DrawApp[2286:553456] Request URL: http://192.168.0.16:8081/socket.io/socket.io.js 2015-02-13 03:36:07.456 DrawApp[2286:553456] RequestHead: { Accept = "*/*"; Referer = "http://192.168.0.16:8081/mobilechat/16074204562:tom"; "User-Agent" = "Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466"; } 2015-02-13 03:36:07.456 DrawApp[2286:553456] RequestBody: (null) 2015-02-13 03:36:07.457 DrawApp[2286:553456] ---------------------------------------------------------------|| 2015-02-13 03:36:07.457 DrawApp[2286:553456] ||--------------------------------------------------------------- 2015-02-13 03:36:07.458 DrawApp[2286:553456] Request URL: http://192.168.0.16:8081/socket.io/socket.io.js 2015-02-13 03:36:07.458 DrawApp[2286:553456] RequestHead: { Accept = "*/*"; Referer = "http://192.168.0.16:8081/mobilechat/16074204562:troy"; "User-Agent" = "Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466"; } 2015-02-13 03:36:07.459 DrawApp[2286:553456] RequestBody: (null) 2015-02-13 03:36:07.459 DrawApp[2286:553456] ---------------------------------------------------------------|| 2015-02-13 03:36:07.467 DrawApp[2286:553456] ||--------------------------------------------------------------- 2015-02-13 03:36:07.468 DrawApp[2286:553456] Request URL: http://192.168.0.16:8081/socket.io/socket.io.js 2015-02-13 03:36:07.468 DrawApp[2286:553456] RequestHead: { Accept = "*/*"; Referer = "http://192.168.0.16:8081/mobilechat/16074204562:tom"; "User-Agent" = "Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466"; } 2015-02-13 03:36:07.469 DrawApp[2286:553456] RequestBody: (null) 2015-02-13 03:36:07.469 DrawApp[2286:553456] ---------------------------------------------------------------|| 2015-02-13 03:36:07.482 DrawApp[2286:553483] Response: <NSHTTPURLResponse: 0x1463c1f0> { URL: http://192.168.0.16:8081/socket.io/socket.io.js } { status code: 200, headers { Connection = "keep-alive"; "Content-Type" = "application/javascript"; Date = "Fri, 13 Feb 2015 08:36:20 GMT"; Etag = "1.3.3"; "Transfer-Encoding" = Identity; } } 2015-02-13 03:36:07.674 DrawApp[2286:553479] ||--------------------------------------------------------------- 2015-02-13 03:36:07.675 DrawApp[2286:553479] Request URL: http://192.168.0.16:8081/socket.io/?EIO=3&transport=polling&t=1423816567670-0 2015-02-13 03:36:07.676 DrawApp[2286:553479] RequestHead: { Referer = "http://192.168.0.16:8081/mobilechat/16074204562:troy"; "User-Agent" = "Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466"; } 2015-02-13 03:36:07.677 DrawApp[2286:553479] RequestBody: (null) 2015-02-13 03:36:07.679 DrawApp[2286:553479] ---------------------------------------------------------------|| 2015-02-13 03:36:07.722 DrawApp[2286:553483] Response: <NSHTTPURLResponse: 0x1461c0c0> { URL: http://192.168.0.16:8081/socket.io/?EIO=3&transport=polling&t=1423816567670-0 } { status code: 200, headers { "Access-Control-Allow-Origin" = "*"; Connection = "keep-alive"; "Content-Length" = 101; "Content-Type" = "application/octet-stream"; Date = "Fri, 13 Feb 2015 08:36:20 GMT"; "Set-Cookie" = "io=T_ZsAMyrO8RGOe46AAAA"; } } 2015-02-13 03:36:08.150 DrawApp[2286:553479] ||--------------------------------------------------------------- 2015-02-13 03:36:08.151 DrawApp[2286:553479] Request URL: http://192.168.0.16:8081/socket.io/?EIO=3&transport=polling&t=1423816568146-1&sid=T_ZsAMyrO8RGOe46AAAA 2015-02-13 03:36:08.153 DrawApp[2286:553479] RequestHead: { Referer = "http://192.168.0.16:8081/mobilechat/16074204562:troy"; "User-Agent" = "Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466"; } 2015-02-13 03:36:08.155 DrawApp[2286:553479] RequestBody: (null) 2015-02-13 03:36:08.156 DrawApp[2286:553479] ---------------------------------------------------------------|| 2015-02-13 03:36:08.199 DrawApp[2286:553483] Response: <NSHTTPURLResponse: 0x146104b0> { URL: http://192.168.0.16:8081/socket.io/?EIO=3&transport=polling&t=1423816568146-1&sid=T_ZsAMyrO8RGOe46AAAA } { status code: 200, headers { "Access-Control-Allow-Origin" = "*"; Connection = "keep-alive"; "Content-Length" = 5; "Content-Type" = "application/octet-stream"; Date = "Fri, 13 Feb 2015 08:36:21 GMT"; "Set-Cookie" = "io=T_ZsAMyrO8RGOe46AAAA"; } } 2015-02-13 03:36:08.494 DrawApp[2286:553479] ||--------------------------------------------------------------- 2015-02-13 03:36:08.495 DrawApp[2286:553479] Request URL: http://192.168.0.16:8081/socket.io/?EIO=3&transport=polling&t=1423816568491-2&sid=T_ZsAMyrO8RGOe46AAAA 2015-02-13 03:36:08.496 DrawApp[2286:553479] RequestHead: { Referer = "http://192.168.0.16:8081/mobilechat/16074204562:troy"; "User-Agent" = "Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466"; } 2015-02-13 03:36:08.497 DrawApp[2286:553479] RequestBody: (null) 2015-02-13 03:36:08.498 DrawApp[2286:553479] ---------------------------------------------------------------|| 

相应的DEBUGlogin节点显示:

  engine intercepting request for path "/socket.io/" +0ms engine handling "GET" http request "/socket.io/?EIO=3&transport=polling&t=1423 816567670-0" +3ms engine handshaking client "T_ZsAMyrO8RGOe46AAAA" +5ms engine:socket sending packet "open" ({"sid":"T_ZsAMyrO8RGOe46AAAA","upgrades": ["websocket"],"pingInterval":25000,"pingTimeout":60000}) +3ms engine:polling setting request +4ms engine:socket flushing buffer to transport +2ms engine:polling writing " ?0{"sid":"T_ZsAMyrO8RGOe46AAAA","upgrades":["web socket"],"pingInterval":25000,"pingTimeout":60000}" +5ms engine:socket executing batch send callback +4ms ----------------- Log From io.use(function(socket, next){}): { host: '192.168.0.16:8081', referer: 'http://192.168.0.16:8081/mobilechat/12024804552:troy', 'accept-encoding': 'gzip, deflate', accept: '*/*', cookie: '_ga=GA1.1.2050046519.1423642387; _gat=1; connect.sid=s%3AjmTKnmpC10Vv PPRYBQBEabJtrrdQtqrZ.nz%2FlScJuQwV3JjSk9IWhVkTbYpxb8xkxqs%2FJXgjuJJw', 'accept-language': 'en-us', connection: 'keep-alive', 'user-agent': 'Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600. 1.4 (KHTML, like Gecko) Mobile/12B466' } ----------------- engine:socket sending packet "message" (0) +21ms engine intercepting request for path "/socket.io/" +444ms engine handling "GET" http request "/socket.io/?EIO=3&transport=polling&t=1423 816568146-1&sid=T_ZsAMyrO8RGOe46AAAA" +2ms engine setting new request for existing client +4ms engine:polling setting request +2ms engine:socket flushing buffer to transport +2ms engine:polling writing " ☻?40" +2ms engine:socket executing batch send callback +3ms engine upgrading existing transport +39ms engine:socket might upgrade socket transport from "polling" to "websocket" +2m s ----------------- Logged From: server.addListener('upgrade', function(req, socket, head){}): HEADER: { upgrade: 'websocket', connection: 'Upgrade', host: '192.168.0.16:8081', origin: 'http://192.168.0.16:8081', cookie: 'io=T_ZsAMyrO8RGOe46AAAA; _ga=GA1.1.2050046519.1423642387; _gat=1; con nect.sid=s%3AjmTKnmpC10VvPPRYBQBEabJtrrdQtqrZ.nz%2FlScJuQwV3JjSk9IWhVkTbYpxb8xkx qs%2FJXgjuJJw', pragma: 'no-cache', 'cache-control': 'no-cache', 'sec-websocket-key': 'My1vb8kKk82RVibaOvpNEw==', 'sec-websocket-version': '13', 'sec-websocket-extensions': 'x-webkit-deflate-frame', 'user-agent': 'Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600. 1.4 (KHTML, like Gecko) Mobile/12B466' } URL: /socket.io/?EIO=3&transport=websocket&sid=T_ZsAMyrO8RGOe46AAAA ----------------- engine intercepting request for path "/socket.io/" +274ms engine handling "GET" http request "/socket.io/?EIO=3&transport=polling&t=1423 816568491-2&sid=T_ZsAMyrO8RGOe46AAAA" +1ms engine setting new request for existing client +4ms engine:polling setting request +2ms engine:socket client did not complete upgrade - closing transport +10s Disconnect type is: XHR 

注意到最后我们得到:

客户没有完成升级 – closures运输。

并断开连接,我们validation:

断开types是:XHR

对不起,对日志转储,但我真的不知道什么是相关的那些谁比我更了解这一点。

干杯