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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

โทเค็นการลงทะเบียนอาจเปลี่ยนแปลงเมื่อเกิดเหตุการณ์ต่อไปนี้

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

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

หากต้องการรับโทเค็นการลงทะเบียน ให้ใช้โปรโตคอลผู้รับมอบสิทธิ์การรับส่งข้อความ และตั้งค่า FIRMessaging's delegate พร็อพเพอร์ตี้หลังจากเรียกใช้ [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 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 แทนการระบุเมธอดผู้รับมอบสิทธิ์ก็ได้ พร็อพเพอร์ตี้โทเค็นจะมีค่าโทเค็นปัจจุบันเสมอ

ปิดใช้การแลกเปลี่ยนเมธอด: การแมปโทเค็น 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 โดยเฉพาะอย่างยิ่ง ให้ดำเนินการ Callback ให้เสร็จสมบูรณ์ด้วย FIRMessaging extensionHelper ดังที่แสดงแทนการดำเนินการ Callback ให้เสร็จสมบูรณ์ด้วย self.contentHandler(self.bestAttemptContent);

@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 และการมีส่วนร่วม > Messaging

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

    • หากเป็นการส่งข้อความครั้งแรก ให้ทำดังนี้

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

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

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

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

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

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

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

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

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

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

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

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

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