Memastikan Chat Kekal Aktif Apabila Telefon Tidur
Ejen Mythex boleh bekerja selama beberapa minit untuk satu permintaan, dan anda mungkin sedang memerhati daripada telefon — yang dikunci, bertukar apl dan menukar rangkaian semasa ia bekerja. Dua pepijat menyebabkan perkara itu tersasar. Dalam satu, chat menganggap setiap isyarat “halaman kelihatan semula” sebagai bukti bahawa sambungannya telah mati, lalu berulang sehingga tersekat pada “Menyambung…”. Dalam yang lain, telefon yang tidur semasa balasan pertama chat baharu kembali dengan hanya beberapa keping pertama balasan itu, sehingga muat semula secara manual. Kedua-duanya telah dibetulkan.
Bagaimana chat mengikuti giliran yang sedang berjalan
Semasa ejen bekerja, chat mengekalkan strim terbuka daripada pelayan kami: setiap langkah — satu pemikiran, satu panggilan alat, sekeping balasan — tiba sebagai peristiwa. Jika strim terputus, chat menyambung semula dan pelayan memainkan semula peristiwa terkini daripada penimbal yang menyimpan 120 saat terakhir. Apabila giliran tamat, chat juga meminta pelayan untuk sejarah tersimpan dan mendamaikan apa yang dipaparkannya dengan apa yang disimpan. Langkah terakhir itu menangkap apa-apa yang terlepas oleh strim.
Untuk membezakan sambungan hidup daripada yang mati ketika tiada apa yang berlaku, pelayan menghantar “ping” kecil setiap 15 saat.
Pepijat 1: bangun menamatkan strim yang sihat
Pelayar memberitahu halaman apabila ia kembali kelihatan: selepas bertukar tab, selepas skrin dibuka kunci. Kami menggunakannya sebagai isyarat untuk menyemak sambungan — dan dalam amalan, untuk menamatkan strim dan menyambung semula, dengan andaian ia telah mati semasa tersembunyi.
Pada telefon dan pelayar terbenam, peristiwa ini berlaku jauh lebih kerap daripada strim yang mati — setiap pertukaran tab, setiap pembukaan kunci, dan dalam sesetengah pelayar terbenam setiap beberapa saat. Setiap satu menamatkan strim yang sebenarnya sihat. Chat menyambung semula, memainkan semula, ditamatkan lagi, dan akhirnya tersekat pada “Menyambung…”. Kemudian ia memberitahu bahawa giliran telah tamat walaupun ejen masih bekerja.
Pembetulan: nilai strim mengikut sama ada ia sedang berkomunikasi
Chat kini merekodkan bila strim setiap projek kali terakhir menerima apa-apa sahaja — peristiwa dan ping 15 saat. Isyarat “kelihatan semula” hanya menamatkan strim yang telah senyap selama 25 saat: lebih lama daripada selang ping ditambah sedikit kelewatan rangkaian yang perlahan, jadi strim yang hidup tidak pernah layak. Ujian menyemak bahawa ping dikira sebagai tanda hidup, dan strim yang baru sahaja ping tidak dianggap mati.
Peraturan yang kami dapat daripadanya: keterlihatan halaman menyatakan sesuatu tentang halaman, bukan tentang sambungan rangkaian. Tanya sambungan itu.
Pepijat 2: separuh balasan selepas telefon bangun
Yang ini kami boleh hasilkan semula setiap kali dalam simulator iOS:
- Mulakan chat baharu dan hantar permintaan yang mengambil masa.
- Biarkan telefon tidur sepanjang pembinaan.
- Kembali selepas giliran tamat dan penimbal main semula 2 minit telah tamat tempoh.
Chat menunjukkan beberapa blok pertama balasan, ditandakan sebagai siap — dan kekal begitu sehingga anda memuat semula halaman.
Sebabnya
Chat baharu tidak mempunyai benang — sejarah perbualan tersimpan — sehingga mesej pertama mencipta satu. Itu berlaku di dalam fungsi hantar, selepas hantar sudah menangkap langkah pendamaian, yang masih menganggap tiada benang. Jadi pada akhir giliran pertama dalam chat baharu, pendamaian tidak menemui benang dan diam-diam kembali tanpa meminta apa-apa.
Biasanya tiada siapa perasan, kerana strim sudah menghantar seluruh giliran itu. Tetapi telefon yang tidur semasa giliran dan kembali selepas penimbal main semula 120 saat tamat tempoh tidak dapat mendapatkan peristiwa yang hilang daripada strim — dan pendamaian yang sepatutnya mengisi jurang itu tidak pernah berjalan.
Pembetulan
- Hantar memberitahu pendamaian benang mana giliran itu milik, supaya giliran pertama chat baharu didamaikan seperti mana-mana giliran lain. Jika anda telah membuka chat lain apabila jawapan tiba, hasilnya digugurkan dan tidak ditunjukkan di tempat yang salah.
- Pendamaian yang gagal dicuba semula. Telefon yang bangun pada sambungan yang lemah boleh mendapati giliran telah tamat tetapi gagal mengambilnya. Itu kini diingati, dan chat akan mencuba lagi apabila tab dipaparkan semula atau rangkaian kembali.
- “Berfungsi selama” adalah jujur. Setiap balasan menunjukkan berapa lama ejen bekerja. Jika tab tidak pernah melihat mesej tamat giliran pelayan, ia dahulu mengisinya daripada jam sendiri — yang berjalan dari Hantar sehingga telefon bangun, termasuk masa jauh. Angka itu kini ditandakan sebagai anggaran, dan digantikan dengan tempoh tersimpan apabila sejarah tiba.
Apa yang kami pelajari
- Uji pada peranti yang pengguna sebenarnya guna, dengan cara mereka menggunakannya. Kedua-dua pepijat wujud dalam jurang antara “strim yang berfungsi” dan “telefon dalam poket”.
- Mekanisme sandaran yang tidak pernah berjalan bukanlah sandaran. Langkah pendamaian wujud untuk menangkap kes tepat ini, dan ia diam-diam melangkaunya.
- Cuba semula pemulihan juga. Saat telefon bangun selalunya ialah saat sambungannya paling teruk.
- Jangan tunjuk tekaan sebagai fakta. Tempoh daripada jam yang salah lebih teruk daripada tiada langsung; labelkannya atau gantikannya.
Kerja yang sama juga mengemas beberapa perkara yang anda akan lihat semasa giliran berjalan: langkah shell dilabelkan mengikut arahan yang melakukan kerja, bukan cd, tangkapan skrin dalam chat mengekalkan bahagian atas-kiri halaman dan muat dalam lajur, dan projek baharu mengambil nama yang dijana tanpa muat semula.
Jika anda membina apl anda sendiri untuk telefon, panduan kami tentang membina apl web mesra telefon dan apl native berbanding progressive web app meliputi asasnya. Lebih lanjut tentang chat itu sendiri ada dalam dokumentasi chat.