| เลือกแพลตฟอร์ม: | 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
-
ในคอนโซล Firebase ให้ไปที่
Settings > General จากนั้นคลิกแท็บ Cloud Messaging - ในส่วนคีย์การตรวจสอบสิทธิ์ APNs ในส่วนการกำหนดค่าแอป iOS, ให้คลิกอัปโหลด เพื่ออัปโหลดคีย์การตรวจสอบสิทธิ์สำหรับการพัฒนา หรือ คีย์การตรวจสอบสิทธิ์สำหรับการใช้งานจริง หรือทั้ง 2 อย่าง คุณต้องอัปโหลดคีย์อย่างน้อย 1 รายการ
- เรียกดูตำแหน่งที่คุณบันทึกคีย์ เลือกคีย์ แล้วคลิก เปิด เพิ่มรหัสคีย์สำหรับคีย์ (มีอยู่ใน 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
อาจมีการหมุนเวียนหลังจากเริ่มต้นใช้งานครั้งแรก
เปิดใช้การลงทะเบียนโดยใช้รหัสการติดตั้ง 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];
}
...
ส่งข้อความแจ้งเตือน
ติดตั้งและเรียกใช้แอปในอุปกรณ์เป้าหมาย ในอุปกรณ์ Apple ให้ยอมรับคำขอสิทธิ์รับการแจ้งเตือนระยะไกล
ตรวจสอบว่าแอปอยู่ในเบื้องหลังของอุปกรณ์
ในคอนโซลFirebase ให้ไปที่ DevOps และการมีส่วนร่วม > Messaging
สร้างแคมเปญ
หากเป็นการส่งข้อความครั้งแรก ให้ทำดังนี้
เลือกสร้างแคมเปญแรก
เลือกข้อความแจ้งเตือน Firebase แล้วเลือกสร้าง
หากเคยสร้างแคมเปญไว้ก่อนหน้านี้ ให้ทำดังนี้
ในแท็บแคมเปญ ให้เลือกแคมเปญใหม่
คลิกการแจ้งเตือน
ป้อนข้อความ
เลือกส่งข้อความทดสอบ จากบานหน้าต่างด้านขวา
ป้อนโทเค็นการลงทะเบียนในช่องที่มีป้ายกำกับว่าเพิ่มรหัสการติดตั้ง Firebase หรือ FCM โทเค็นการลงทะเบียน
เลือกทดสอบ
หลังจากเลือกทดสอบ แล้ว อุปกรณ์ไคลเอ็นต์เป้าหมายที่มีแอปอยู่ใน เบื้องหลังควรได้รับการแจ้งเตือน
หากต้องการดูข้อมูลเชิงลึกเกี่ยวกับการแสดงข้อความในแอป ให้ไปที่แดชบอร์ด รายงาน ใน DevOps และการมีส่วนร่วม > Messaging ในคอนโซลFirebase แดชบอร์ดนี้จะบันทึกจำนวนข้อความที่ส่งและเปิดในอุปกรณ์ Apple และ Android รวมถึงข้อมูล "การแสดงผล" (การแจ้งเตือนที่ผู้ใช้เห็น) สำหรับแอป Android
ขั้นตอนถัดไป
หลังจากทำตามขั้นตอนการตั้งค่าเสร็จแล้ว คุณสามารถเลือกดำเนินการต่อด้วย FCM สำหรับแพลตฟอร์ม Apple ได้ดังนี้