iphone - tipografía - WebSockets en iOS
san francisco type download (6)
He leído que WebSockets funciona en iOS 4.2 y superior. Y puedo verificar que efectivamente existe un objeto WebSocket. Pero no puedo encontrar un solo ejemplo de WebSocket que funcione en el teléfono.
Por ejemplo, http://yaws.hyber.org/websockets_example.yaws bloqueará la aplicación Mobile Safari. ¿Alguien ha conseguido que WebSockets funcione correctamente en el teléfono?
Aquí hay una muestra de trabajo.
Cliente web socket
<!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>
Servidor web socket
Crear su propio servidor de socket también es simple. Simplemente instale Node.js y socket.io y luego proceda a instalar el socket web a través de 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.'');
});
});
guarde el archivo anterior como .js y ejecútelo como node filename.js desde el terminal o el símbolo del sistema
El archivo anterior es como hemos creado primero un servidor http usando un nodo, luego pasamos la instancia del servidor http creado a Websocketserver y luego a la instancia Socket.iO
Es compatible, pero tenga en cuenta el estándar que implementa el navegador iOS Safari, no es RFC 6455, sino HyBi-00 / Hixie-76.
También puede probar utilizando este navegador: http://websocketstest.com/
También revise esta excelente publicación que tiene la mayor parte de la información sobre las versiones: https://.com/a/2700609/1312722
¡OBS! , esta es una vieja respuesta. He revisado la página web mencionada en esta publicación combinada con browserstack.com:
- iphone 4s
- iphone 5
- iphone 5s
- iphone 6
- iPhone6 Plus
- iPhone6S
- iPhone6S Plus
Todos utilizando RFC 6455
Estaba depurando un problema similar y descubrí que si ha usado https para obtener la página web, iOS quedará atrapado si usa el protocolo "ws:" en WebSocket. Si usas "wss:" todo funcionará y no habrá trampas.
Los hice trabajar en Chrome y Safari, iPhone y iPad (y otros dispositivos móviles también, pero supongo que no te importan). Aquí está el código Javascript que estoy usando:
<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);
El envío de datos del cliente al servidor se realiza llamando a la función doSend (). La recepción de datos del servidor también funciona, lo he probado desde un servidor C ++ personalizado.
Puede que haya encontrado la solución. Mobile Safari solo se bloquea con websockets cuando ha configurado un proxy a través de wifi.
Tuve un problema similar e incluso busqué en esta publicación para encontrar una solución. Para mí, no tenía nada que ver con estar en una conexión wifi. Parece ser un error en la implementación de iOS de websockets (incluso hasta la versión actual 5.1). Encendiendo un montón de depuración de XCode, descubrí que tiene algo que ver con la administración de la memoria porque obtendría algo en la línea de "mensaje enviado a una instancia desasignada". Lo más probable es que hubiera un objeto que no tuviera el recuento de referencias correcto y que se haya limpiado demasiado pronto.
Este blog tiene mucha información sobre los síntomas del problema y cómo solucionarlo, pero no tiene una solución alternativa: http://dalelane.co.uk/blog/?p=1652
Sin embargo, al final encontré esta solución y mi aplicación ha dejado de bloquearse casi por completo ahora.
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); };