ตั้งค่าแอปไคลเอ็นต์ 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 และการบันทึกข้อมูลการวิเคราะห์ในระหว่างการจัดการ Callback ของข้อความดาวน์สตรีม นักพัฒนาแอปที่ไม่ต้องการใช้ Swizzling สามารถปิดใช้ได้โดยเพิ่ม Flag FirebaseAppDelegateProxyEnabled ในไฟล์ Info.plist ของแอปและตั้งค่าเป็น NO (ค่าบูลีน) ส่วนที่เกี่ยวข้องของคู่มือจะมีตัวอย่างโค้ด ทั้งที่มีและไม่ได้เปิดใช้การผสานเมธอด

เพิ่ม Firebase ลงในโปรเจ็กต์ Apple

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

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

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

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

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

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:) ระบบจะแสดงข้อผิดพลาดที่ไม่เป็นค่าว่างหากเรียกโทเค็นไม่สำเร็จ

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

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

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