تعامل در لحظه: اعلان‌های Web Push در Rails 8

توسعه‌دهندگان مستقل اغلب هنگام ساخت ویژگی‌های موبایل با بن‌بست مواجه می‌شوند. پیش از این، برای ارسال اعلان‌های push به یک اپلیکیشن Native نیاز داشتید. اگر اپلیکیشنی نداشتید، ناچار بودید به ایمیل یا پیامک‌های پرهزینه متکی باشید.

Web Push API این وضعیت را تغییر می‌دهد. این API تقریباً روی همه مرورگرها، از جمله Safari در iOS، کار می‌کند. شما می‌توانید هشدارها را مستقیماً از اپلیکیشن Rails خود به دستگاه کاربر ارسال کنید. آن‌ها نیازی به دانلود هیچ چیزی از App Store ندارند.

در اینجا نحوه راه‌اندازی آن در Rails 8 آمده است.

گردش کار (Workflow)

  • اشتراک (Subscription): کاربر در مرورگر خود روی allow کلیک می‌کند. مرورگر یک شیء subscription ارائه می‌دهد.
  • ذخیره‌سازی (Storage): شما این شیء را در پایگاه داده خود و با اتصال به کاربر ذخیره می‌کنید.
  • ارسال Push: سرور Rails شما یک پیام امضا شده را به سرویس push مرورگر ارسال می‌کند.
  • تحویل (Delivery): service worker در دستگاه، اعلان را نمایش می‌دهد.

مراحل راه‌اندازی

  1. امنیت شما برای شناسایی سرور خود به کلیدهای VAPID نیاز دارید. این کار از ارسال هشدارهای جعلی توسط هکرها جلوگیری می‌کند. gem web-push را به Gemfile خود اضافه کنید. دستور web-push generate-vapid-keys را در ترمینال خود اجرا کنید. این کلیدها را در فایل credentials خود ذخیره کنید.

  2. پایگاه داده کاربران اغلب چندین دستگاه دارند. یک مدل برای ذخیره اشتراک‌ها ایجاد کنید. اجرا کنید: rails g model WebPushSubscription user:references endpoint:string p256dh_key:string auth_key:string اجرا کنید: rails db:migrate

  3. Service Worker فایل public/service-worker.js را ایجاد کنید. این فایل حتی زمانی که وب‌سایت شما بسته است نیز اجرا می‌شود. این فایل منتظر رویداد push می‌ماند و اعلان را نمایش می‌دهد.

  4. فرانت‌اند (Frontend) worker را در application.js خود ثبت کنید. از یک Stimulus controller برای درخواست اجازه استفاده کنید. داده‌های subscription را از طریق یک درخواست POST به Rails controller خود ارسال کنید.

  5. پردازش‌های پس‌زمینه (Background Jobs) هرگز اعلان‌ها را در چرخه اصلی درخواست (request cycle) ارسال نکنید. برای جلوگیری از کند شدن اپلیکیشن خود، از یک background job استفاده کنید. یک SendWebPushJob ایجاد کنید. روی اشتراک‌های یک کاربر پیمایش (loop) کنید. از gem web-push برای ارسال payload استفاده کنید. اگر اشتراک‌ها دیگر معتبر نیستند، آن‌ها را حذف کنید.

شما می‌توانید تنها با استفاده از Rails و مقدار کمی Javascript، اپلیکیشنی بسازید که تجربه‌ای مشابه یک اپلیکیشن Native موبایل داشته باشد.

منبع: https://dev.to/zilton7/real-time-engagement-web-push-notifications-in-rails-8-5gdp