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

จะทำงานไม่ถูกต้อง

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

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

  1. ในคอนโซล Firebase ให้ไปที่ การตั้งค่า > ทั่วไป จากนั้นคลิกแท็บ Cloud Messaging
  2. ในคีย์การตรวจสอบสิทธิ์ APNs ภายในการกำหนดค่าแอป iOS คลิกอัปโหลดเพื่ออัปโหลดคีย์การตรวจสอบสิทธิ์สำหรับการพัฒนา หรือ คีย์การตรวจสอบสิทธิ์สำหรับการใช้งานจริง หรือทั้ง 2 อย่าง ต้องระบุอย่างน้อย 1 รายการ
  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];

เข้าถึงรหัสการติดตั้ง 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.");
}];
    

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

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

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

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

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

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