it-swarm.com.de

WebSockets unter iOS

Ich habe gelesen, dass WebSockets auf iOS 4.2 und höher funktionieren. Und ich kann überprüfen, ob es tatsächlich ein WebSocket-Objekt gibt. Ich kann jedoch kein einziges funktionierendes WebSocket-Beispiel für das Telefon finden. 

Zum Beispiel http://yaws.hyber.org/websockets_example.yaws stürzt die Mobile Safari App ab. Hat jemand WebSockets erfolgreich am Telefon?

17
probablyCorey

Ich habe vielleicht die Lösung gefunden. Mobile Safari stürzt nur mit Websockets ab, wenn Sie einen Proxy über WLAN eingerichtet haben.

11
probablyCorey

Es wird unterstützt, beachten Sie jedoch den Standard, den der iOS Safari-Browser implementiert. Es handelt sich nicht um RFC 6455, sondern um HyBi-00/Hixie-76.

Sie können auch mit diesem Browser testen: http://websocketstest.com/

Überprüfen Sie auch diesen tollen Beitrag, der die meisten Informationen zu den Versionen enthält: https://stackoverflow.com/a/2700609/1312722


OBS! , das ist eine alte Antwort. Ich habe die in diesem Beitrag erwähnte Webseite in Verbindung mit browserstack.com überprüft:

  • iPhone 4s
  • iPhone 5
  • iPhone 5s
  • iPhone 6
  • iPhone6 ​​Plus
  • iPhone6S
  • iPhone6S Plus

Alle mit RFC 6455

6
moka

Ich hatte ein ähnliches Problem und habe sogar in diesem Beitrag nach einer Lösung gesucht. Für mich hatte es nichts mit WLAN zu tun. Es scheint ein Fehler in der iOS-Implementierung von Websockets zu sein (sogar bis zur aktuellen Version 5.1). Beim Einschalten eines ganzen Satzes von XCodes Debugging habe ich festgestellt, dass es etwas mit der Speicherverwaltung zu tun hat, da ich etwas wie "Nachricht an eine freigegebene Instanz" erhalten würde. Höchstwahrscheinlich gab es ein Objekt, das nicht die korrekte Referenzanzahl hatte und zu früh aufgeräumt wurde.

Dieses Blog enthält viele großartige Informationen zu den Symptomen des Problems und zum Debuggen, hat jedoch keine Problemumgehung: http://dalelane.co.uk/blog/?p=1652

Schließlich fand ich diese Problemumgehung, und meine App ist jetzt fast vollständig zum Absturz gekommen.

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); };
3
Matthew Levine

Ich habe sie für Chrome und Safari, iPhone und iPad (und auch für andere mobile Geräte, aber ich denke, Sie haben nichts dagegen). Hier ist der von mir verwendete Javascript-Code:

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

Das Senden von Daten vom Client an den Server erfolgt mit dem Aufruf der doSend () - Funktion. Das Empfangen von Daten vom Server funktioniert auch, ich habe sie von einem benutzerdefinierten C++ - Server aus getestet.

Ich debattierte ein ähnliches Problem und stellte fest, dass iOS, wenn Sie https verwendet haben, um die Webseite abzurufen, eine Trap-Funktion hat, wenn Sie das Protokoll "ws:" in WebSocket verwenden. Wenn Sie "wss:" verwenden, funktioniert alles und es werden keine Fallen angezeigt.

1
Justin Bullard

Hier ist eine Arbeitsprobe

Web-Socket-Client

<!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 Server

Das Erstellen eines eigenen Socket-Servers ist ebenfalls einfach. Installieren Sie die Datei Node.js und socket.io und installieren Sie dann den Web-Socket über npm .

#!/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 folder in Finder

speichern Sie die obige Datei als .js und führen Sie sie wie node filename.js vom Terminal oder der Eingabeaufforderung aus

 NodeJS

Die obige Datei ist so, als hätten wir zuerst einen http-Server mit Knoten erstellt, dann übergeben wir die erstellte http-Serverinstanz an Websocketserver und anschließend an die Socket.iO-Instanz

1
Durai Amuthan.H