Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.
Trang này được dịch bởi Cloud Translation API.
Switch to English

Gửi tin nhắn đến nhiều thiết bị trên iOS

Nhắn tin qua đám mây Firebase cung cấp hai cách để nhắm mục tiêu một tin nhắn đến nhiều thiết bị:

  • Nhắn tin theo chủ đề , cho phép bạn gửi tin nhắn đến nhiều thiết bị đã chọn tham gia vào một chủ đề cụ thể.
  • Nhắn tin nhóm thiết bị , cho phép bạn gửi một tin nhắn đến nhiều phiên bản của ứng dụng đang chạy trên các thiết bị thuộc một nhóm.

Hướng dẫn này tập trung vào việc gửi thông báo chủ đề từ máy chủ ứng dụng của bạn bằng SDK quản trị hoặc API REST cho FCM, đồng thời nhận và xử lý chúng trong ứng dụng iOS. Trang này liệt kê tất cả các bước để đạt được điều này, từ thiết lập đến xác minh - vì vậy, nó có thể bao gồm các bước bạn đã hoàn thành nếu bạn đã thiết lập ứng dụng khách iOS cho FCM hoặc đã làm qua các bước để Gửi tin nhắn đầu tiên của bạn .

Thêm Firebase vào dự án iOS của bạn

Phần này bao gồm các nhiệm vụ bạn có thể đã hoàn thành nếu bạn đã bật các tính năng Firebase khác cho ứng dụng của mình. Đối với FCM cụ thể, bạn sẽ cần tải lên khóa xác thực APN của mìnhđăng ký nhận thông báo từ xa .

Điều kiện tiên quyết

  • Cài đặt như sau:

    • Xcode 11.0 trở lên
    • CocoaPods 1.4.0 trở lên
  • Đảm bảo rằng dự án của bạn đáp ứng các yêu cầu sau:

    • Dự án của bạn phải nhắm mục tiêu iOS 8 trở lên.
  • Thiết lập thiết bị iOS thực để chạy ứng dụng của bạn và hoàn thành các tác vụ sau:

Nếu bạn chưa có dự án Xcode và chỉ muốn dùng thử sản phẩm Firebase, bạn có thể tải xuống một trong các mẫu bắt đầu nhanh của chúng tôi.

Tạo dự án Firebase

Trước khi có thể thêm Firebase vào ứng dụng iOS của mình, bạn cần tạo dự án Firebase để kết nối với ứng dụng iOS của mình. Truy cập Tìm hiểu các dự án Firebase để tìm hiểu thêm về các dự án Firebase.

Đăng ký ứng dụng của bạn với Firebase

Sau khi có dự án Firebase, bạn có thể thêm ứng dụng iOS của mình vào đó.

Truy cập Tìm hiểu các dự án Firebase để tìm hiểu thêm về các phương pháp hay nhất và những cân nhắc khi thêm ứng dụng vào dự án Firebase, bao gồm cách xử lý nhiều biến thể bản dựng.

  1. Chuyển đến bảng điều khiển Firebase .

  2. Ở giữa trang tổng quan về dự án, nhấp vào biểu tượng iOS ( ) để khởi chạy quy trình thiết lập.

    Nếu bạn đã thêm ứng dụng vào dự án Firebase của mình, hãy nhấp vào Thêm ứng dụng để hiển thị các tùy chọn nền tảng.

  3. Nhập ID gói ứng dụng của bạn vào trường ID gói iOS .

  4. (Tùy chọn) Nhập thông tin ứng dụng khác: Biệt hiệu ứng dụngID cửa hàng ứng dụng .

  5. Nhấp vào Đăng ký ứng dụng .

Thêm tệp cấu hình Firebase

  1. Nhấp vào Tải xuống GoogleService-Info.plist để tải tệp cấu hình Firebase iOS của bạn ( GoogleService-Info.plist ).

  2. Di chuyển tệp cấu hình của bạn vào thư mục gốc của dự án Xcode của bạn. Nếu được nhắc, hãy chọn thêm tệp cấu hình vào tất cả các mục tiêu.

Nếu bạn có nhiều ID gói trong dự án của mình, bạn phải liên kết từng ID gói với một ứng dụng đã đăng ký trong bảng điều khiển Firebase để mỗi ứng dụng có thể có tệp GoogleService-Info.plist của riêng mình.

Thêm SDK Firebase vào ứng dụng của bạn

Chúng tôi khuyên bạn nên sử dụng CocoaPods để cài đặt các thư viện Firebase. Tuy nhiên, nếu không muốn sử dụng CocoaPods, bạn có thể tích hợp trực tiếp các khung SDK hoặc sử dụng phiên bản beta của Trình quản lý gói Swift .

Bạn có đang sử dụng một trong các mẫu khởi động nhanh không? Dự án Xcode và Podfile (với nhóm) đã có sẵn, nhưng bạn vẫn cần thêm tệp cấu hình Firebase của mìnhcài đặt các nhóm.

  1. Tạo Podfile nếu bạn chưa có:

    cd your-project-directory
    pod init
  2. Vào Podfile của bạn, hãy thêm các nhóm Firebase mà bạn muốn sử dụng trong ứng dụng của mình.

    Bạn có thể thêm bất kỳ sản phẩm Firebase nào được hỗ trợ vào ứng dụng iOS của mình.

    Để có trải nghiệm tối ưu với Nhắn tin qua đám mây Firebase, chúng tôi khuyên bạn nên bật Google Analytics trong dự án của mình. Ngoài ra, là một phần của quá trình thiết lập Analytics, bạn cần thêm SDK Firebase cho Analytics vào ứng dụng của mình.

    Đã bật phân tích

    # Add the Firebase pod for Google Analytics
    pod 'Firebase/Analytics'
    # Add the pod for Firebase Cloud Messaging pod 'Firebase/Messaging'

    Analytics không được bật

    # Add the pod for Firebase Cloud Messaging
    pod 'Firebase/Messaging'
  3. Cài đặt các nhóm, sau đó mở tệp .xcworkspace của bạn để xem dự án trong Xcode:

    pod install
    open your-project.xcworkspace

Tải lên khóa xác thực APN của bạn

Tải khóa xác thực APN của bạn lên Firebase. Nếu bạn chưa có khóa xác thực APN, hãy xem Định cấu hình APN bằng FCM .

  1. Bên trong dự án của bạn trong bảng điều khiển Firebase, chọn biểu tượng bánh răng, chọn Cài đặt dự án , sau đó chọn tab Nhắn tin qua đám mây .

  2. Trong khóa xác thực APN dưới cấu hình ứng dụng iOS , hãy nhấp vào nút Tải lên .

  3. Duyệt đến vị trí bạn đã lưu khóa của mình, chọn nó và nhấp vào Mở . Thêm ID khóa cho khóa (có sẵn trong Chứng chỉ, Số nhận dạng & Hồ sơ trong Trung tâm Thành viên dành cho Nhà phát triển Apple ) và nhấp vào Tải lên .

Khởi tạo Firebase trong ứng dụng của bạn

Bạn sẽ cần thêm mã khởi tạo Firebase vào ứng dụng của mình. Nhập mô-đun Firebase và định cấu hình phiên bản được chia sẻ như được hiển thị:

  1. Nhập mô-đun Firebase trong UIApplicationDelegate của bạn:

    Nhanh

    import Firebase

    Objective-C

    @import Firebase;
  2. Định cấu hình phiên bản được chia sẻ FirebaseApp , thường trong ứng dụng của bạn application:didFinishLaunchingWithOptions: phương thức application:didFinishLaunchingWithOptions: ::

    Nhanh

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];

Đăng ký nhận thông báo từ xa

Khi khởi động hoặc tại điểm mong muốn trong luồng ứng dụng của bạn, hãy đăng ký ứng dụng của bạn để nhận thông báo từ xa. Call registerForRemoteNotifications như hình:

Nhanh

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()

Objective-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];

Đăng ký ứng dụng khách vào một chủ đề

Ứng dụng khách có thể đăng ký bất kỳ chủ đề hiện có nào hoặc họ có thể tạo một chủ đề mới. Khi một ứng dụng khách đăng ký tên chủ đề mới (tên chủ đề chưa tồn tại cho dự án Firebase của bạn), một chủ đề mới của tên đó sẽ được tạo trong FCM và bất kỳ khách hàng nào sau đó đều có thể đăng ký.

Để đăng ký một chủ đề, hãy gọi phương thức đăng ký từ chuỗi chính của ứng dụng của bạn (FCM không an toàn cho chủ đề). Nếu yêu cầu đăng ký ban đầu không thành công, FCM sẽ tự động thử lại. Đối với các trường hợp không thể hoàn thành đăng ký, đăng ký sẽ gây ra lỗi mà bạn có thể gặp trong trình xử lý hoàn thành như được hiển thị:

Nhanh

Messaging.messaging().subscribe(toTopic: "weather") { error in
  print("Subscribed to weather topic")
}

Objective-C

[[FIRMessaging messaging] subscribeToTopic:@"weather"
                                completion:^(NSError * _Nullable error) {
  NSLog(@"Subscribed to weather topic");
}];

Lệnh gọi này thực hiện một yêu cầu không đồng bộ tới phần phụ trợ FCM và đăng ký khách hàng vào chủ đề đã cho. Trước khi gọi subscribeToTopic:topic , hãy đảm bảo rằng phiên bản ứng dụng khách đã nhận được mã thông báo đăng ký qua lệnh gọi lại didReceiveRegistrationToken .

Mỗi khi ứng dụng khởi động, FCM đảm bảo rằng tất cả các chủ đề được yêu cầu đã được đăng ký. Để hủy đăng ký, hãy gọi unsubscribeFromTopic:topic và FCM hủy đăng ký chủ đề trong nền.

Nhận và xử lý tin nhắn chủ đề

FCM gửi thông điệp chủ đề theo cách tương tự như các thông báo xuôi dòng khác.

Triển khai AppDelegate application:didReceiveRemoteNotification: như hình:

Nhanh

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)

  completionHandler(UIBackgroundFetchResult.newData)
}

Objective-C

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Print message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Print message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler(UIBackgroundFetchResultNewData);
}

Xây dựng yêu cầu gửi

Sau khi bạn đã tạo chủ đề, bằng cách đăng ký các phiên bản ứng dụng khách cho chủ đề ở phía máy khách hoặc thông qua API máy chủ , bạn có thể gửi tin nhắn đến chủ đề. Nếu đây là lần đầu tiên bạn xây dựng yêu cầu gửi FCM, hãy xem hướng dẫn về môi trường máy chủ và FCM của bạn để biết thông tin cơ bản và thiết lập quan trọng.

Trong logic gửi của bạn trên phần phụ trợ, hãy chỉ định tên chủ đề mong muốn như được hiển thị:

Node.js

// The topic name can be optionally prefixed with "/topics/".
var topic = 'highScores';

var message = {
  data: {
    score: '850',
    time: '2:45'
  },
  topic: topic
};

// Send a message to devices subscribed to the provided topic.
admin.messaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

Java

// The topic name can be optionally prefixed with "/topics/".
String topic = "highScores";

// See documentation on defining a message payload.
Message message = Message.builder()
    .putData("score", "850")
    .putData("time", "2:45")
    .setTopic(topic)
    .build();

// Send a message to the devices subscribed to the provided topic.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

Python

# The topic name can be optionally prefixed with "/topics/".
topic = 'highScores'

# See documentation on defining a message payload.
message = messaging.Message(
    data={
        'score': '850',
        'time': '2:45',
    },
    topic=topic,
)

# Send a message to the devices subscribed to the provided topic.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

Đi

// The topic name can be optionally prefixed with "/topics/".
topic := "highScores"

// See documentation on defining a message payload.
message := &messaging.Message{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Topic: topic,
}

// Send a message to the devices subscribed to the provided topic.
response, err := client.Send(ctx, message)
if err != nil {
	log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)

C #

// The topic name can be optionally prefixed with "/topics/".
var topic = "highScores";

// See documentation on defining a message payload.
var message = new Message()
{
    Data = new Dictionary<string, string>()
    {
        { "score", "850" },
        { "time", "2:45" },
    },
    Topic = topic,
};

// Send a message to the devices subscribed to the provided topic.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);

NGHỈ NGƠI

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
  "message":{
    "topic" : "foo-bar",
    "notification" : {
      "body" : "This is a Firebase Cloud Messaging Topic Message!",
      "title" : "FCM Message"
      }
   }
}

lệnh cURL:

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
  "message": {
    "topic" : "foo-bar",
    "notification": {
      "body": "This is a Firebase Cloud Messaging Topic Message!",
      "title": "FCM Message"
    }
  }
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Để gửi tin nhắn đến một tổ hợp các chủ đề, hãy chỉ định một điều kiện , đó là một biểu thức boolean chỉ định các chủ đề đích. Ví dụ: điều kiện sau sẽ gửi tin nhắn đến các thiết bị đã đăng ký TopicATopicB hoặc TopicC :

"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"

FCM đầu tiên đánh giá bất kỳ điều kiện nào trong dấu ngoặc, sau đó đánh giá biểu thức từ trái sang phải. Trong biểu thức trên, người dùng đã đăng ký bất kỳ chủ đề nào sẽ không nhận được thông báo. Tương tự như vậy, người dùng không đăng ký TopicA sẽ không nhận được thông báo. Những kết hợp này nhận được nó:

  • TopicATopicB
  • TopicATopicC

Bạn có thể bao gồm tối đa năm chủ đề trong biểu thức điều kiện của mình.

Để gửi đến một điều kiện:

Node.js

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
var condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
var message = {
  notification: {
    title: '$FooCorp up 1.43% on the day',
    body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
  },
  condition: condition
};

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
admin.messaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

Java

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
String condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
Message message = Message.builder()
    .setNotification(Notification.builder()
        .setTitle("$GOOG up 1.43% on the day")
        .setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.")
        .build())
    .setCondition(condition)
    .build();

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

Python

# Define a condition which will send to devices which are subscribed
# to either the Google stock or the tech industry topics.
condition = "'stock-GOOG' in topics || 'industry-tech' in topics"

# See documentation on defining a message payload.
message = messaging.Message(
    notification=messaging.Notification(
        title='$GOOG up 1.43% on the day',
        body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.',
    ),
    condition=condition,
)

# Send a message to devices subscribed to the combination of topics
# specified by the provided condition.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

Đi

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
condition := "'stock-GOOG' in topics || 'industry-tech' in topics"

// See documentation on defining a message payload.
message := &messaging.Message{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Condition: condition,
}

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
response, err := client.Send(ctx, message)
if err != nil {
	log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)

C #

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
var condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
var message = new Message()
{
    Notification = new Notification()
    {
        Title = "$GOOG up 1.43% on the day",
        Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
    },
    Condition = condition,
};

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);

NGHỈ NGƠI

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
   "message":{
    "condition": "'dogs' in topics || 'cats' in topics",
    "notification" : {
      "body" : "This is a Firebase Cloud Messaging Topic Message!",
      "title" : "FCM Message",
    }
  }
}

lệnh cURL:

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
  "notification": {
    "title": "FCM Message",
    "body": "This is a Firebase Cloud Messaging Topic Message!",
  },
  "condition": "'dogs' in topics || 'cats' in topics"
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Bước tiếp theo