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

באפליקציות לקוח של Apple, אפשר לקבל מטענים ייעודיים (payloads) של התראות ונתונים בנפח של עד 4,096 בייט בממשק ה-APN של Firebase להעברת הודעות בענן.

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

שינוי פונקציונליות של העברת הודעות בענן ב-Firebase

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

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

אם עדיין לא עשיתם זאת, עליכם להוסיף את Firebase לפרויקט של Apple.

העלאת מפתח האימות של פריטי ה-APN

מעלים את מפתח האימות של קובצי ה-APN ל-Firebase. אם עדיין אין לך מפתח אימות APN, צריך ליצור אותו ב-Apple Developer Member Center.

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

  2. בקטע מפתח אימות של APN בקטע הגדרת אפליקציה ל-iOS, לוחצים על הלחצן העלאה.

  3. מאתרים את המיקום שבו שמרתם את המפתח, בוחרים אותו ולוחצים על Open. מוסיפים את מזהה המפתח (זמין ב- Apple Developer Member Center) ולוחצים על 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];

איך ניגשים לאסימון הרישום

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

באותו אופן שבו פלטפורמות של 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(complete:). תתקבל שגיאה שאינה 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 במקום לספק שיטת הענקת גישה. לנכס האסימון יש תמיד את הערך הנוכחי של האסימון.

ההחלקה מושבתת: מיפוי של אסימון ה-APN ואסימון הרישום

אם השבתת את התכונה 'שינוי מצב השיטה', או אם אתם יוצרים אפליקציה של SwiftUI, תצטרכו למפות באופן מפורש את אסימון ה-APNs אל אסימון הרישום של FCM. מטמיעים את השיטה application(_:didRegisterForRemoteNotificationsWithDeviceToken:) כדי לאחזר את אסימון ה-APN, ואז מגדירים את המאפיין 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, אפשר לגשת אליו ולהאזין לאירועי רענון באמצעות אותן שיטות כמו הפעלת 'סוויץ'.

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

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

FirebaseMessagingAutoInitEnabled = NO

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

Swift

Messaging.messaging().autoInitEnabled = true

Objective-C

[FIRMessaging messaging].autoInitEnabled = YES;

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

השלבים הבאים

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