ตั้งค่าแอปไคลเอนต์ Firebase Cloud Messaging บนแพลตฟอร์ม Apple

สำหรับแอปไคลเอนต์ Apple คุณสามารถรับการแจ้งเตือนและข้อมูลเพย์โหลดสูงสุด 4,000 ไบต์ผ่านอินเทอร์เฟซ APN ของ Firebase Cloud Messaging

หากต้องการเขียนโค้ดไคลเอ็นต์ของคุณใน Objective-C หรือ Swift เราขอแนะนำให้คุณใช้ FIRMessaging API ตัวอย่างการเริ่มต้นอย่างรวดเร็ว มีโค้ดตัวอย่างสำหรับทั้งสองภาษา

วิธีการ Swizzling ใน Firebase Cloud Messaging

FCM SDK ดำเนินการสลับวิธีการในสองส่วนหลัก: การแมปโทเค็น APN ของคุณ กับโทเค็นการลงทะเบียน FCM และการเก็บข้อมูลการวิเคราะห์ระหว่าง การจัดการการเรียกกลับข้อความดาวน์สตรี ม นักพัฒนาซอฟต์แวร์ที่ไม่ต้องการใช้ Swizzling สามารถปิดใช้งานได้โดยเพิ่มแฟล็ก FirebaseAppDelegateProxyEnabled ในไฟล์ Info.plist ของแอป และตั้งค่าเป็น NO (ค่าบูลีน) ส่วนที่เกี่ยวข้องของคำแนะนำจะมีตัวอย่างโค้ด ทั้งที่มีและไม่มีการเปิดใช้งานวิธีการสลับ

เพิ่ม Firebase ให้กับโปรเจ็กต์ Apple ของคุณ

หากคุณยังไม่ได้ เพิ่ม Firebase ในโครงการ Apple ของคุณ

อัปโหลดคีย์การตรวจสอบสิทธิ์ APN ของคุณ

อัปโหลดคีย์การตรวจสอบสิทธิ์ APN ของคุณไปยัง Firebase หากคุณยังไม่มีคีย์การตรวจสอบสิทธิ์ APN โปรดสร้างคีย์ดังกล่าวใน ศูนย์สมาชิกนักพัฒนา Apple

  1. ภายในโปรเจ็กต์ของคุณในคอนโซล Firebase ให้เลือกไอคอนรูปเฟือง เลือก การตั้งค่าโปรเจ็กต์ จากนั้นเลือกแท็บ Cloud Messaging

  2. ใน คีย์การตรวจสอบสิทธิ์ APN ใต้ การกำหนดค่าแอป iOS ให้คลิกปุ่ม อัปโหลด

  3. เรียกดูตำแหน่งที่คุณบันทึกกุญแจไว้ เลือกแล้วคลิก เปิด เพิ่ม ID คีย์สำหรับคีย์ (มีอยู่ใน Apple Developer Member Center ) แล้วคลิก อัปโหลด

ลงทะเบียนเพื่อรับการแจ้งเตือนระยะไกล

เมื่อเริ่มต้นระบบหรือ ณ จุดที่ต้องการในขั้นตอนการสมัครของคุณ ให้ลงทะเบียนแอปของคุณสำหรับการแจ้งเตือนระยะไกล โทร registerForRemoteNotifications ดังแสดง:

สวิฟท์


UNUserNotificationCenter.current().delegate = self

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

application.registerForRemoteNotifications()

วัตถุประสงค์-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 โดยทั่วไปจะส่งโทเค็นอุปกรณ์ APN เมื่อเริ่มแอป FCM จะจัดเตรียมโทเค็นการลงทะเบียนผ่าน messaging:didReceiveRegistrationToken: ของ FIRMessagingDelegate FCM SDK ดึงข้อมูลโทเค็นใหม่หรือที่มีอยู่ในระหว่างการเปิดตัวแอปครั้งแรกและเมื่อใดก็ตามที่โทเค็นได้รับการอัปเดตหรือใช้งานไม่ได้ ในทุกกรณี FCM SDK จะเรียก messaging:didReceiveRegistrationToken: ด้วยโทเค็นที่ถูกต้อง

โทเค็นการลงทะเบียนอาจมีการเปลี่ยนแปลงเมื่อ:

  • แอปได้รับการกู้คืนบนอุปกรณ์ใหม่
  • ผู้ใช้ถอนการติดตั้ง/ติดตั้งแอปใหม่
  • ผู้ใช้ล้างข้อมูลแอป

ตั้งค่าผู้รับมอบสิทธิ์การส่งข้อความ

หากต้องการรับโทเค็นการลงทะเบียน ให้ใช้โปรโตคอลการมอบหมายการส่งข้อความและตั้งค่าคุณสมบัติ delegate ของ FIRMessaging หลังจากเรียก [FIRApp configure] ตัวอย่างเช่น หากผู้รับมอบสิทธิ์แอปพลิเคชันของคุณสอดคล้องกับโปรโตคอลผู้รับมอบสิทธิ์การส่งข้อความ คุณสามารถตั้งค่าผู้รับมอบสิทธิ์ใน application:didFinishLaunchingWithOptions: ให้กับตัวมันเองได้

สวิฟท์

Messaging.messaging().delegate = self

วัตถุประสงค์-C

[FIRMessaging messaging].delegate = self;

กำลังดึงโทเค็นการลงทะเบียนปัจจุบัน

โทเค็นการลงทะเบียนจะถูกส่งผ่านวิธี messaging:didReceiveRegistrationToken: โดยทั่วไปจะเรียกวิธีนี้หนึ่งครั้งต่อแอปที่เริ่มต้นด้วยโทเค็นการลงทะเบียน เมื่อเรียกวิธีนี้ เป็นเวลาที่เหมาะสมที่สุดในการ:

  • หากโทเค็นการลงทะเบียนเป็นโทเค็นใหม่ ให้ส่งไปยังเซิร์ฟเวอร์แอปพลิเคชันของคุณ
  • สมัครสมาชิกโทเค็นการลงทะเบียนในหัวข้อ สิ่งนี้จำเป็นสำหรับการสมัครสมาชิกใหม่หรือในสถานการณ์ที่ผู้ใช้ติดตั้งแอพใหม่อีกครั้ง

คุณสามารถดึงโทเค็นได้โดยตรงโดยใช้ โทเค็น (เสร็จสิ้น :) มีข้อผิดพลาดที่ไม่ใช่ค่าว่างหากการเรียกโทเค็นล้มเหลวไม่ว่าด้วยวิธีใดก็ตาม

สวิฟท์

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)"
  }
}

วัตถุประสงค์-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;
  }
}];

คุณสามารถใช้วิธีนี้เมื่อใดก็ได้เพื่อเข้าถึงโทเค็นแทนการจัดเก็บ

ตรวจสอบการรีเฟรชโทเค็น

หากต้องการรับการแจ้งเตือนทุกครั้งที่อัปเดตโทเค็น ให้ระบุผู้รับมอบสิทธิ์ที่สอดคล้องกับโปรโตคอลผู้รับมอบสิทธิ์การส่งข้อความ ตัวอย่างต่อไปนี้จะลงทะเบียนผู้รับมอบสิทธิ์และเพิ่มวิธีการมอบสิทธิ์ที่เหมาะสม:

สวิฟท์

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.
}

วัตถุประสงค์-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 และโทเค็นการลงทะเบียนของคุณ

หากคุณปิดใช้งานวิธีการ Swizzling หรือคุณกำลังสร้างแอป SwiftUI คุณจะต้องแมปโทเค็น APN ของคุณกับโทเค็นการลงทะเบียน FCM อย่างชัดเจน ใช้เมธอด application(_:didRegisterForRemoteNotificationsWithDeviceToken:) เพื่อดึงโทเค็น APNs จากนั้นตั้งค่าคุณสมบัติ apnsToken ของ Messaging :

สวิฟท์

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

วัตถุประสงค์-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 อีกครั้ง คุณสามารถโทรรันไทม์ได้:

สวิฟท์

Messaging.messaging().autoInitEnabled = true

วัตถุประสงค์-C

[FIRMessaging messaging].autoInitEnabled = YES;

ค่านี้จะคงอยู่ตลอดทั้งการรีสตาร์ทแอปเมื่อตั้งค่าแล้ว

ขั้นตอนถัดไป

หลังจากที่คุณตั้งค่าไคลเอนต์ Apple แล้ว คุณก็พร้อมที่จะเพิ่มการจัดการข้อความและการทำงานขั้นสูงอื่นๆ ให้กับแอปของคุณ ดูคำแนะนำเหล่านี้สำหรับข้อมูลเพิ่มเติม: