איך מגדירים אפליקציית לקוח של Firebase Cloud Messaging בפלטפורמות של Apple

באפליקציות לקוח של Apple, אפשר לקבל עד 4,096 בייטים של נתונים והתראות דרך ממשק APNs‏ Firebase Cloud Messaging.

כדי לכתוב את קוד הלקוח ב-Objective-C או ב-Swift, מומלץ להשתמש ב-FIRMessaging API. בדוגמה למתחילים מופיע קוד לדוגמה בשתי השפות.

שינוי פונקציונליות של שיטה ב-Firebase Cloud Messaging

ה-SDK של FCM מבצע החלפת שיטות בשני תחומים מרכזיים: מיפוי האסימון של APNs לאסימון הרישום של FCM וצילום נתוני ניתוח במהלך טיפול בקריאה חוזרת (callback) של הודעות במורד הזרם. מפתחים שלא רוצים להשתמש בהחלפה יכולים להשבית אותה על ידי הוספת הדגל FirebaseAppDelegateProxyEnabled לקובץ Info.plist של האפליקציה והגדרה שלו לערך NO (ערך בוליאני). בחלקים הרלוונטיים במדריכים מפורטות דוגמאות לקוד, גם עם הפעלת שינוי השמות של השיטות וגם בלי.

הוספת Firebase לפרויקט ב-Apple

אם עדיין לא עשיתם זאת, מוסיפים את Firebase לפרויקט ב-Apple.

העלאת מפתח האימות של APNs

מעלים את מפתח האימות של APNs ל-Firebase. אם עדיין אין לכם מפתח אימות של APNs, עליכם ליצור מפתח כזה במרכז החברים של מפתחי Apple.

  1. בתוך הפרויקט במסוף Firebase, לוחצים על סמל גלגל השיניים, בוחרים באפשרות Project Settings (הגדרות הפרויקט) ואז בוחרים בכרטיסייה Cloud Messaging (Cloud Messaging).

  2. בקטע APNs authentication key בקטע iOS app configuration, לוחצים על הלחצן Upload.

  3. עוברים למיקום שבו שמרתם את המפתח, בוחרים אותו ולוחצים על פתיחה. מוסיפים את מזהה המפתח (זמין ב מרכז החברים של Apple Developer) ולוחצים על Upload.

הרשמה לקבלת התראות מרחוק

בזמן ההפעלה או בנקודה הרצויה בתהליך האפליקציה, רושמים את האפליקציה לקבלת התראות מרחוק. קוראים ל-registerForRemoteNotifications כפי שמוצג:

Swift

UNUserNotificationCenter.current().delegate = self

let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
  options: authOptions,
  completionHandler: { _, _ in }
)

application.registerForRemoteNotifications()

Objective-C

[UNUserNotificationCenter currentNotificationCenter].delegate = self;
UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
    UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
[[UNUserNotificationCenter currentNotificationCenter]
    requestAuthorizationWithOptions:authOptions
    completionHandler:^(BOOL granted, NSError * _Nullable error) {
      // ...
    }];

[application registerForRemoteNotifications];

גישה לטוקן הרישום

כברירת מחדל, ה-SDK של FCM יוצר אסימון רישום למופע של אפליקציית הלקוח בזמן הפעלת האפליקציה. בדומה לאסימון המכשיר של APNs, האסימון הזה מאפשר לכם לשלוח התראות ממוקדות לכל מכונה מסוימת של האפליקציה.

בדומה לאופן שבו פלטפורמות Apple בדרך כלל מספקות אסימון מכשיר של APNs בזמן הפעלת האפליקציה,‏ FCM מספק אסימון רישום באמצעות השיטה messaging:didReceiveRegistrationToken: של FIRMessagingDelegate. ה-SDK של FCM מאחזר אסימון חדש או קיים במהלך ההפעלה הראשונית של האפליקציה, וגם בכל פעם שהאסימון מתעדכן או מבוטל. בכל המקרים, ה-SDK של FCM קורא ל-messaging:didReceiveRegistrationToken: עם אסימון תקין.

אסימון הרישום עשוי להשתנות במקרים הבאים:

  • האפליקציה משוחזרת במכשיר חדש
  • המשתמש מסיר או מתקין מחדש את האפליקציה
  • המשתמש מנקה את נתוני האפליקציה.

הגדרת הגורם שיכול לשלוח הודעות בשמכם

כדי לקבל אסימוני רישום, מטמיעים את פרוטוקול הענקת הגישה להעברת הודעות ומגדירים את המאפיין delegate של FIRMessaging אחרי שמפעילים את [FIRApp configure]. לדוגמה, אם נציג האפליקציה עומד בפרוטוקול של נציג ההודעות, אפשר להגדיר את הנציג ב-application:didFinishLaunchingWithOptions: לעצמו.

Swift

Messaging.messaging().delegate = self

Objective-C

[FIRMessaging messaging].delegate = self;

אחזור של טוקן הרישום הנוכחי

אסימוני הרישום מועברים באמצעות השיטה messaging:didReceiveRegistrationToken:. השיטה הזו נקראת בדרך כלל פעם אחת לכל הפעלה של האפליקציה עם אסימון רישום. כשמתבצעת קריאה לשיטה הזו, זה הזמן האידיאלי:

  • אם אסימון הרישום חדש, שולחים אותו לשרת האפליקציות.
  • להירשם לטוקן הרישום לנושאים. הדבר נדרש רק למינויים חדשים או למקרים שבהם המשתמש התקין מחדש את האפליקציה.

אפשר לאחזר את האסימון ישירות באמצעות token(completion:). אם אחזור האסימון נכשל בכל צורה שהיא, תופיע שגיאה שאינה null.

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
  if (error != nil) {
    NSLog(@"Error getting FCM registration token: %@", error);
  } else {
    NSLog(@"FCM registration token: %@", token);
    self.fcmRegTokenMessage.text = token;
  }
}];

אפשר להשתמש בשיטה הזו בכל שלב כדי לגשת לאסימון במקום לאחסן אותו.

מעקב אחרי רענון הטוקן

כדי לקבל התראה בכל פעם שהאסימון מתעדכן, צריך לספק נציג שתואם לפרוטוקול של נציג שליחת ההודעות. בדוגמה הבאה מתבצע רישום של הנציג ומתווספת שיטת הנציג המתאימה:

Swift

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
  print("Firebase registration token: \(String(describing: fcmToken))")

  let dataDict: [String: String] = ["token": fcmToken ?? ""]
  NotificationCenter.default.post(
    name: Notification.Name("FCMToken"),
    object: nil,
    userInfo: dataDict
  )
  // TODO: If necessary send token to application server.
  // Note: This callback is fired at each app startup and whenever a new token is generated.
}

Objective-C

- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
    NSLog(@"FCM registration token: %@", fcmToken);
    // Notify about received token.
    NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"];
    [[NSNotificationCenter defaultCenter] postNotificationName:
     @"FCMToken" object:nil userInfo:dataDict];
    // TODO: If necessary send token to application server.
    // Note: This callback is fired at each app startup and whenever a new token is generated.
}

לחלופין, אפשר להאזין ל-NSNotification בשם kFIRMessagingRegistrationTokenRefreshNotification במקום לספק שיטת הענקת גישה. למאפיין הטוקן תמיד יש את הערך הנוכחי של הטוקן.

החלפת שמות (swizzling) מושבתת: מיפוי של טוקן APNs וטוקן הרישום

אם השבתתם את החלפת השיטות (method swizzling) או שאתם מפתחים אפליקציית SwiftUI, תצטרכו למפות באופן מפורש את אסימון APNs לאסימון הרישום FCM. מטמיעים את השיטה application(_:didRegisterForRemoteNotificationsWithDeviceToken:) כדי לאחזר את האסימון של APNs, ואז מגדירים את המאפיין apnsToken של Messaging:

Swift

func application(application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  Messaging.messaging().apnsToken = deviceToken
}

Objective-C

// With "FirebaseAppDelegateProxyEnabled": NO
- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [FIRMessaging messaging].APNSToken = deviceToken;
}

אחרי שיוצרים את אסימון ההרשמה FCM, אפשר לגשת אליו ולהאזין לאירועי רענון באמצעות אותן שיטות כמו כשה-swizzling מופעל.

מניעת אתחול אוטומטי

כשיוצרים אסימון רישום מסוג FCM, הספרייה מעלה את המזהה ונתוני ההגדרה ל-Firebase. אם אתם רוצים לקבל קודם אישור מפורש מהמשתמשים, תוכלו להשבית את FCM כדי למנוע יצירת אסימונים בזמן ההגדרה. כדי לעשות זאת, מוסיפים ערך מטא-נתונים ל-Info.plist (ולא ל-GoogleService-Info.plist):

FirebaseMessagingAutoInitEnabled = NO

כדי להפעיל מחדש את FCM, אפשר לבצע קריאה בסביבת זמן הריצה:

Swift

Messaging.messaging().autoInitEnabled = true

Objective-C

[FIRMessaging messaging].autoInitEnabled = YES;

אחרי שמגדירים את הערך הזה, הוא נשמר בכל הפעלה מחדש של האפליקציה.

השלבים הבאים

אחרי שמגדירים את לקוח Apple, אפשר להוסיף לאפליקציה טיפול בהודעות והתנהגות מתקדמת יותר. למידע נוסף, אפשר לעיין במדריכים הבאים: