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

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

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

วิธีการหมุนวนใน Firebase Cloud Messaging

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

เพิ่ม Firebase ในโครงการ Apple ของคุณ

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

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

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

  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: วิธีการนี้เรียกว่าโดยทั่วไปหนึ่งครั้งต่อแอปที่เริ่มต้นด้วยโทเค็นการลงทะเบียน เมื่อเรียกใช้เมธอดนี้ เป็นเวลาที่เหมาะสมที่สุดในการ:

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

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

สวิฟต์

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 แทนที่จะระบุเมธอดผู้รับมอบสิทธิ์ คุณสมบัติโทเค็นมีค่าโทเค็นปัจจุบันเสมอ

ปิดใช้งาน Swizzling: การแมปโทเค็น 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 แล้ว คุณก็พร้อมที่จะเพิ่มการจัดการข้อความและลักษณะการทำงานขั้นสูงอื่นๆ ให้กับแอปของคุณ ดูคำแนะนำเหล่านี้สำหรับข้อมูลเพิ่มเติม: