Konteks
Sebuah game dikirimkan sebagai aplikasi web progresif yang memiliki penghitung waktu ( setTimeout
, setInterval
) dan websocket untuk mendapatkan komunikasi waktu nyata.
Apa yang terjadi
Semuanya baik-baik saja selama pengguna tetap di aplikasi. Tetapi ketika pengguna pergi ke tab lain, atau aplikasi lain atau mematikan layar (jika ponsel), itu menjadi "dunia tidak dikenal yang jahat".
- Soket web mungkin atau mungkin tidak menjadi "dijeda" atau "dimatikan"
- Pengatur waktu terlihat seperti dicekik atau dilemahkan.
Perilaku ini tampaknya tergantung pada browser dan platform dan, mungkin, bahkan tergantung pada perilaku pengguna tertentu. Saya kira browser dan OS memiliki siklus / mekanisme sendiri untuk menghemat baterai dan / atau komputasi.
Ketika pengguna kembali, aplikasi berada dalam kondisi yang tidak diketahui dan saya berjuang untuk memulihkan keadaan dengan benar.
Mengenai websockets saya memiliki koneksi ulang otomatis dengan socket.io dan menghubungkan kembali-websocket tetapi tidak cukup untuk menyelesaikan semuanya.
Mencari jawaban
- Apa "siklus hidup" dari berbagai browser tentang ini? Apakah ini didokumentasikan? Kapan mereka memutuskan untuk mematikan dan mencekik?
- Apa yang mereka lakukan persis ke soket web? Browser baru saja memutusnya?
- Apa yang mereka lakukan tepat pada timer? Mereka mencekik mereka atau melonggarkan mereka atau sesuatu yang lain?
- Apa yang terjadi pada eksekusi javascript secara umum? Dijeda / dihancurkan / dicekik?
- Apakah ada cara untuk menghubungkan ke beberapa jenis siklus hidup browser saat itu akan mematikan segalanya? Satu-satunya hal yang bisa saya temukan adalah API visibilitas
Apakah ada cara untuk mereproduksi perilaku ini secara artifisial untuk dapat menguji solusi? Ini sangat sulit di desktop. Soket web tidak dapat dimatikan dan pengembang kromium tampaknya tidak terburu-buru untuk membantu masalah mulai 2014 (!): Soket web tidak disertakan saat menggunakan penghambat koneksi
Terlepas dari hal di atas, apakah ada solusi lintas-browser pragmatis untuk mendeteksi / menyelesaikan masalah ini? (misalnya dari pengalaman, Firefox di desktop tampaknya berperilaku sangat berbeda dibandingkan dengan Chrome, dan iPhone akan terputus jauh lebih sering daripada Android)
tautan yang berhubungan