เริ่มต้นใช้งาน Firebase Cloud Messaging ในแอปแพลตฟอร์ม Apple

เลือกแพลตฟอร์ม: iOS+ Android เว็บ Flutter Unity C++


คู่มือนี้อธิบายวิธีเริ่มต้นใช้งาน Firebase Cloud Messaging ในแอปไคลเอ็นต์แพลตฟอร์ม Apple (เช่น iOS) เพื่อให้คุณส่งข้อความได้อย่างน่าเชื่อถือ

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

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

ก่อนเริ่มต้นใช้งาน ให้เพิ่ม Firebase ในโปรเจ็กต์ Apple

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

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

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

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

  1. ในFirebaseคอนโซล ให้ไปที่ การตั้งค่า > ทั่วไป จากนั้นคลิกแท็บ Cloud Messaging
  2. ในคีย์การตรวจสอบสิทธิ์ APNs ภายในการกำหนดค่าแอป iOS คลิกอัปโหลดเพื่ออัปโหลดคีย์การตรวจสอบสิทธิ์สำหรับการพัฒนา หรือ คีย์การตรวจสอบสิทธิ์สำหรับการใช้งานจริง หรือทั้ง 2 อย่าง ทั้งนี้คุณต้องระบุอย่างน้อย 1 รายการ
  3. เรียกดูตำแหน่งที่คุณบันทึกคีย์ เลือกคีย์ แล้วคลิกเปิด เพิ่มรหัสคีย์สำหรับคีย์ (มีอยู่ใน ศูนย์สมาชิก Apple Developer) แล้วคลิกอัปโหลด

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

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

เข้าถึงรหัสการติดตั้ง Firebase

โดยค่าเริ่มต้น FCM SDK จะลงทะเบียนอินสแตนซ์ของแอปด้วย FCM และแสดงผล รหัสการติดตั้ง Firebase (FID) สําหรับอินสแตนซ์ของแอปไคลเอ็นต์เมื่อเปิดแอป FID นี้ช่วยให้คุณส่งการแจ้งเตือนที่กำหนดเป้าหมายไปยังอินสแตนซ์ใดก็ได้ของแอป เช่นเดียวกับโทเค็นอุปกรณ์ APNs

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

ดูรายละเอียดเกี่ยวกับเวลาที่ออก FID อีกครั้งและวิธีตรวจสอบด้วยตนเองได้ที่ ตรวจสอบ วงจรการใช้งานรหัสการติดตั้ง Firebase

เปิดใช้การลงทะเบียนโดยใช้รหัสการติดตั้ง Firebase

หากต้องการเปิดใช้การลงทะเบียนอินสแตนซ์ของแอปกับ FCM โดยใช้ รหัสการติดตั้ง Firebase (FID) ให้เพิ่มค่าสถานะข้อมูลเมตาต่อไปนี้ลงในไฟล์ Info.plist ไม่ใช่ไฟล์ GoogleService-Info.plist

FirebaseMessagingInstallationIdEnabled = YES

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

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

Swift

Messaging.messaging().delegate = self

Objective-C

[FIRMessaging messaging].delegate = self;

ใช้didReceiveRegistrationวิธี

ระบบจะกำหนดเป้าหมายไปยังอินสแตนซ์ของแอปโดยใช้ FID เมื่อการลงทะเบียนเสร็จสมบูรณ์ หากต้องการรับ FID เมื่อลงทะเบียน ให้ใช้เมธอด messaging:didReceiveRegistration: โดยปกติแล้วจะเรียกใช้เมธอดนี้ 1 ครั้งต่อการเริ่มต้นแอปด้วย FID เมื่อเรียกใช้เมธอดนี้ คุณจะดำเนินการต่อไปนี้ได้

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

Swift

func messaging(_ messaging: Messaging, didReceiveRegistration installationId: String?) {
  print("Firebase Installation ID: \(String(describing: installationId))")
  // Note: This callback is fired at each app startup.

  if let installationId = installationId {
    // Send the Firebase Installation ID to your app server.
    sendRegistrationToServer(installationId)
  }
}
    

Objective-C

- (void)messaging:(FIRMessaging *)messaging didReceiveRegistration:(nullable NSString *)installationId {
  NSLog(@"Firebase Installation ID: %@", installationId);
  // Note: This callback is fired at each app startup.

  if (installationId != nil) {
    // Send the Firebase Installation ID to your app server.
    [self sendRegistrationToServer:installationId];
  }
}
    

ลงทะเบียนด้วยตนเองเมื่อปิดใช้การเริ่มต้นอัตโนมัติ

หากปิดใช้การเริ่มต้นอัตโนมัติ FCM SDK จะไม่ลงทะเบียนอินสแตนซ์แอปกับ FCM โดยอัตโนมัติเมื่อเริ่มต้นแอป คุณต้องเรียกใช้ register เมื่อแอปเริ่มต้นเพื่อทริกเกอร์การลงทะเบียนและการนำส่ง FID ผ่านเมธอด messaging:didReceiveRegistration: ดังนี้

Swift

// Trigger manual registration if auto-initialization is turned off.
Messaging.messaging().register { error in
    if let error = error {
        // Handle the error
        print("Failed registering: \(error)")
        return
    }
    // Registration was successful. FID is delivered through the messaging:didReceiveRegistration: method.
    print("Successfully registered.")
}
    

Objective-C

// Trigger manual registration if auto-initialization is turned off.
[[FIRMessaging messaging] registerWithCompletion:^(NSError * _Nullable error) {
    if (error) {
        // Handle the error
        NSLog(@"Failed registering: %@", error);
        return;
    }
    // Registration was successful. FID is delivered through the messaging:didReceiveRegistration: method.
    NSLog(@"Successfully registered.");
}];
    

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

หากปิดใช้การแลกเปลี่ยนเมธอดหรือกําลังสร้างแอป SwiftUI คุณต้องแมปโทเค็น APNs กับรหัสการติดตั้ง Firebase (FID) อย่างชัดเจน ใช้เมธอด 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;
}

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

เข้าถึงโทเค็นการลงทะเบียน

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

ในลักษณะเดียวกับที่แพลตฟอร์มของ Apple มักจะส่งโทเค็นอุปกรณ์ APNs เมื่อแอปเริ่มต้น FCM จะให้โทเค็นการลงทะเบียนผ่านเมธอด FIRMessagingDelegate's messaging:didReceiveRegistrationToken: SDK ของ FCM จะเรียกข้อมูลโทเค็นใหม่หรือโทเค็นที่มีอยู่ระหว่างการเปิดตัวแอปครั้งแรกและ ทุกครั้งที่มีการอัปเดตหรือทำให้โทเค็นไม่ถูกต้อง ในทุกกรณี 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 remote FCM registration token: \(error)")
  } else if let token = token {
    print("Remote instance ID token: \(token)")
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString * _Nullable token, NSError * _Nullable error) {
  if (error != nil) {
    NSLog(@"Error fetching the remote FCM registration token: %@", error);
  } else {
    NSLog(@"Remote FCM registration token: %@", token);
    NSString* message =
      [NSString stringWithFormat:@"FCM registration token: %@", token];
    // display message
    NSLog(@"%@", message);
  }
}];

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

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

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

Swift

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
  print("Firebase registration token: \(String(describing: fcmToken))")
  // 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: การแมปโทเค็น APNs และโทเค็นการลงทะเบียน

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

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

หากต้องการเพิ่มส่วนขยายบริการ ให้ทํางานการตั้งค่าที่จําเป็นสําหรับการแก้ไขและ การแสดง การแจ้งเตือน ใน APNs จากนั้นเพิ่ม FCM Extension Helper API ใน NotificationService.m กล่าวคือ ให้ใช้ FIRMessaging extensionHelper แทนการใช้ self.contentHandler(self.bestAttemptContent); เพื่อดำเนินการ Callback ให้เสร็จสมบูรณ์ ดังที่แสดง

@interface NotificationService () <NSURLSessionDelegate>
@property(nonatomic) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property(nonatomic) UNMutableNotificationContent *bestAttemptContent;
@end

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];

    // Modify the notification content here as you want
self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]",
self.bestAttemptContent.title];

  // Call FIRMessaging extension helper API.
  [[FIRMessaging extensionHelper] populateNotificationContent:self.bestAttemptContent
withContentHandler:contentHandler];

}
...

ส่งข้อความแจ้งเตือน

  1. ติดตั้งและเรียกใช้แอปในอุปกรณ์เป้าหมาย ในอุปกรณ์ Apple ให้ยอมรับ คำขอสิทธิ์เพื่อรับการแจ้งเตือนจากระยะไกล

  2. ตรวจสอบว่าแอปทำงานอยู่เบื้องหลังในอุปกรณ์

  3. ในFirebaseคอนโซล ให้ไปที่ DevOps และการมีส่วนร่วม > การรับส่งข้อความ

  4. สร้างแคมเปญ

    • หากนี่เป็นข้อความแรกที่คุณส่ง

      1. เลือกสร้างแคมเปญแรก

      2. เลือกข้อความการแจ้งเตือนของ Firebase แล้วเลือกสร้าง

    • หากเคยสร้างแคมเปญไว้แล้ว ให้ทำดังนี้

      1. ในแท็บแคมเปญ ให้เลือกแคมเปญใหม่

      2. คลิกการแจ้งเตือน

  5. ป้อนข้อความ

  6. เลือกส่งข้อความทดสอบจากแผงด้านขวา

  7. ป้อนโทเค็นการลงทะเบียนในช่องที่มีป้ายกำกับว่าเพิ่มรหัสการติดตั้ง Firebase หรือFCM โทเค็นการลงทะเบียน

  8. เลือกทดสอบ

หลังจากเลือกทดสอบแล้ว อุปกรณ์ไคลเอ็นต์เป้าหมายซึ่งมีแอปทำงานในเบื้องหลังควรได้รับการแจ้งเตือน

หากต้องการข้อมูลเชิงลึกเกี่ยวกับการนำส่งข้อความไปยังแอป ให้ไปที่DevOps และการมีส่วนร่วม > การรับส่งข้อความ > แดชบอร์ดรายงาน ในคอนโซล Firebase แดชบอร์ดนี้จะบันทึกจำนวนข้อความที่ส่ง และเปิดในอุปกรณ์ Apple และ Android พร้อมกับข้อมูล "การแสดงผล" (การแจ้งเตือนที่ผู้ใช้เห็น) สำหรับแอป Android

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

หลังจากทำตามขั้นตอนการตั้งค่าเสร็จแล้ว คุณมีตัวเลือกในการดำเนินการต่อด้วย FCM สำหรับแพลตฟอร์ม Apple ดังนี้