LINUX.ORG.RU

Websocket'ы на ios

 , ,


0

2

Привет. На android всё норм, на десктопе аналогично, а на iphone как-то странно, через попу,браузер (safari) не хочет создавать сокет с сервером, делает это через раз (даже хуже). js такой:

function connectWs() {
   const ws = new WebSocket("ws://" + location.host + "/ws");

   ws.onmessage = function (event) {
      const msg = event.data;

      const cmd = msg[0];
      const value = msg.slice(1);

      switch (cmd) {
      case '0':
         {
            const el = document.getElementById("counter0_value");
            if (el)
            el.textContent = value;
            break;
         }
      case '1':
         {
            const el = document.getElementById("counter1");
            if (el)
            el.textContent = value;
            break;
         }
      case '2':
         location.reload();
         break;
      case '3':
         console.log("ping");
         break;
      }
   };

    ws.onclose = () => {
        setTimeout(connectWs, 500);
    };
}

connectWs();

Сервер должен держать постоянный ws канал, обновлять счетчики на странице, перезагружать страницу. Пытался сделать app level ping (case 3) - без толку, отсылал нормальный пинг (который js не видит) вплоть до с 1 сек таймаутом.

Я вообще не вкурсе что там за айфоноспецифичные штучки такие, и js человек новый, мне нужно быстро накостылить рабочую версию на всех устройствах, а не только на андройдах. Объясните, пожалуйста, что это за хрень и как побороть.

PS: проблемы с сетью можно отсечь, клиенты-сервер в тестах в одной локалке



Последнее исправление: kvpfs_2 (всего исправлений: 1)

Странно, проблема наблюдается только на одном айфоне. Взял другой, на нем все норм. Даже после вкл/выкл браузер восстанавливает ws сокет.

Если есть какие идеи, что это может быть - почему даже среди на одной платформе/браузере разное поведение, и могу ли я что-то сделать в js, будет полезно. Ну может надо смотреть ошибку после new WebSocket, и тупо долбить в цикле?

kvpfs_2
() автор топика
Ответ на: комментарий от vbr

Логировать на телефоне? Ну да, хороший план. Хотя, наверное, как-то должно быть можно.

На десктопе я вся отладил. А js код полный, что мне ещё показать? html разметку с элемнтами «counter0_value» и «counter1»? Это не важно. Сервер ошибок не выдаёт

kvpfs_2
() автор топика
Ответ на: комментарий от kvpfs_2

Можно сделать HTML элемент, в который будешь дописывать текст своих сообщений.

Логгировать в него все события сокета.

Плюс обернуть все операции в try-catch и логгировать ошибки тоже.

KivApple ★★★★★
()
Ответ на: комментарий от kvpfs_2

Логировать на телефоне? Ну да, хороший план. Хотя, наверное, как-то должно быть можно.

Конечно можно. Ты же не думаешь, что серьёзные разработчики отлаживают мобильные сайты на авось. Подключаешь айфон к маку, там натыкиваешь куда-то, и тебе на десктопе вытаскивает привычные тулзы с консолью и прочим.

Но даже если ты не хочешь настраивать developer tools, ты можешь просто создавать div и туда писать ошибки и прочие логи.

vbr ★★★★★
()

Это яблочные проблемы, ios + safari - забагованный шлак. Здесь обсуждают подобную проблему, и у нас всех ios 26.2. Оттуда

I've solved it now.
It turned out to be the same issue that u/niblenible already mentioned and it also applies for local IPs.
Safari fails to connect to websockets when an IP address is used.

My websocket-URL was:
ws://192.168.1.5:8080/websocket

After setting up a local DNS record in my PiHole (mapping 192.168.1.5 -> myapp) and using the DNS name instead, everything works as expected:
ws://myapp:8080/websocket 

В общем, если ws коннектится ip адресом хоста, то начинаются странные эффекты. По идее, запись в dns сервер роутера должна помочь

kvpfs_2
() автор топика
Последнее исправление: kvpfs_2 (всего исправлений: 1)

Сделал запись в dns сервер роутера, сокет открываю по имени const ws = new WebSocket("ws://my_desktop/ws"); баг пропал. В общем всё как на реддите - кривые яблоки.

kvpfs_2
() автор топика
Ответ на: комментарий от kvpfs_2

Это может быть связано с тем что они пытаются бороться со сканированием локальной сети из веб приложений и фингерпринтингом юзеров через локальные подключения

cobold ★★★★★
()
Ответ на: комментарий от cobold

Не знаю чего они там делают, но я вижу баг. Я говорю делать коннет, а оно просто игнорит молча, буд-то бы всё ок. Если яблоадепты там так сильно двинуты на «безопасности», то нужно показывать какое-то окно с confirmation, мол так и так, разрешить ли? А так из-за этих умников я пропердолился сегодня весь день

kvpfs_2
() автор топика