Aparente comportamiento de locking en JavaScript websocket en Safari mobile

Me encontré con un rascador de cabeza real, y esperaba que alguien fuera pudiera arrojar algo de luz sobre mi problema.

La aplicación que estoy escribiendo es un cliente basado en JS para lo que esencialmente es un service de escritorio compartido. El service captura imágenes desde el escritorio, las codifica como jpegs codificadas en base64 y las envía a través de un websocket al cliente JS. Luego, el cliente muestra estas imágenes (como URI de datos), los usuarios pueden mover el mouse sobre la image y hacer clic en la image, estos events del mouse se codifican como commands en XML que se ponen en una queue y se mantienen en un timer cada 15 ms , de esta manera la queue puede ser eliminada de commands networkingundantes o duplicates antes de enviarse al service. Estos commands se ejecutan (generan events de clic en el escritorio, mover el mouse, etc.) y se generan nuevas imágenes de escritorio y el ciclo continúa.

Todo el sistema funciona muy bien, a exception de algunos comportamientos muy incoherentes en Safari en el iPad. Esencialmente, cuando el usuario mueve su dedo alnetworkingedor de la pantalla, el cliente parece bloquear (o posiblemente desasignar) los posts entrantes en el websocket, a favor de solo enviar posts salientes. La forma en que esto se manifiesta es que a medida que mueve el dedo, la pantalla no parece actualizarse mientras esté tocando la pantalla, entonces una vez que levanta el dedo, onMessage () recibirá una avalancha de actualizaciones de image, que luego se anima a la pantalla en rápida sucesión.

Mobile Safari es el único browser que parece comportarse de esta manera, ninguno de los browseres de escritorio o cualquiera de las tabletas Android que probé parecen mostrar el mismo comportamiento.

Puse el logging en los methods entrantes y salientes en el websocket, y confirma el comportamiento que he visto. En Safari, obtendré numerosos posts salientes seguidos, seguidos de numerosos posts entrantes, mientras que en Android veré los posts entrantes y salientes intercalados al arrastrar el dedo por la pantalla, como resultado, la pantalla en Android continuará actualizando a medida que arrastras el dedo.

La razón principal por la que sospecho que el websocket es el culpable se debe a que el cliente tiene un mecanismo alternativo, de modo que si un browser no tiene soporte websocket, se crean dos objects XHR (uno para input y otro para salida) y se utiliza en su lugar de la websocket. Si presiono Safari mobile para usar XHR en lugar de websockets, el problema desaparece. En este caso, solo el mecanismo de comunicación cambia (todo el código para capturar events de input y mostrar imágenes permanece igual).

Me doy count de que se trata de un problema muy específico, y sin código será muy difícil de diagnosticar, pero opté por no publicar código simplemente por el volumen de código en el cliente.

Si alguien ha visto un comportamiento similar a lo que he descrito, o si conoce algún posible motivo de este comportamiento, estaría muy agradecido por su contribución.

Dependiendo del tamaño de los packages, podría enfrentar el problema de los posts "grandes", siendo extremadamente lento en Safari (tanto en el iPad como en el escritorio). ¿Has probado Safari de escritorio?

Eche un vistazo a esta página para ver comparaciones de performance entre diferentes browseres.

Podría ser que este es tu problema.