במדריך הזה מוסבר איך להגדיר את Firebase Cloud Messaging באפליקציות הלקוח לנייד ולאינטרנט, כדי שתוכלו לשלוח הודעות בצורה מהימנה. בסביבות שרת, אפשר לעיין במאמר סביבת השרת שלכם וFCM.
הגדרת אפליקציית לקוח של העברת הודעות בענן ב-Firebase ב-Flutter
בהתאם לפלטפורמה שאליה אתם מכוונים, יש כמה שלבי הגדרה נוספים שצריך לבצע.
iOS+
שינוי פונקציונליות של שיטה
כדי להשתמש בתוסף FCM Flutter במכשירי Apple, צריך להשתמש בשיטת swizzling. בלעדיו, תכונות מרכזיות של Firebase כמו FCM ניהול טוקנים לא יפעלו כמו שצריך.
Android
Google Play Services
במכשירי לקוח של FCM נדרשת מערכת Android מגרסה 4.4 ומעלה, שמותקנים בה גם שירותי Google Play, או אמולטור עם Android 4.4 עם Google APIs. שימו לב: אתם לא מוגבלים לפריסת אפליקציות Android דרך חנות Google Play.
אפליקציות שמסתמכות על Play Services SDK צריכות תמיד לבדוק במכשיר אם יש APK תואם של Google Play Services לפני שהן ניגשות לתכונות של Google Play Services. מומלץ לעשות את זה בשני מקומות: בשיטה onCreate()
של הפעילות הראשית ובשיטה onResume()
שלה. הבדיקה ב-onCreate()
מוודאת שאי אפשר להשתמש באפליקציה בלי שהבדיקה תסתיים בהצלחה. הבדיקה ב-onResume()
מוודאת שאם המשתמש חוזר לאפליקציה הפועלת באמצעים אחרים, כמו באמצעות לחצן החזרה, הבדיקה עדיין מתבצעת.
אם במכשיר לא מותקנת גרסה תואמת של Google Play Services, האפליקציה יכולה להתקשר אל GoogleApiAvailability.makeGooglePlayServicesAvailable()
כדי לאפשר למשתמשים להוריד את Google Play Services מ-Play Store.
אינטרנט
הגדרה של פרטי כניסה לאתרים באמצעות FCM
ממשק האינטרנט FCM משתמש בפרטי כניסה לאינטרנט שנקראים Voluntary Application Server Identification (זיהוי שרת אפליקציות מרצון), או מפתחות VAPID, כדי לאשר בקשות שליחה לשירותי הודעות פוש נתמכים באינטרנט. כדי להירשם לקבלת הודעות פוש באפליקציה, צריך לשייך צמד מפתחות לפרויקט Firebase. אפשר ליצור זוג מפתחות חדש או לייבא את זוג המפתחות הקיים דרך מסוף Firebase.
התקנת הפלאגין FCM
אם עוד לא עשיתם זאת, מתקינים ומפעילים את הפלאגינים של Firebase ל-Flutter.
מהרמה הבסיסית (root) של פרויקט Flutter, מריצים את הפקודה הבאה כדי להתקין את הפלאגין:
flutter pub add firebase_messaging
בסיום התהליך, בונים מחדש את אפליקציית Flutter:
flutter run
גישה לטוקן הרישום
כדי לשלוח הודעה למכשיר ספציפי, צריך לדעת את טוקן הרישום של המכשיר. כדי לאחזר את אסימון הרישום של מופע אפליקציה, קוראים ל-getToken()
. אם לא ניתנה הרשאה לשליחת התראות, השיטה הזו תבקש מהמשתמש הרשאות לשליחת התראות. אחרת, הפונקציה מחזירה אסימון או דוחה את ההבטחה בגלל שגיאה.
// You may set the permission requests to "provisional" which allows the user to choose what type
// of notifications they would like to receive once the user receives a notification.
final notificationSettings = await FirebaseMessaging.instance.requestPermission(provisional: true);
// For apple platforms, make sure the APNS token is available before making any FCM plugin API calls
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
if (apnsToken != null) {
// APNS token is available, make FCM plugin API requests...
}
בפלטפורמות אינטרנט, מעבירים את המפתח הציבורי של VAPID אל getToken()
:
final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");
כדי לקבל התראה בכל פעם שהטוקן מתעדכן, צריך להירשם לonTokenRefresh
stream:
FirebaseMessaging.instance.onTokenRefresh
.listen((fcmToken) {
// TODO: If necessary send token to application server.
// Note: This callback is fired at each app startup and whenever a new
// token is generated.
})
.onError((err) {
// Error getting token.
});
מניעת הפעלה אוטומטית
כשנוצר FCM אסימון רישום, הספרייה מעלה את המזהה ואת נתוני ההגדרה ל-Firebase. אם אתם מעדיפים למנוע יצירה אוטומטית של טוקנים, אתם יכולים להשבית את האתחול האוטומטי בזמן הבנייה.
iOS
ב-iOS, מוסיפים ערך של מטא-נתונים ל-Info.plist
:
FirebaseMessagingAutoInitEnabled = NO
Android
ב-Android, כדי להשבית את איסוף הנתונים ב-Analytics ואת ההפעלה האוטומטית של FCM (חובה להשבית את שניהם), מוסיפים את ערכי המטא-נתונים האלה אל AndroidManifest.xml
:
<meta-data
android:name="firebase_messaging_auto_init_enabled"
android:value="false" />
<meta-data
android:name="firebase_analytics_collection_enabled"
android:value="false" />
הפעלה מחדש של FCM אתחול אוטומטי בזמן ריצה
כדי להפעיל הפעלה אוטומטית של מופע ספציפי של אפליקציה, קוראים ל-setAutoInitEnabled()
:
await FirebaseMessaging.instance.setAutoInitEnabled(true);
הערך הזה נשמר גם אחרי הפעלה מחדש של האפליקציה, אחרי שהוא מוגדר.
שליחת הודעת בדיקה
- מתקינים את האפליקציה ומפעילים אותה במכשיר היעד. במכשירי אפל, צריך לאשר את הבקשה להרשאה לקבל התראות מרחוק.
- מוודאים שהאפליקציה פועלת ברקע במכשיר.
- במסוף Firebase, פותחים את הדף 'הודעות'.
- אם זו ההודעה הראשונה שלכם, בוחרים באפשרות יצירת הקמפיין הראשון.
- בוחרים באפשרות הודעות התראה של Firebase ולוחצים על יצירה.
- אחרת, בכרטיסייה קמפיינים, בוחרים באפשרות קמפיין חדש ואז באפשרות התראות.
- מזינים את הטקסט של ההודעה.
- בחלונית השמאלית, לוחצים על שליחת הודעת בדיקה.
- בשדה Add an FCM registration token (הוספת טוקן רישום של FCM), מזינים את טוקן הרישום.
- בוחרים באפשרות בדיקה.
אחרי שבוחרים באפשרות בדיקה, ההתראה אמורה להתקבל במכשיר הלקוח שמטרגטים, כשהאפליקציה פועלת ברקע.
כדי לקבל תובנות לגבי מסירת הודעות לאפליקציה, אפשר לעיין בFCMלוח הבקרה של הדוחות, שבו מתועד מספר ההודעות שנשלחו ונפתחו במכשירי Apple ובמכשירי Android, וגם נתוני חשיפות של אפליקציות ל-Android.
טיפול באינטראקציה
כשמשתמשים מקישים על התראה, התנהגות ברירת המחדל גם ב-Android וגם ב-iOS היא פתיחת האפליקציה. אם האפליקציה מסתיימת, היא תופעל, ואם היא ברקע, היא תועבר לחזית.
בהתאם לתוכן ההתראה, יכול להיות שתרצו לטפל באינטראקציה של המשתמש כשהאפליקציה נפתחת. לדוגמה, אם הודעת צ'אט חדשה נשלחת באמצעות התראה והמשתמש בוחר בה, יכול להיות שתרצו לפתוח את השיחה הספציפית כשהאפליקציה נפתחת.
חבילת firebase-messaging
מספקת שתי דרכים לטפל באינטראקציה הזו:
-
getInitialMessage():
אם האפליקציה נפתחת ממצב שהופסק, השיטה הזו מחזירהFuture
שמכילRemoteMessage
. אחרי השימוש, הרישיון ל-RemoteMessage
יוסר. -
onMessageOpenedApp
:Stream
ששולחRemoteMessage
כשהאפליקציה נפתחת ממצב רקע.
כדי להבטיח חוויה חלקה למשתמשים, צריך לטפל בשני התרחישים. בדוגמת הקוד הבאה מוסבר איך אפשר לעשות את זה:
class Application extends StatefulWidget { @override StatecreateState() => _Application(); } class _Application extends State { // In this example, suppose that all messages contain a data field with the key 'type'. Future setupInteractedMessage() async { // Get any messages which caused the application to open from // a terminated state. RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); // If the message also contains a data property with a "type" of "chat", // navigate to a chat screen if (initialMessage != null) { _handleMessage(initialMessage); } // Also handle any interaction when the app is in the background using a // Stream listener FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage); } void _handleMessage(RemoteMessage message) { if (message.data['type'] == 'chat') { Navigator.pushNamed(context, '/chat', arguments: ChatArguments(message), ); } } @override void initState() { super.initState(); // Run code required to handle interacted messages in an async function // as initState() must not be async setupInteractedMessage(); } @override Widget build(BuildContext context) { return Text("..."); } }
אופן הטיפול באינטראקציה תלוי בהגדרה שלכם. בדוגמה שמוצגת למעלה מוסבר שימוש בסיסי ב-StatefulWidget
.
השלבים הבאים
אחרי שמסיימים את שלבי ההגדרה, יש כמה אפשרויות להמשך העבודה עם FCM ל-Flutter: