Check out what’s new from Firebase at Google I/O 2022. Learn more

ตั้งค่าแอพไคลเอนต์ Firebase Cloud Messaging บนแพลตฟอร์ม Apple

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

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

วิธีการ swizzling ใน Firebase Cloud Messaging

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

เพิ่ม Firebase ให้กับโครงการ Apple ของคุณ

หากคุณยังไม่ได้ เพิ่ม Firebase ในโครงการ Apple ของคุณ

อัปโหลดคีย์การตรวจสอบสิทธิ์ APN ของคุณ

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

  1. ภายในโปรเจ็กต์ของคุณในคอนโซล Firebase ให้เลือกไอคอนรูปเฟือง เลือก Project Settings แล้วเลือกแท็บ Cloud Messaging

  2. ใน คีย์การตรวจสอบสิทธิ์ APN ภายใต้ การกำหนดค่าแอป iOS ให้คลิกปุ่ม อัปโหลด

  3. เรียกดูตำแหน่งที่คุณบันทึกคีย์ของคุณ เลือกคีย์ จากนั้นคลิก เปิด เพิ่มรหัสคีย์สำหรับคีย์ (มีอยู่ใน Apple Developer Member Center ) แล้วคลิก อัปโหลด

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

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

Swift

if #available(iOS 10.0, *) {
  // For iOS 10 display notification (sent via APNS)
  UNUserNotificationCenter.current().delegate = self

  let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
  UNUserNotificationCenter.current().requestAuthorization(
    options: authOptions,
    completionHandler: { _, _ in }
  )
} else {
  let settings: UIUserNotificationSettings =
    UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
  application.registerUserNotificationSettings(settings)
}

application.registerForRemoteNotifications()

วัตถุประสงค์-C

if ([UNUserNotificationCenter class] != nil) {
  // iOS 10 or later
  // For iOS 10 display notification (sent via APNS)
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
      UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
  [[UNUserNotificationCenter currentNotificationCenter]
      requestAuthorizationWithOptions:authOptions
      completionHandler:^(BOOL granted, NSError * _Nullable error) {
        // ...
      }];
} else {
  // iOS 10 notifications aren't available; fall back to iOS 8-9 notifications.
  UIUserNotificationType allNotificationTypes =
  (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
  UIUserNotificationSettings *settings =
  [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
  [application registerUserNotificationSettings:settings];
}

[application registerForRemoteNotifications];

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

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

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

โทเค็นการลงทะเบียนอาจเปลี่ยนแปลงเมื่อ:

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

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

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

Swift

Messaging.messaging().delegate = self

วัตถุประสงค์-C

[FIRMessaging messaging].delegate = self;

กำลังเรียกโทเค็นการลงทะเบียนปัจจุบัน

โทเค็นการลงทะเบียนจะถูกส่งผ่านเมธอด messaging:didReceiveRegistrationToken: โดยทั่วไปจะเรียกวิธีนี้ 1 ครั้งต่อแอปที่เริ่มต้นด้วยโทเค็นการลงทะเบียน เมื่อเรียกวิธีนี้ เป็นเวลาที่เหมาะสมที่สุดที่จะ:

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

คุณสามารถดึงโทเค็นได้โดยตรงโดยใช้ token(completion:) มีข้อผิดพลาดที่ไม่เป็นค่าว่างหากการดึงโทเค็นล้มเหลวไม่ว่าในทางใดทางหนึ่ง

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

วัตถุประสงค์-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
  if (error != nil) {
    NSLog(@"Error getting FCM registration token: %@", error);
  } else {
    NSLog(@"FCM registration token: %@", token);
    self.fcmRegTokenMessage.text = token;
  }
}];

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

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

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

Swift

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
  print("Firebase registration token: \(String(describing: fcmToken))")

  let dataDict: [String: String] = ["token": fcmToken ?? ""]
  NotificationCenter.default.post(
    name: Notification.Name("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.
}

วัตถุประสงค์-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 ถูกปิดใช้งาน: การแมปโทเค็น APN และโทเค็นการลงทะเบียน

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

Swift

func application(application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  Messaging.messaging().apnsToken = deviceToken
}

วัตถุประสงค์-C

// With "FirebaseAppDelegateProxyEnabled": NO
- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [FIRMessaging messaging].APNSToken = deviceToken;
}

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

ป้องกันการเริ่มต้นอัตโนมัติ

เมื่อมีการสร้างโทเค็นการลงทะเบียน FCM ไลบรารีจะอัปโหลดตัวระบุและข้อมูลการกำหนดค่าไปยัง Firebase หากคุณต้องการรับตัวเลือกที่ชัดเจนจากผู้ใช้ก่อน คุณสามารถป้องกันการสร้างโทเค็น ณ เวลาที่กำหนดค่าได้โดยการปิดใช้งาน FCM ในการดำเนินการนี้ ให้เพิ่มค่าข้อมูลเมตาให้กับ Info.plist ของคุณ (ไม่ใช่ GoogleService-Info.plist ของคุณ):

FirebaseMessagingAutoInitEnabled = NO

หากต้องการเปิดใช้งาน FCM อีกครั้ง คุณสามารถโทรรันไทม์ได้:

Swift

Messaging.messaging().autoInitEnabled = true

วัตถุประสงค์-C

[FIRMessaging messaging].autoInitEnabled = YES;

ค่านี้ยังคงอยู่ในการรีสตาร์ทแอปเมื่อตั้งค่า

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

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