เมื่อคุณพบปัญหาเกี่ยวกับพุชจากเว็บ การแก้ไขข้อบกพร่องหรือหาความช่วยเหลืออาจเป็นเรื่องยาก เอกสารนี้จะสรุปปัญหาที่พบได้ทั่วไปบางส่วนและสิ่งที่คุณควรทำ หากพบข้อบกพร่องใน Chrome หรือ Firefox
ก่อนที่เราจะเริ่มแก้ไขข้อบกพร่องของพุช คุณอาจพบปัญหาในการแก้ไขข้อบกพร่องของผู้ปฏิบัติงานบริการเอง ไฟล์ไม่อัปเดต ลงทะเบียนไม่สำเร็จ หรือเป็นเพียงลักษณะการทำงานที่ผิดปกติ มีเอกสารที่ยอดเยี่ยมเกี่ยวกับการแก้ไขข้อบกพร่องของ Service Worker ที่ผมแนะนำให้ลองศึกษาดูหากคุณเพิ่งเริ่มต้นพัฒนาโปรแกรมทำงานของบริการ
เมื่อพัฒนาและทดสอบพุชจากเว็บมีขั้นตอนที่แตกต่างกัน 2 ขั้นตอน โดยแต่ละขั้นมีชุดปัญหาที่พบได้ทั่วไปแตกต่างกัน ดังนี้
- การส่งข้อความ: ตรวจสอบว่าการส่งข้อความเสร็จสมบูรณ์
คุณควรได้รับรหัส HTTP 201 หากยังไม่ได้ดำเนินการ ให้ทำดังนี้
- ตรวจสอบข้อผิดพลาดในการให้สิทธิ์: ถ้าคุณได้รับข้อความแสดงข้อผิดพลาดในการให้สิทธิ์ โปรดดูที่ส่วนปัญหาการให้สิทธิ์
- ข้อผิดพลาดอื่นๆ ของ API: หากคุณได้รับการตอบกลับสำหรับรหัสสถานะที่ไม่ใช่ 201 โปรดดูส่วนรหัสสถานะ HTTP สำหรับคำแนะนำเกี่ยวกับสาเหตุของปัญหา
- การรับข้อความ: หากคุณส่งข้อความได้สำเร็จ แต่ไม่ได้รับข้อความในเบราว์เซอร์ ให้ทำดังนี้
- ตรวจสอบปัญหาการเข้ารหัส: ดูส่วนปัญหาเกี่ยวกับการเข้ารหัสเพย์โหลด
- ตรวจสอบปัญหาด้านการเชื่อมต่อ: หากปัญหาอยู่ที่ Chrome อาจเป็นไปได้ว่าเกิดจากการเชื่อมต่อ ดูข้อมูลเพิ่มเติมได้ที่ส่วนปัญหาเกี่ยวกับการเชื่อมต่อ
หากคุณไม่สามารถส่งและรับข้อความ Push ได้ และส่วนที่เกี่ยวข้องในเอกสารนี้ไม่ช่วยแก้ไขข้อบกพร่อง แสดงว่าคุณอาจพบข้อบกพร่องในกลไกการพุช ในกรณีนี้ โปรดดูส่วนเพิ่มรายงานข้อบกพร่องเพื่อส่งรายงานข้อบกพร่องที่ดีพร้อมข้อมูลที่จำเป็นทั้งหมดเพื่อให้กระบวนการแก้ไขข้อบกพร่องเร็วขึ้น
สิ่งหนึ่งที่ผมอยากจะพูดถึงก่อนที่เราจะเริ่มต้นคือ Firefox และ Mozilla AutoPush Service มีข้อความแสดงข้อผิดพลาดที่ยอดเยี่ยม หากคุณไม่สามารถดำเนินการต่อและไม่แน่ใจว่าปัญหาคืออะไร ให้ทดสอบใน Firefox และดูว่าคุณได้รับข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์มากขึ้นหรือไม่
ปัญหาการให้สิทธิ์
ปัญหาเกี่ยวกับการให้สิทธิ์เป็นสาเหตุที่พบบ่อยที่สุดอย่างหนึ่งที่นักพัฒนาแอปพบเมื่อเริ่มใช้พุชจากเว็บ ปกติแล้วปัญหานี้มักเป็นปัญหาเกี่ยวกับการกำหนดค่าคีย์เซิร์ฟเวอร์แอปพลิเคชัน (หรือที่เรียกว่าคีย์ VAPID) ของเว็บไซต์
วิธีที่ง่ายที่สุดในการสนับสนุนการพุชทั้งใน Firefox และ Chrome คือการระบุ applicationServerKey
ในการเรียกใช้ subscribe()
ข้อเสียก็คือ ความแตกต่างระหว่างคีย์ส่วนหน้าและคีย์ของเซิร์ฟเวอร์จะทำให้เกิดข้อผิดพลาดในการให้สิทธิ์
ใน Chrome และ FCM
สำหรับ Chrome ซึ่งใช้ FCM เป็นบริการพุช คุณจะได้รับการตอบกลับ UnauthorizedRegistration
จาก FCM สำหรับข้อผิดพลาดที่แตกต่างกัน โดยทั้งหมดนี้จะเกี่ยวข้องกับคีย์เซิร์ฟเวอร์ของแอปพลิเคชัน
คุณจะได้รับข้อผิดพลาด UnauthorizedRegistration
ในกรณีต่อไปนี้
- หากกำหนดส่วนหัว
Authorization
ในคำขอไปยัง FCM ไม่สำเร็จ - คีย์แอปพลิเคชันของคุณที่ใช้สมัครรับผู้ใช้ไม่ตรงกับคีย์ที่ใช้ในการลงนามส่วนหัวการให้สิทธิ์
- การหมดอายุไม่ถูกต้องใน JWT ของคุณ นั่นคือ เวลาหมดอายุเกิน 24 ชั่วโมง หรือ JWT หมดอายุแล้ว
- JWT มีรูปแบบไม่ถูกต้องหรือมีค่าที่ไม่ถูกต้อง
การตอบกลับข้อผิดพลาดแบบเต็มมีลักษณะดังนี้
<html>
<head>
<title>UnauthorizedRegistration</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<h1>UnauthorizedRegistration</h1>
<h2>Error 400</h2>
</body>
</html>
หากคุณได้รับข้อความแสดงข้อผิดพลาดนี้ใน Chrome ให้ลองทดสอบใน Firefox เพื่อดูว่าจะให้ข้อมูลเชิงลึกเกี่ยวกับปัญหามากขึ้นหรือไม่
Firefox และ Mozilla AutoPush
Firefox และ Mozilla AutoPush แสดงข้อความแสดงข้อผิดพลาดสำหรับปัญหา Authorization
รายการ
นอกจากนี้ คุณจะได้รับการตอบกลับข้อผิดพลาด Unauthorized
จาก Mozilla AutoPush หากส่วนหัว Authorization
ไม่รวมอยู่ในคำขอพุช
{
"errno": 109,
"message": "Request did not validate missing authorization header",
"code": 401,
"more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
"error": "Unauthorized"
}
หากเวลาหมดอายุใน JWT หมดอายุ คุณจะได้รับข้อผิดพลาด Unauthorized
พร้อมข้อความอธิบายว่าโทเค็นหมดอายุแล้ว
{
"code": 401,
"errno": 109,
"error": "Unauthorized",
"more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
"message": "Request did not validate Invalid bearer token: Auth expired"
}
หากคีย์เซิร์ฟเวอร์ของแอปพลิเคชันแตกต่างกันระหว่างเวลาที่สมัครใช้บริการและเวลาที่ลงชื่อส่วนหัวการให้สิทธิ์ ระบบจะแสดงข้อผิดพลาด Not Found
ดังนี้
{
"errno": 102,
"message": "Request did not validate invalid token",
"code": 404,
"more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
"error": "Not Found"
}
สุดท้ายนี้ หากคุณมีค่าที่ไม่ถูกต้องใน JWT (ตัวอย่างเช่น หากค่า "alg" เป็นค่าที่ไม่คาดคิด) คุณจะได้รับข้อผิดพลาดต่อไปนี้จาก Mozilla AutoPush
{
"code": 401,
"errno": 109,
"error": "Unauthorized",
"more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
"message": "Request did not validate Invalid Authorization Header"
}
รหัสสถานะ HTTP
มีปัญหาหลายอย่างที่อาจส่งผลให้รหัสตอบกลับที่ไม่ใช่ 201 จากบริการข้อความพุชได้ ด้านล่างนี้เป็นรายการรหัสสถานะ HTTP และความหมายที่เกี่ยวข้องกับการพุชจากเว็บ
รหัสสถานะ | คำอธิบาย |
---|---|
429 | มีคำขอมากเกินไป แอปพลิเคชันเซิร์ฟเวอร์ของคุณถึงขีดจำกัดอัตราด้วยบริการพุชแล้ว การตอบกลับจากบริการควรมีส่วนหัว "Retry-After" เพื่อระบุระยะเวลาที่สามารถส่งคำขออื่นได้ |
400 | คำขอไม่ถูกต้อง ส่วนหัวอันใดอันหนึ่งไม่ถูกต้องหรือ มีรูปแบบไม่ถูกต้อง |
404 | ไม่พบ ในกรณีนี้ คุณควรลบการสมัครใช้บริการแบบพุชจากแบ็กเอนด์ และรอให้ผู้ใช้กลับมาสมัครใช้บริการอีกครั้ง |
410 | หมดแล้ว การสมัครใช้บริการดังกล่าวใช้ไม่ได้แล้ว และควรนำออกจากแบ็กเอนด์ ซึ่งทำซ้ำได้โดยเรียก "unsubscribe()" ใน "PushSubscription" |
413 | เพย์โหลดมีขนาดใหญ่เกินไป เพย์โหลดขนาดขั้นต่ำที่บริการพุชต้องรองรับคือ 4096 ไบต์ (หรือ 4 KB) หากมีขนาดใหญ่กว่า อาจทำให้เกิดข้อผิดพลาดนี้ |
หากรหัสสถานะ HTTP ไม่อยู่ในรายการนี้และข้อความแสดงข้อผิดพลาดไม่มีประโยชน์ โปรดดูข้อกำหนดของโปรโตคอล Web Push เพื่อดูว่ามีการอ้างอิงรหัสสถานะนี้พร้อมกับสถานการณ์เมื่อใดที่สามารถใช้รหัสสถานะนั้นได้
ปัญหาการเข้ารหัสเพย์โหลด
หากคุณทริกเกอร์ข้อความพุชได้สำเร็จ (เช่น ส่งข้อความไปยังบริการพุชจากเว็บและได้รับโค้ดตอบกลับ 201) แต่เหตุการณ์พุชไม่เริ่มทำงานในโปรแกรมทำงานของบริการ โดยปกติแล้วจะเป็นสัญญาณว่าเบราว์เซอร์ถอดรหัสข้อความที่ได้รับไม่สำเร็จ
หากเป็นเช่นนี้ คุณควรเห็นข้อความแสดงข้อผิดพลาดในคอนโซลเครื่องมือสำหรับนักพัฒนาเว็บของ Firefox ดังตัวอย่างต่อไปนี้
หากต้องการตรวจสอบว่าปัญหานี้เกิดจาก Chrome หรือไม่ ให้ทำดังนี้
- ไปที่ about://gcm-internals แล้วคลิกปุ่ม "เริ่มการบันทึก"
- เรียกข้อความพุช และดูในส่วน "บันทึกความล้มเหลวในการถอดรหัสข้อความ"
หากเกิดปัญหากับการถอดรหัสเพย์โหลด คุณจะเห็นข้อผิดพลาดที่คล้ายกับข้อผิดพลาดที่แสดงข้างต้น (สังเกตข้อความ AES-GCM decryption failed
ในคอลัมน์รายละเอียด)
มีเครื่องมือ 2-3 อย่างที่อาจช่วยแก้ปัญหาการเข้ารหัสได้หากเกิดปัญหาดังนี้
- เครื่องมือตรวจสอบความถูกต้องของรหัสผ่านโดย Peter Beverloo
- Web Push: หน้าทดสอบการเข้ารหัสข้อมูลโดย Mozilla
ปัญหาเกี่ยวกับการเชื่อมต่อ
หากคุณไม่ได้รับเหตุการณ์พุชใน Service Worker และไม่เห็นข้อผิดพลาดในการถอดรหัส แสดงว่าเบราว์เซอร์อาจเชื่อมต่อกับบริการพุชไม่ได้
ใน Chrome คุณจะตรวจสอบว่าเบราว์เซอร์ได้รับข้อความหรือไม่โดยดูที่ "รับข้อความบันทึก" (sic) ใน about://gcm-internals
หากไม่เห็นข้อความที่ได้รับภายในเวลาที่กำหนด ให้ตรวจสอบว่าสถานะการเชื่อมต่อของเบราว์เซอร์คือ CONNECTED
หากไม่ได้ "เชื่อมต่อแล้ว" คุณอาจต้องลบโปรไฟล์ปัจจุบันและสร้างโปรไฟล์ใหม่ หากยังแก้ปัญหาไม่ได้ โปรดส่งรายงานข้อบกพร่องตามที่แนะนำด้านล่าง
การเพิ่มรายงานข้อบกพร่อง
หากวิธีการต่างๆ ข้างต้นแก้ปัญหาไม่ได้และไม่มีสัญญาณบอกได้ว่าปัญหาน่าจะเกิดขึ้นได้ โปรดแจ้งปัญหาเกี่ยวกับเบราว์เซอร์ที่คุณพบปัญหา
สำหรับ Chrome คุณอาจแจ้งปัญหาที่นี่ https://bugs.chromium.org/p/chromium/issues/list สำหรับ Firefox คุณควรแจ้งปัญหาใน https://bugzilla.mozilla.org/
คุณควรระบุรายละเอียดต่อไปนี้เพื่อสร้างรายงานข้อบกพร่องที่ดี
- เบราว์เซอร์ที่คุณได้ทดสอบ (เช่น Chrome เวอร์ชัน 50, Chrome เวอร์ชัน 51, Firefox เวอร์ชัน 50, Firefox เวอร์ชัน 51)
- ตัวอย่าง
PushSubscription
ที่แสดงให้เห็นปัญหา - รวมคำขอตัวอย่าง (เช่น เนื้อหาของคำขอเครือข่ายที่ส่งไปยังบริการพุช รวมถึงส่วนหัว)
- ใส่ตัวอย่างคำตอบจากคำขอของเครือข่ายด้วย
หากคุณสามารถให้ตัวอย่างที่สามารถทำซ้ำได้ ไม่ว่าจะเป็นซอร์สโค้ดหรือเว็บไซต์ที่โฮสต์ ก็มักจะช่วยเร่งการวินิจฉัยและแก้ปัญหาให้เร็วขึ้น
ขั้นตอนถัดไป
- ภาพรวมข้อความ Push ในเว็บ
- วิธีการทำงานของ Push
- การสมัครใช้บริการ
- UX ของสิทธิ์
- การส่งข้อความด้วยไลบรารีพุชจากเว็บ
- โปรโตคอลพุชจากเว็บ
- การจัดการเหตุการณ์พุช
- การแสดงการแจ้งเตือน
- ลักษณะการทำงานของการแจ้งเตือน
- รูปแบบการแจ้งเตือนทั่วไป
- คำถามที่พบบ่อยเกี่ยวกับข้อความ Push
- ปัญหาที่พบบ่อยและการรายงานข้อบกพร่อง