iOS上的WebSockets

我读过,WebSockets在iOS 4.2及更高版本上工作。 我可以validation确实有一个WebSocket对象。 但是我找不到一个能在手机上工作的WebSocket例子。

例如http://yaws.hyber.org/websockets_example.yaws会使Mobile Safari应用程序崩溃。 有没有人有WebSockets在电话上成功工作?

我可能find了解决办法。 移动Safari浏览器只有通过wifi设置代理时才会崩溃。

关于iOS Safari浏览器实现的标准支持,但请注意,不是RFC 6455,而是HyBi-00 / Hixie-76。

你可以使用这个浏览器来testing: http : //websocketstest.com/

以及检查这个伟大的职位,有关于版本的大部分信息: https : //stackoverflow.com/a/2700609/1312722


OBS! ,这是一个古老的答案。 我已经通过这个post中提到的网页与browserstack.com结合:

  • iPhone4S的
  • iphone 5
  • iPhone 5S
  • iPhone 6
  • iPhone6 Plus
  • iPhone6S
  • iPhone6S Plus

全部使用RFC 6455

我有一个类似的问题,甚至期待这个职位find一个修复它。 对我来说,这与无线连接无关。 这似乎是在iOS实施的websockets(甚至到目前的版本5.1)的错误。 打开一堆XCode的debugging,我发现它与内存pipe理有关,因为我会沿着“发送到解除分配的实例的消息”的方式得到一些东西。 最有可能的是有一个对象没有正确的引用计数,并被过早清理。

这个博客有关于这个问题的症状以及如何debugging的很多很好的信息,但没有一个解决方法: http : //dalelane.co.uk/blog/? p= 1652

最终,我发现这个解决方法,我的应用程序几乎完全停止崩溃了。

 me = this // strange javascript convention this.socket = new WebSocket(url); // put onmessage function in setTimeout to get around ios websocket crash this.socket.onmessage = function(evt) { setTimeout(function() {me.onMessageHandler(evt);}, 0); }; 

我让他们在Chrome和Safari,iPhone和iPad(以及其他移动设备,但我想你不介意他们)工作。 这里是我使用的Javascript代码:

 <script language="javascript" type="text/javascript"> var wsUri = document.URL.replace("http", "ws"); var output; var websocket; function init() { output = document.getElementById("output"); wsConnect(); } function wsConnect() { console.log("Trying connection to " + wsUri); try { output = document.getElementById("output"); websocket = new WebSocket(wsUri); websocket.onopen = function(evt) { onOpen(evt) }; websocket.onclose = function(evt) { onClose(evt) }; websocket.onmessage = function(evt) { onMessage(evt) }; websocket.onerror = function(evt) { onError(evt) }; } catch (e) { console.log("Exception " + e.toString()); } } function onOpen(evt) { alert("Connected to " + wsUri); } function onClose(evt) { alert("Disconnected"); } function onMessage(evt) { alert('Received message : ' + evt.data); } function onError(evt) { alert("Error : " + evt.toString()); } function doSend(message) { websocket.send(message); } window.addEventListener("load", init, false); 

发送数据从客户端到服务器完成调用doSend()函数。 从服务器接收数据也起作用,我已经从一个自定义的C ++服务器进行了testing。

这是一个工作示例

Web套接字客户端

 <!DOCTYPE html> <meta charset="utf-8" /> <head> <title>WebSocket Test</title> <script language="javascript" type="text/javascript"> var websocket; function OpenWebSocket() { try { websocket = new WebSocket(document.getElementById("wsURL").value); websocket.onopen = function(evt) { onOpen(evt) }; websocket.onclose = function(evt) { onClose(evt) }; websocket.onmessage = function(evt) { onMessage(evt) }; websocket.onerror = function(evt) { onError(evt) }; } catch(err) { writeToScreen(err.message); } } function CloseWebSocket() { websocket.close(); } function FindWebSocketStatus() { try { if (websocket.readyState == 1){ writeToScreen("Websocket connection is in open state") } else if (websocket.readyState == 0){ writeToScreen("Websocket connection is in connecting state") } else{ writeToScreen("Websocket connection is in close state") } } catch(err) { writeToScreen(err.message); } } function FindWebSocketBufferedAmount(){ try { writeToScreen(websocket.bufferedAmount) } catch(err) { writeToScreen(err.message); } } function SendMessageThroughSocket(){ doSend(document.getElementById("wsMessage").value); } function onOpen(evt) { writeToScreen("Socket Connection Opened"); } function onClose(evt) { writeToScreen("Socket Connection Closed"); } function onMessage(evt) { writeToScreen('<span style="color: blue;">SERVER RESPONSE: ' + evt.data+'</span>'); } function onError(evt) { writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data); } function doSend(message) { try{ writeToScreen("CLIENT SENT: " + message); websocket.send(message); } catch(err) { writeToScreen(err.message); } } function writeToScreen(message) { var output = document.getElementById("output"); var pre = document.createElement("p"); pre.style.wordWrap = "break-word"; pre.innerHTML = message; output.appendChild(pre); } </script> </title> </head> <body> <table> <tr> <td> WebSocket URL </td> <td> <input type="text" id="wsURL" value="ws://echo.websocket.org/"/> </td> </tr> <tr> <td> WebSocket Message </td> <td> <input type="text" id="wsMessage" value="Hi"/> </td> </tr> <tr> <td colspan="2" style="text-align:left;"> <input type="button" value="Open Socket Connection" onclick="OpenWebSocket();"/> </td> </tr> <tr> <td colspan="2" style="text-align:left;"> <input type="button" value="Send Message" onclick="SendMessageThroughSocket();"/> </td> </tr> <tr> <td colspan="2" style="text-align:left;"> <input type="button" value="Close Socket Connection" onclick="CloseWebSocket();"/> </td> </tr> <tr> <td colspan="2" style="text-align:left;"> <input type="button" value="Find Socket Status" onclick="FindWebSocketStatus();"/> </td> </tr> <tr> <td colspan="2" style="text-align:left;"> <input type="button" value="Find Socket Buffered Amount" onclick="FindWebSocketBufferedAmount();"/> </td> </tr> </table> <div id="output"></div> </body> </html> 

Web Socket服务器

创build自己的套接字服务器也很简单只需安装Node.jssocket.io,然后继续通过npm安装web套接字

 #!/usr/bin/env node var WebSocketServer = require('websocket').server; var http = require('http'); var server = http.createServer(function(request, response) { console.log((new Date()) + ' Received request for ' + request.url); response.writeHead(404); response.end(); }); server.listen(8888, function() { console.log((new Date()) + ' Server is listening on port 8888'); }); wsServer = new WebSocketServer({ httpServer: server, // You should not use autoAcceptConnections for production // applications, as it defeats all standard cross-origin protection // facilities built into the protocol and the browser. You should // *always* verify the connection's origin and decide whether or not // to accept it. autoAcceptConnections: false }); function originIsAllowed(origin) { // put logic here to detect whether the specified origin is allowed. return true; } wsServer.on('request', function(request) { if (!originIsAllowed(request.origin)) { // Make sure we only accept requests from an allowed origin request.reject(); console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.'); return; } var connection = request.accept(); console.log((new Date()) + ' Connection accepted.'); connection.on('message', function(message) { if (message.type === 'utf8') { console.log('Received Message: ' + message.utf8Data); connection.sendUTF('Message received at server:'+message.utf8Data); } else if (message.type === 'binary') { console.log('Received Binary Message of ' + message.binaryData.length + ' bytes'); connection.sendBytes(message.binaryData); } }); connection.on('close', function(reasonCode, description) { console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.'); }); }); 

查找器中的NodeJS文件夹

将上述文件保存为.js,并从terminal或命令提示符运行,如节点filename.js

的NodeJS

上面的文件就像我们先使用节点创build了一个http服务器,然后我们将创build的http服务器实例传递给Websocketserver,然后传递给Socket.iO实例

我正在debugging类似的问题,发现如果你使用https来获取网页,iOS会陷入,如果你使用传递“ws:”协议到WebSocket。 如果你使用“wss:”一切都会起作用,并且不会有陷阱。