למה התראות לא פועלות כשהדפדפן סגור?
השאלה הזו עולה לא מעט, בעיקר כי יש כמה תרחישים שקשה להבין אותם.
נתחיל עם Android. מערכת ההפעלה Android מתוכננת להאזין להודעות שנשלחות, וכשהיא מקבלת הודעה, היא מפעילה את אפליקציית Android המתאימה כדי לטפל בהודעה, גם אם האפליקציה סגורה.
זה בדיוק אותו דבר בכל דפדפן ב-Android, הדפדפן יתעורר כשמתקבלת הודעת Push ואז הדפדפן יעיר את ה-Service Worker וישלח את אירוע ה-Push.
במערכות הפעלה למחשבים, זה קצת יותר מורכב והכי קל להסביר את זה ב-Mac OS X כי יש אינדיקטור חזותי שעוזר להסביר את התרחישים השונים.
ב-Mac OS X, אפשר לדעת אם תוכנה פועלת או לא לפי הסימון מתחת לסמל האפליקציה ב-Dock.
אם משווים בין שני סמלי Chrome ב-Dock הבא, הסמל שמשמאל פועל, כפי שמוצג בסימון שמתחת לסמל, ואילו הסמל של Chrome שמימין לא פועל, ולכן אין סימון מתחתיו.
בהקשר של קבלת הודעות דחיפה במחשב, תקבלו הודעות כשהדפדפן פועל, כלומר כשיש סימון מתחת לסמל.
זה אומר שגם אם אין חלונות פתוחים בדפדפן, עדיין תקבלו את הודעת ה-Push ב-Service Worker, כי הדפדפן פועל ברקע.
הפעם היחידה שבה לא תתקבל התראת Push היא כשהדפדפן סגור לחלוטין, כלומר לא פועל בכלל (אין סימון). אותו דבר נכון לגבי Windows, למרות שקצת יותר קשה לקבוע אם Chrome פועל ברקע או לא.
איך מגדירים שאפליקציית האינטרנט במסך הבית תיפתח במסך מלא אחרי לחיצה על התראה?
ב-Chrome ל-Android, אפשר להוסיף אפליקציית אינטרנט למסך הבית. כשפותחים את אפליקציית האינטרנט ממסך הבית, היא יכולה לפעול במצב מסך מלא בלי סרגל כתובות ה-URL, כמו שמוצג בהמשך.
כדי לשמור על חוויית שימוש עקבית, המפתחים רוצים שההתראות שהמשתמשים לוחצים עליהן יפתחו את אפליקציית האינטרנט שלהם גם במסך מלא.
ב-Chrome יש "סוג של" הטמעה של זה, אבל יכול להיות שהיא לא אמינה וקשה להבין אותה. פרטי ההטמעה הרלוונטיים הם:
כלומר, אם המשתמש לא נכנס לאתר דרך הסמל במסך הבית באופן קבוע, ההתראות ייפתחו בממשק המשתמש הרגיל של הדפדפן.
אנחנו נמשיך לטפל בבעיה הזו.
למה זה יותר טוב מ-WebSockets?
אפשר להפעיל קובץ שירות (service worker) גם כשחלון הדפדפן סגור. WebSocket יפעל רק כל עוד הדפדפן ודף האינטרנט פתוחים.
מה הקשר בין GCM, FCM, התראות מאתרים ו-Chrome?
יש כמה היבטים לשאלה הזו, והדרך הכי קלה להסביר אותם היא לעבור על ההיסטוריה של התראות מאתרים ושל Chrome. (אל דאגה, הוא קצר).
דצמבר 2014
כשהתכונה "דחיפת הודעות מדפי אינטרנט" הוטמעה לראשונה ב-Chrome, הדפדפן השתמש ב-Google Cloud Messaging (GCM) כדי לשלוח הודעות דחיפה מהשרת לדפדפן.
לא מדובר בהתראות מאתרים. יש כמה סיבות לכך שההגדרה המוקדמת הזו של Chrome ו-GCM לא הייתה התראת Push "אמיתית" באינטרנט.
- כדי להשתמש ב-GCM, המפתחים צריכים להגדיר חשבון ב-Google Developers Console.
- כדי להגדיר את העברת ההודעות בצורה נכונה, Chrome ו-GCM היו צריכים מזהה שולח מיוחד שאפליקציית האינטרנט תשתף.
- השרתים של GCM קיבלו בקשת API מותאמת אישית שלא הייתה תקן אינטרנט.
יולי 2016
ביולי הושקה תכונה חדשה בהתראות מאתרים – מפתחות שרת אפליקציות (או VAPID, כפי שהמפרט ידוע). כשנוספה ל-Chrome תמיכה ב-API החדש הזה, הוא השתמש ב"העברת הודעות בענן ב-Firebase" (שנקרא גם FCM) במקום ב-GCM כשירות להעברת הודעות. זה חשוב מכמה סיבות:
- ב-Chrome ובמפתחות של שרת האפליקציה אין צורך להגדיר פרויקט כלשהו ב-Google או ב-Firebase. הוא פשוט יעבוד.
- FCM תומך בפרוטוקול של התראות אינטרנט, שהוא ה-API שכל שירותי התראות האינטרנט יתמכו בו. כלומר, לא משנה באיזה שירות התראות הדפדפן משתמש, אתם פשוט שולחים את אותו סוג של בקשה וההודעה תישלח.
למה זה מבלבל היום?
יש הרבה בלבול עכשיו, כשנכתב תוכן בנושא של התראות מאתרים, שחלק גדול ממנו מתייחס ל-GCM או ל-FCM. אם בתוכן יש התייחסות ל-GCM, כנראה שמדובר בתוכן ישן או בתוכן שמתמקד יותר מדי ב-Chrome. (אני מודה שגם אני עשיתי את זה בכמה פוסטים ישנים).
במקום זאת, חשבו על התראות אינטרנט כדפדפן שמשתמש בשירות התראות כדי לנהל את השליחה והקבלה של הודעות, שבו שירות ההתראות יקבל בקשה של "פרוטוקול התראות אינטרנט". אם חושבים במונחים האלה, אפשר להתעלם מהדפדפן ומשירות ההתראות שבהם משתמשים, ולהתחיל לעבוד.
המדריך הזה מתמקד בגישה הסטנדרטית להתראות מאתרים, ומתעלם בכוונה מכל דבר אחר.
ל-Firebase יש JavaScript SDK. מה ולמה?
אם נתקלתם ב-Firebase Web SDK ושמתם לב שיש לו ממשק API להעברת הודעות ב-JavaScript, יכול להיות שאתם תוהים מה ההבדל בינו לבין התראות Web Push.
ערכת ה-SDK להעברת הודעות בענן ב-Firebase (שנקראת Firebase Cloud Messaging JS SDK) מבצעת כמה פעולות מאחורי הקלעים כדי להקל על ההטמעה של התראות אינטרנט.
- במקום לדאוג לגבי
PushSubscriptionוהשדות השונים שלו, צריך לדאוג רק לגבי אסימון FCM (מחרוזת). - באמצעות הטוקנים של כל משתמש, אתם יכולים להשתמש ב-FCM API הקנייני כדי להפעיל התראות. ב-API הזה לא צריך להצפין את המטען הייעודי (payload). אפשר לשלוח מטען ייעודי (payload) של טקסט פשוט בגוף של בקשת POST.
- ה-API הקנייני של FCM תומך בתכונות בהתאמה אישית, למשל נושאים ב-FCM (הוא פועל גם באינטרנט, אבל התיעוד שלו לא מספיק).
- בנוסף, FCM תומך ב-Android, ב-iOS ובאינטרנט, כך שלחלק מהצוותים קל יותר לעבוד איתו בפרויקטים קיימים.
היא משתמשת בהתראות מאתרים מאחורי הקלעים, אבל המטרה שלה היא להסתיר את זה.
כמו שאמרתי בתשובה לשאלה הקודמת, אם אתם מתייחסים להתראות אינטרנט כאל דפדפן ושירות התראות, אתם יכולים להתייחס ל-Messaging SDK ב-Firebase כאל ספרייה שמפשטת את ההטמעה של התראות אינטרנט.
לאן ממשיכים מכאן
- סקירה כללית על התראות מאפליקציות אינטרנט
- איך פועל Push
- רישום משתמש
- חוויית המשתמש של ההרשאות
- שליחת הודעות באמצעות ספריות של Web Push
- פרוטוקול Web Push
- טיפול באירועי Push
- הצגת התראה
- התנהגות ההתראות
- תבניות נפוצות של התראות
- שאלות נפוצות בנושא התראות
- בעיות נפוצות ודיווח על באגים