เริ่มต้นใช้งาน 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

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

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

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

  1. ในคอนโซล Firebase ให้ไปที่ การตั้งค่า > ทั่วไป จากนั้นคลิกแท็บ 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];

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

โดยค่าเริ่มต้น 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 โดยเฉพาะอย่างยิ่ง ให้ใช้ FIRMessaging extensionHelper เพื่อดำเนินการเรียกกลับให้เสร็จสมบูรณ์แทนการใช้ 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. ในช่องที่มีป้ายกำกับว่า เพิ่มโทเค็นการลงทะเบียนFCM ให้ป้อนโทเค็นการลงทะเบียน

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

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

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

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

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