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

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

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

การผสานรวมเมธอดใน Firebase Cloud Messaging

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

เพิ่ม Firebase ไปยังโปรเจ็กต์ Apple

เพิ่ม Firebase ในโปรเจ็กต์ Apple หากยังไม่ได้ทำ

อัปโหลดคีย์การตรวจสอบสิทธิ์ APNs

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

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

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

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

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

ลงทะเบียนแอปเพื่อรับการแจ้งเตือนจากระยะไกลเมื่อเริ่มต้นหรือเมื่อถึงจุดที่ต้องการในขั้นตอนการสมัคร การเรียกใช้ 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 จะสร้างโทเค็นการลงทะเบียนสำหรับอินสแตนซ์ของแอปไคลเอ็นต์เมื่อเปิดแอป โทเค็นนี้คล้ายกับโทเค็นอุปกรณ์ APNs ซึ่งจะช่วยให้คุณส่งการแจ้งเตือนแบบกำหนดเป้าหมายไปยังอินสแตนซ์ที่เจาะจงของแอปได้

FCM จะให้โทเค็นการลงทะเบียนผ่านเมธอด messaging:didReceiveRegistrationToken: ของ FIRMessagingDelegate ในลักษณะเดียวกับที่แพลตฟอร์ม Apple มักจะส่งโทเค็นอุปกรณ์ APNs เมื่อเริ่มใช้งานแอป FCM SDK จะเรียกโทเค็นใหม่หรือโทเค็นที่มีอยู่ในระหว่างการเปิดแอปครั้งแรก และเมื่อใดก็ตามที่โทเค็นมีการอัปเดตหรือใช้ไม่ได้ ในทุกกรณี FCM SDK จะเรียก messaging:didReceiveRegistrationToken: ด้วยโทเค็นที่ถูกต้อง

โทเค็นการลงทะเบียนอาจเปลี่ยนแปลงในกรณีต่อไปนี้

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

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

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

Swift

Messaging.messaging().delegate = self

Objective-C

[FIRMessaging messaging].delegate = self;

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

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

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

คุณเรียกโทเค็นได้โดยตรงโดยใช้ 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 ปิดอยู่: การแมปโทเค็น APN และโทเค็นการลงทะเบียน

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