Question WebSockets sur iOS


J'ai lu que WebSockets fonctionne sur iOS 4.2 et supérieur. Et je peux vérifier qu'il y a bien un objet WebSocket. Mais je ne peux pas trouver un exemple WebSocket unique qui fonctionne sur le téléphone.

Par exemple http://yaws.hyber.org/websockets_example.yaws va planter l'application Mobile Safari. Est-ce que quelqu'un a réussi à faire fonctionner WebSockets sur le téléphone?


17
2018-04-07 00:00


origine


Réponses:


J'ai peut-être trouvé la solution. Mobile Safari se bloque uniquement avec les Websockets lorsque vous avez configuré un proxy via le wifi.


11
2018-04-07 17:12



Il est pris en charge, mais gardez à l'esprit qu'en ce qui concerne le standard utilisé par le navigateur iOS Safari, il ne s'agit pas de la RFC 6455, mais de HyBi-00 / Hixie-76.

Vous pouvez également tester en utilisant ce navigateur: http://websocketstest.com/

Aussi bien vérifier ce post génial qui a le plus d'informations sur les versions: https://stackoverflow.com/a/2700609/1312722


OBS!, c'est une vieille réponse. J'ai vérifié à travers la page Web mentionnée dans ce post combinée avec browserstack.com:

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

Tout en utilisant RFC 6455


6
2018-05-02 10:27



J'ai eu un problème similaire et j'ai même regardé ce post pour trouver une solution. Pour moi, cela n'avait rien à voir avec une connexion wifi. Il semble y avoir un bogue dans l'implémentation iOS des websockets (même jusqu'à la version actuelle 5.1). En activant une partie du débogage de XCode, j'ai constaté que cela avait quelque chose à voir avec la gestion de la mémoire, car j'obtiendrais quelque chose du type "message envoyé à une instance libérée". Il y avait très probablement un objet qui n'avait pas le compte de référence correct et qui a été nettoyé beaucoup trop tôt.

Ce blog contient de nombreuses informations sur les symptômes du problème et sur la façon de le déboguer, mais n’a pas de solution de contournement: http://dalelane.co.uk/blog/?p=1652

Finalement, j'ai trouvé cette solution de contournement, et mon application a presque complètement cessé de planter maintenant.

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
2018-06-04 15:23



Je les ai fait travailler sur Chrome et Safari, iPhone et iPad (et sur d'autres appareils mobiles également, mais je suppose que cela ne vous dérange pas). Voici le code Javascript que j'utilise:

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

L'envoi de données du client vers le serveur est terminé en appelant la fonction doSend (). La réception de données à partir du serveur fonctionne également, je l'ai testé à partir d'un serveur C ++ personnalisé.


2
2018-01-31 18:35



Voici un exemple de travail

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>

Serveur Web Socket

La création de votre propre serveur de socket est également simple Installez simplement le Node.js et socket.io puis installez le socket Web via 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

enregistrer le fichier ci-dessus en tant que .js et l'exécuter comme node filename.js depuis le terminal ou l'invite de commande

NodeJS

Le fichier ci-dessus est comme si nous avions d'abord créé un serveur http en utilisant node alors nous passons l'instance de serveur http créée à Websocketserver puis à l'instance Socket.iO


1
2018-05-10 07:06



Je déboguais un problème similaire et j'ai constaté que si vous utilisiez https pour obtenir la page Web, iOS intercepterait si vous utilisiez le protocole "ws:" dans WebSocket. Si vous utilisez "wss:" tout fonctionnera et il n'y aura pas de pièges.


1
2017-12-14 01:03