Để nhắm mục tiêu một tin nhắn đến nhiều thiết bị, hãy sử dụng Nhắn tin theo chủ đề . Tính năng này 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ể.
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 cách sử dụ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 Apple. 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 của Apple cho FCM hoặc đã thực hiện các bước để Gửi tin nhắn đầu tiên của bạn .
Thêm Firebase vào dự án Apple của bạn
Phần này bao gồm các tác vụ bạn có thể đã hoàn thành nếu bạn đã bật các tính năng khác của Firebase cho ứng dụng của mình. Đối với FCM cụ thể, bạn sẽ cần tải khóa xác thực APN của mình lên và đăng ký nhận thông báo từ xa .
điều kiện tiên quyết
Cài đặt như sau:
- Xcode 14.1 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 các phiên bản nền tảng này trở lên:
- iOS 11
- macOS 10.13
- tvOS 12
- watchOS 6
- Dự án của bạn phải nhắm mục tiêu các phiên bản nền tảng này trở lên:
Thiết lập thiết bị vật lý của Apple để chạy ứng dụng của bạn và hoàn thành các tác vụ sau:
- Nhận Khóa xác thực thông báo đẩy của Apple cho tài khoản Nhà phát triển Apple của bạn.
- Bật Thông báo đẩy trong XCode trong Ứng dụng > Khả năng .
- Đăng nhập vào Firebase bằng tài khoản Google của bạn.
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 Apple của mình, bạn cần tạo dự án Firebase để kết nối với ứng dụng 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
Để sử dụng Firebase trong ứng dụng Apple của bạn, bạn cần đăng ký ứng dụng của mình với dự án Firebase. Đăng ký ứng dụng của bạn thường được gọi là "thêm" ứng dụng vào dự án của bạn.
Chuyển đến bảng điều khiển Firebase .
Ở giữa trang tổng quan dự án, hãy 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 một ứ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.
Nhập ID gói ứng dụng của bạn vào trường ID gói .
ID gói xác định duy nhất một ứng dụng trong hệ sinh thái của Apple.
Tìm ID gói của bạn: mở dự án của bạn trong Xcode, chọn ứng dụng cấp cao nhất trong trình điều hướng dự án, sau đó chọn tab Chung .
Giá trị của trường Định danh gói là ID gói (ví dụ:
com.yourcompany.yourproject
).Xin lưu ý rằng giá trị ID gói phân biệt chữ hoa chữ thường và không thể thay đổi giá trị này đối với ứng dụng Firebase này sau khi đã đăng ký với dự án Firebase của bạn.
(Tùy chọn) Nhập thông tin ứng dụng khác: Biệt hiệu ứng dụng và ID App Store .
Biệt hiệu của ứng dụng : Mã định danh nội bộ, tiện lợi chỉ hiển thị với bạn trong bảng điều khiển Firebase
ID cửa hàng ứng dụng : Được Firebase Dynamic Links sử dụng để chuyển hướng người dùng đến trang App Store của bạn và được Google Analytics sử dụng để nhập các sự kiện chuyển đổi vào Google Ads . Nếu ứng dụng của bạn chưa có ID App Store, bạn có thể thêm ID sau trong cài đặt Dự án của mình.
Nhấp vào Đăng ký ứng dụng .
Thêm tệp cấu hình Firebase
Nhấp vào Tải xuống GoogleService-Info.plist để lấy tệp cấu hình nền tảng Apple Firebase của bạn (
GoogleService-Info.plist
).Tệp cấu hình Firebase chứa các mã định danh duy nhất nhưng không bí mật cho dự án của bạn. Để tìm hiểu thêm về tệp cấu hình này, hãy truy cập Tìm hiểu các dự án Firebase .
Bạn có thể tải xuống lại tệp cấu hình Firebase của mình bất kỳ lúc nào.
Đảm bảo tên tệp cấu hình không được thêm các ký tự bổ sung, như
(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, thì 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
riêng.
Thêm SDK Firebase vào ứng dụng của bạn
Sử dụng Trình quản lý gói Swift để cài đặt và quản lý các phần phụ thuộc của Firebase.
- Trong Xcode, khi dự án ứng dụng của bạn đang mở, hãy điều hướng đến File > Add Packages .
- Khi được nhắc, hãy thêm kho lưu trữ SDK nền tảng Apple của Firebase:
- Chọn thư viện Nhắn tin qua đám mây Firebase.
- Để có trải nghiệm tối ưu với Nhắn tin qua đám mây của Firebase, chúng tôi khuyên bạn nên bật Google Analytics trong dự án Firebase của mình và thêm SDK Firebase dành cho Google Analytics vào ứng dụng của bạn. Bạn có thể chọn thư viện không có bộ sưu tập IDFA hoặc có bộ sưu tập IDFA.
- Khi hoàn tất, Xcode sẽ tự động bắt đầu giải quyết và tải xuống các phần phụ thuộc của bạn trong nền.
https://github.com/firebase/firebase-ios-sdk
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 đảm bảo tạo một khóa trong Trung tâm thành viên nhà phát triển của Apple .
Bên trong dự án của bạn trong bảng điều khiển Firebase, hãy chọn biểu tượng bánh răng, chọn Cài đặt dự án rồi chọn tab Nhắn tin qua đám mây .
Trong khóa xác thực APN bên dưới cấu hình ứng dụng iOS , hãy nhấp vào nút Tải lên .
Duyệt đến vị trí mà 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 Trung tâm thành viên dành cho nhà phát triển của 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 dùng chung như được hiển thị:
- Nhập mô-đun
FirebaseCore
trongUIApplicationDelegate
của bạn, cũng như bất kỳ mô-đun Firebase nào khác mà ứng dụng ủy quyền của bạn sử dụng. Ví dụ: để sử dụng Cloud Firestore và Xác thực:SwiftUI
import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
Nhanh
import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
Mục tiêu-C
@import FirebaseCore; @import FirebaseFirestore; @import FirebaseAuth; // ...
- Định cấu hình một phiên bản chia sẻ
FirebaseApp
trong phương thức applicationapplication(_:didFinishLaunchingWithOptions:)
của ứng dụng của bạn:SwiftUI
// Use Firebase library to configure APIs FirebaseApp.configure()
Nhanh
// Use Firebase library to configure APIs FirebaseApp.configure()
Mục tiêu-C
// Use Firebase library to configure APIs [FIRApp configure];
- Nếu đang sử dụng SwiftUI, bạn phải tạo một đại biểu ứng dụng và đính kèm nó vào cấu trúc
App
của mình thông quaUIApplicationDelegateAdaptor
hoặcNSApplicationDelegateAdaptor
. Bạn cũng phải vô hiệu hóa tính năng xoay đại biểu của ứng dụng. Để biết thêm thông tin, hãy xem hướng dẫn SwiftUI .SwiftUI
@main struct YourApp: App { // register app delegate for Firebase setup @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate var body: some Scene { WindowGroup { NavigationView { ContentView() } } } }
Đăng ký 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. GọiregisterForRemoteNotifications
như hình:Nhanh
UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization( options: authOptions, completionHandler: { _, _ in } ) application.registerForRemoteNotifications()
Mục tiêu-C
[UNUserNotificationCenter currentNotificationCenter].delegate = self; UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge; [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:authOptions completionHandler:^(BOOL granted, NSError * _Nullable error) { // ... }]; [application registerForRemoteNotifications];
Đăng ký ứng dụng khách cho một chủ đề
Các ứng dụng khách có thể đăng ký bất kỳ chủ đề hiện có nào hoặc chúng có thể tạo một chủ đề mới. Khi ứng dụng khách đăng ký một tên chủ đề mới (tên chưa tồn tại cho dự án Firebase của bạn), một chủ đề mới có tên đó sẽ được tạo trong FCM và bất kỳ ứng dụng khách nào sau đó đều có thể đăng ký chủ đề đó.
Để đăng ký một chủ đề, hãy gọi phương thức đăng ký từ luồng chính của ứng dụng của bạn (FCM không an toàn cho luồng). Nếu ban đầu yêu cầu đăng ký 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ẽ đưa ra một lỗi mà bạn có thể bắt 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") }
Mục tiêu-C
[[FIRMessaging messaging] subscribeToTopic:@"weather" completion:^(NSError * _Nullable error) { NSLog(@"Subscribed to weather topic"); }];
Cuộc gọi này đưa ra một yêu cầu không đồng bộ tới chương trình phụ trợ FCM và đăng ký ứng dụng khách với 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ý khỏi chủ đề trong nền.
Nhận và xử lý tin nhắn chủ đề
FCM cung cấp các thông báo chủ đề giống như các thông báo xuôi dòng khác.
Triển khai application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
như hình:
Nhanh
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) async -> UIBackgroundFetchResult { // 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) return UIBackgroundFetchResult.newData }
Mục tiêu-C
- (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 full message. NSLog(@"%@", userInfo); completionHandler(UIBackgroundFetchResultNewData); }
Xây dựng yêu cầu gửi
Sau khi bạn đã tạo một 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 gửi yêu cầu cho 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/".
const topic = 'highScores';
const message = {
data: {
score: '850',
time: '2:45'
},
topic: topic
};
// Send a message to devices subscribed to the provided topic.
getMessaging().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);
con trăn
# 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 thư đến 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ý TopicA
và TopicB
hoặc TopicC
:
"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
FCM trước tiên đánh giá bất kỳ điều kiện nào trong ngoặc đơn, 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 không nhận được tin nhắn. Tương tự như vậy, người dùng không đăng ký TopicA
sẽ không nhận được tin nhắn. Những kết hợp này nhận được nó:
-
TopicA
vàTopicB
-
TopicA
vàTopicC
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.
const condition = '\'stock-GOOG\' in topics || \'industry-tech\' in topics';
// See documentation on defining a message payload.
const 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.
getMessaging().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);
con trăn
# 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
- Bạn có thể sử dụng máy chủ của mình để đăng ký các phiên bản ứng dụng khách cho các chủ đề và thực hiện các tác vụ quản lý khác. Xem Quản lý đăng ký chủ đề trên máy chủ .