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

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

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

การแลกเปลี่ยนเมธอดใน Firebase Cloud Messaging

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

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

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

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

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

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

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

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

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

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

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

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

ปิดใช้การสลับ: การแมปโทเค็น APNs และโทเค็นการลงทะเบียน

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

ป้องกันการเริ่มต้นอัตโนมัติ

เมื่อสร้างFCMโทเค็นการลงทะเบียน ไลบรารีจะอัปโหลดตัวระบุและข้อมูลการกำหนดค่าไปยัง Firebase หากต้องการขอรับการเลือกใช้ที่ชัดเจนจากผู้ใช้ก่อน คุณสามารถป้องกันการสร้างโทเค็นในเวลาที่กำหนดค่าได้โดยการปิดใช้ FCM โดยเพิ่มค่าข้อมูลเมตาลงใน Info.plist (ไม่ใช่GoogleService-Info.plist) ดังนี้

FirebaseMessagingAutoInitEnabled = NO

หากต้องการเปิดใช้ FCM อีกครั้ง คุณสามารถทำการเรียกใช้รันไทม์ได้โดยทำดังนี้

Swift

Messaging.messaging().autoInitEnabled = true

Objective-C

[FIRMessaging messaging].autoInitEnabled = YES;

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

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

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