مشکلات رایج و گزارش کردن اشکالات

وقتی با مشکلی در ارسال وب مواجه می‌شوید، اشکال‌زدایی مشکل یا پیدا کردن راهنمایی می‌تواند دشوار باشد. این سند برخی‌از مشکلات رایج و کارهایی را که باید درصورت پیدا کردن اشکال در Chrome یا Firefox انجام دهید شرح می‌دهد.

قبل‌از اینکه به اشکال‌زدایی Push بپردازیم، ممکن است با مشکلاتی در اشکال‌زدایی خود Service Worker، به‌روز نشدن فایل، عدم ثبت، یا به‌طور کلی رفتار غیرعادی مواجه شوید. سند فوق‌العاده‌ای درباره اشکال‌زدایی سرویس‌کارها وجود دارد که اگر در توسعه سرویس‌کار تازه‌کار هستید، اکیداً توصیه می‌کنم آن را بررسی کنید.

دو مرحله متمایز برای بررسی هنگام توسعه و آزمایش ارسال وب وجود دارد، هرکدام با مجموعه مشکلات / مسائل رایج خود:

  • ارسال پیام: مطمئن شوید که پیام‌ها با موفقیت ارسال می‌شوند. باید کد HTTP‏ ۲۰۱ دریافت کنید. اگر نیستید:
    • بررسی خطاهای مجوز: اگر پیام خطای مجوز دریافت کردید، به بخش مشکلات مجوز مراجعه کنید.
    • خطاهای دیگر میانای برنامه‌سازی کاربردی: اگر پاسخ رمز وضعیت غیر۲۰۱ دریافت کردید، برای راهنمایی درباره علت مشکل، بخش «رمزهای وضعیت HTTP» را ببینید.
  • دریافت پیام: اگر می‌توانید پیامی را با موفقیت ارسال کنید، اما پیام در مرورگر دریافت نمی‌شود:

اگر نمی‌توانید پیام لحظه‌ای ارسال و دریافت کنید و بخش‌های مربوطه در این سند به اشکال‌زدایی مشکل کمک نمی‌کنند، ممکن است اشکالی در خود سازوکار لحظه‌ای پیدا کرده باشید. در این مورد، به بخش ارسال گزارش اشکال مراجعه کنید تا گزارش اشکال خوبی را با همه اطلاعات لازم برای تسریع فرایند رفع اشکال ارسال کنید.

One thing I'd like to call out before we start is that Firefox and the Mozilla AutoPush Service have great error messages. اگر گیر کردید و مطمئن نیستید مشکل چیست، در Firefox آزمایش کنید و ببینید آیا پیام خطای مفیدتری دریافت می‌کنید یا نه.

مشکلات صدور مجوز

مشکلات مربوط به مجوز یکی از رایج‌ترین مشکلاتی است که توسعه‌دهندگان هنگام شروع کار با ارسال وب با آن مواجه می‌شوند. این مشکل معمولاً به‌دلیل پیکربندی کلیدهای سرور برنامه (یا کلیدهای VAPID) سایت است.

ساده‌ترین راه برای پشتیبانی از ارسال در Firefox و Chrome، ارائه applicationServerKey در تماس subscribe() است. نکته منفی این است که هرگونه مغایرت بین کلیدهای سرور و میانای کاربری شما منجر به خطای مجوز می‌شود.

در Chrome و FCM

برای Chrome، که از FCM به‌عنوان سرویس push استفاده می‌کند، پاسخ UnauthorizedRegistration را از FCM برای طیف وسیعی از خطاهای مختلف دریافت خواهید کرد، که همه آن‌ها شامل کلیدهای سرور برنامه است.

در هریک از شرایط زیر، خطای UnauthorizedRegistration دریافت خواهید کرد:

  • اگر نتوانید سرایند Authorization را در درخواست به FCM تعریف کنید.
  • کلید برنامه شما که برای مشترک کردن کاربر استفاده شده است با کلید استفاده‌شده برای امضای سرصفحه «مجوز» مطابقت ندارد.
  • تاریخ انقضا در JWT شما نامعتبر است، یعنی تاریخ انقضا از ۲۴ ساعت فراتر رفته است یا 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 مشکل ارائه می‌دهند.

اگر سرصفحه Authorization در درخواست فشاری شما گنجانده نشده باشد، پاسخ خطای Unauthorized را نیز از Mozilla AutoPush دریافت خواهید کرد.

{
  "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 و معنی آن‌ها در ارتباط با ارسال وب آمده است.

کد وضعیت شرح
429 بیش‌ازحد درخواست وجود دارد. سرور برنامه شما به حد نرخ با سرویس فشاری رسیده است. پاسخ سرویس باید شامل سرصفحه «امتحان مجدد بعداً» باشد تا نشان دهد چقدر باید بگذرد تا بتوان درخواست دیگری ارسال کرد.
۴۰۰ درخواست نامعتبر است. یکی از سرصفحه‌هایتان نامعتبر است یا قالب‌بندی ضعیفی دارد.
404 پیدا نشد. در این حالت باید PushSubscription را از پس‌زمینه‌تان حذف کنید و منتظر فرصتی برای ازسرگرفتن اشتراک کاربر باشید.
410 رفته. اشتراک دیگر معتبر نیست و باید از پس‌زمینه شما برداشته شود. این را می‌توان با فراخوانی `unsubscribe()` ‎ در `PushSubscription` بازتولید کرد.
413 اندازه پایه‌بار خیلی بزرگ است. حداقل اندازه بار داده‌ای که سرویس push باید پشتیبانی کند ۴۰۹۶ بایت (یا ۴ کیلوبایت) است. هر چیزی بزرگ‌تر از این می‌تواند منجر به این خطا شود.

اگر کد وضعیت HTTP در این فهرست نیست و پیام خطا مفید نیست، مشخصات پروتکل Web Push را بررسی کنید تا ببینید آیا به کد وضعیت همراه با سناریویی که در آن می‌توان از آن کد وضعیت استفاده کرد ارجاع داده شده است یا نه.

مشکل رمزگذاری بار داده

اگر می‌توانید پیام لحظه‌ای را با موفقیت راه‌اندازی کنید (یعنی پیامی به سرویس لحظه‌ای وب ارسال کنید و کد پاسخ ۲۰۱ دریافت کنید) اما رویداد لحظه‌ای هرگز در سرویس‌کار شما اجرا نمی‌شود، این معمولاً نشان می‌دهد که مرورگر نتوانسته است پیام دریافتی را رمزگشایی کند.

اگر این‌طور باشد، باید پیام خطایی در کنسول DevTools در Firefox ببینید، مثل این:

Firefox DevTools با پیام رمزگشایی.

برای بررسی اینکه آیا مشکل در Chrome است، موارد زیر را انجام دهید:

  1. به about://gcm-internals بروید و روی دکمه «شروع ضبط» کلیک کنید.

سوابق داخلی GCM در Chrome.

  1. پیام لحظه‌ای را راه‌اندازی کنید و به بخش «گزارش خطای رمزگشایی پیام» بروید.

گزارش رمزگشایی داخلی GCM.

اگر مشکلی در رمزگشایی بار مفید وجود داشته باشد، خطایی مشابه آنچه در بالا نشان داده شده است خواهید دید. (به پیام AES-GCM decryption failed در ستون جزئیات توجه کنید.)

اگر مشکلتان این است، چند ابزار وجود دارد که ممکن است به اشکال‌زدایی رمزگذاری کمک کند:

مشکل اتصال

اگر رویداد فشاری را در سرویس‌کار خود دریافت نمی‌کنید و هیچ خطای رمزگشایی را مشاهده نمی‌کنید، ممکن است مرورگر نتواند به سرویس فشاری متصل شود.

در Chrome، می‌توانید با بررسی «گزارش پیام‌های دریافتی» در about://gcm-internals، ببینید مرورگر پیام دریافت می‌کند یا نه.

گزارش پیام دریافتی داخلی GCM.

اگر پیام را به‌موقع دریافت نمی‌کنید، مطمئن شوید که وضعیت اتصال مرورگرتان CONNECTED باشد:

وضعیت اتصال داخلی GCM.

اگر «متصل» نیست، ممکن است لازم باشد نمایه فعلی‌تان را حذف کنید و نمایه جدیدی ایجاد کنید. اگر با این کار مشکل برطرف نشد، لطفاً همان‌طور که در زیر پیشنهاد شده است گزارش اشکال ارسال کنید.

ارسال گزارش اشکال

اگر هیچ‌کدام از موارد بالا به حل مشکلتان کمک نکرد و نشانه‌ای از اینکه مشکل چه می‌تواند باشد وجود ندارد، لطفاً مشکلی را برای مرورگری که با آن مشکل دارید مطرح کنید:

برای Chrome، مشکل را در اینجا مطرح کنید: https://bugs.chromium.org/p/chromium/issues/list برای Firefox، مشکل را در اینجا مطرح کنید: https://bugzilla.mozilla.org/

برای ارائه گزارش اشکال خوب، باید جزئیات زیر را ارائه دهید:

  • مرورگرهایی که در آن‌ها آزمایش کرده‌اید (مثلاً Chrome نسخه ۵۰، Chrome نسخه ۵۱، Firefox نسخه ۵۰، Firefox نسخه ۵۱).
  • نمونه‌ای از PushSubscription که مشکل را نشان می‌دهد.
  • هرگونه درخواست نمونه (یعنی محتوای درخواست‌های شبکه به سرویس ارسال مستقیم، ازجمله سرصفحه‌ها) را اضافه کنید.
  • هرگونه پاسخ نمونه از درخواست‌های شبکه را نیز اضافه کنید.

اگر بتوانید نمونه‌ای قابل‌تولید مجدد، چه کد منبع یا وب‌سایت میزبانی‌شده، ارائه دهید، اغلب به تشخیص و حل سریع‌تر مشکل کمک می‌کند.

مقصد بعدی کجاست

Code labs