| Chọn nền tảng: | iOS+ Android Web Flutter Unity C++ |
Hướng dẫn này mô tả cách bắt đầu sử dụng Firebase Cloud Messaging trong các ứng dụng máy khách C++ để bạn có thể gửi thông báo một cách đáng tin cậy.
Để viết ứng dụng máy khách nhiều nền tảng Firebase Cloud Messaging bằng C++, hãy sử dụng API Firebase Cloud Messaging. SDK C++ hoạt động cho cả nền tảng Android và Apple, với một số bước thiết lập bổ sung cần thiết cho từng nền tảng. Để tìm hiểu thêm về cách SDK C++ cho iOS và Android hoạt động với FCM, hãy xem bài viết Tìm hiểu về Firebase cho C++.
Thiết lập Firebase và SDK FCM
Android
Nếu bạn chưa thực hiện, hãy thêm Firebase vào dự án C++.
Trong hướng dẫn thiết lập được liên kết, hãy xem các yêu cầu về thiết bị và ứng dụng để sử dụng Firebase C++ SDK, bao gồm cả đề xuất sử dụng CMake để tạo ứng dụng.
Trong tệp
build.gradleở cấp dự án, hãy nhớ thêm kho lưu trữ Maven của Google vào cả hai mụcbuildscriptvàallprojects.
Tạo đối tượng Ứng dụng Firebase, truyền môi trường JNI và Hoạt động:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
Xác định một lớp giúp triển khai giao diện
firebase::messaging::Listener.Khởi chạy FCM, truyền Ứng dụng và Trình nghe đã tạo:
::firebase::messaging::Initialize(app, listener);
Các ứng dụng dựa vào SDK Dịch vụ Google Play nên kiểm tra thiết bị để tìm APK Dịch vụ Google Play tương thích trước khi truy cập vào các tính năng. Để tìm hiểu thêm, hãy tham khảo bài viết Kiểm tra APK Dịch vụ Google Play.
iOS+
- Nếu bạn chưa thực hiện,
hãy thêm Firebase vào dự án C++. Sau đó,
để thiết lập dự án cho FCM:
- Trong Podfile của dự án, hãy thêm phần phụ thuộc FCM:
pod 'FirebaseMessaging'
- Kéo các khung
firebase.frameworkvàfirebase_messaging.frameworkvào dự án Xcode từ Firebase C++ SDK.
- Trong Podfile của dự án, hãy thêm phần phụ thuộc FCM:
Tải khoá xác thực APNs lên Firebase. Nếu chưa có khoá xác thực APNs, hãy nhớ tạo một khoá trong Apple Developer Member Center.
-
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, sau đó chọn thẻ Gửi thông báo qua đám mây.
-
Trong phần APNs authentication key (Khoá xác thực APNs) ở mục iOS app configuration (Cấu hình ứng dụng iOS), hãy nhấp vào nút Upload (Tải lên) để tải khoá xác thực phát triển hoặc khoá xác thực sản xuất lên, hoặc cả hai. Cần tối thiểu 1 khoá.
-
Duyệt đến vị trí bạn đã lưu khoá, chọn khoá đó rồi nhấp vào Open. Thêm mã khoá cho khoá (có trong Apple Developer Member Center) rồi nhấp vào Upload.
-
Định cấu hình dự án Xcode để bật Thông báo đẩy:
- Chọn dự án trong Navigator area (Khu vực trình điều hướng).
- Chọn mục tiêu dự án trong Editor area (Khu vực trình chỉnh sửa).
Chọn thẻ General (Chung) trong Editor area (Khu vực trình chỉnh sửa).
- Di chuyển đến Linked Frameworks and Libraries (Khung và thư viện được liên kết), sau đó nhấp vào nút + để thêm khung.
Trong cửa sổ xuất hiện, hãy di chuyển đến UserNotifications.framework, nhấp vào mục nhập, sau đó nhấp vào Add.
Khung này chỉ xuất hiện trong Xcode phiên bản 8 trở lên và thư viện này yêu cầu.
Chọn thẻ Capabilities (Khả năng) trong Editor area (Khu vực trình chỉnh sửa).
- Chuyển Push Notifications (Thông báo đẩy) sang On (Bật).
- Di chuyển đến Background Modes (Chế độ nền), sau đó chuyển sang On (Bật).
- Chọn Remote notifications (Thông báo từ xa) trong Background Modes (Chế độ nền).
Tạo đối tượng Ứng dụng Firebase:
app = ::firebase::App::Create(::firebase::AppOptions());
Xác định một lớp giúp triển khai giao diện
firebase::messaging::Listener.Khởi chạy Giải pháp gửi thông báo qua đám mây của Firebase, truyền Ứng dụng và Trình nghe đã tạo:
::firebase::messaging::Initialize(app, listener);
Truy cập vào mã thông báo đăng ký FCM
Sau khi khởi chạy thư viện Giải pháp gửi thông báo qua đám mây của Firebase, một mã thông báo đăng ký sẽ được yêu cầu cho thực thể ứng dụng máy khách. Ứng dụng sẽ nhận được mã thông báo bằng lệnh gọi lại OnTokenReceived. Bạn nên xác định lệnh gọi lại này trong lớp triển khai firebase::messaging::Listener.
Nếu muốn nhắm đến thực thể ứng dụng cụ thể đó, bạn cần có quyền truy cập vào mã thông báo này.
Lưu ý về việc gửi thông báo trên Android
Theo mặc định, khi ứng dụng không chạy và người dùng nhấn vào một thông báo,
thông báo đó sẽ không được định tuyến thông qua các lệnh gọi lại tích hợp của FCM's. Trong trường hợp này, tải trọng thông báo được nhận thông qua một Intent dùng để khởi động ứng dụng. Để FCM chuyển tiếp các thông báo đến này đến lệnh gọi lại thư viện C++, bạn cần ghi đè phương thức onNewIntent trong Hoạt động và truyền Intent đến MessageForwardingService.
import com.google.firebase.messaging.MessageForwardingService; class MyActivity extends Activity { private static final String TAG = "MyActvity"; @Override protected void onNewIntent(Intent intent) { Log.d(TAG, "A message was sent to this app while it was in the background."); Intent message = new Intent(this, MessageForwardingService.class); message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT); message.putExtras(intent); message.setData(intent.getData()); // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`. // startService(message); MessageForwardingService.enqueueWork(this, message); } }
Các thông báo nhận được khi ứng dụng ở chế độ nền có nội dung của
trường thông báo được dùng để điền thông báo khay hệ thống, nhưng
nội dung thông báo đó sẽ không được truyền đến FCM. Tức là Message::notification sẽ là giá trị rỗng.
Tóm lại:
| Trạng thái ứng dụng | Thông báo | Dữ liệu | Cả hai |
|---|---|---|---|
| Nền trước | OnMessageReceived |
OnMessageReceived |
OnMessageReceived |
| Thông tin khái quát | Khay hệ thống | OnMessageReceived |
Thông báo: khay hệ thống Dữ liệu: trong phần bổ sung của ý định. |
Xử lý thông báo tuỳ chỉnh trên Android
Theo mặc định, các thông báo được gửi đến ứng dụng sẽ được truyền đến ::firebase::messaging::Listener::OnMessageReceived, nhưng trong một số trường hợp, bạn có thể muốn ghi đè hành vi mặc định. Để thực hiện việc này trên Android, bạn cần viết các lớp tuỳ chỉnh mở rộng com.google.firebase.messaging.cpp.ListenerService, cũng như cập nhật AndroidManifest.xml của dự án.
Ghi đè các phương thức ListenerService
ListenerService là lớp Java chặn các thông báo đến được gửi đến ứng dụng và định tuyến các thông báo đó đến thư viện C++. Khi ứng dụng ở nền trước (hoặc khi ứng dụng ở nền sau và nhận được tải trọng chỉ có dữ liệu), các thông báo sẽ truyền qua một trong các lệnh gọi lại được cung cấp trên lớp này. Để thêm
hành vi tuỳ chỉnh vào việc xử lý thông báo, bạn cần mở rộng FCM's
mặc định ListenerService:
import com.google.firebase.messaging.cpp.ListenerService; class MyListenerService extends ListenerService {
Bằng cách ghi đè phương thức ListenerService.onMessageReceived, bạn có thể
thực hiện các hành động dựa trên đối tượng
RemoteMessage
đã nhận và lấy dữ liệu thông báo:
@Override public void onMessageReceived(RemoteMessage message) { Log.d(TAG, "A message has been received."); // Do additional logic... super.onMessageReceived(message); }
ListenerService cũng có một số phương thức khác ít được sử dụng hơn.
Bạn cũng có thể ghi đè các phương thức này. Để biết thêm thông tin, hãy xem tài liệu tham khảo về
FirebaseMessagingService
.
@Override public void onDeletedMessages() { Log.d(TAG, "Messages have been deleted on the server."); // Do additional logic... super.onDeletedMessages(); } @Override public void onMessageSent(String messageId) { Log.d(TAG, "An outgoing message has been sent."); // Do additional logic... super.onMessageSent(messageId); } @Override public void onSendError(String messageId, Exception exception) { Log.d(TAG, "An outgoing message encountered an error."); // Do additional logic... super.onSendError(messageId, exception); }
Cập nhật AndroidManifest.xml
Sau khi viết các lớp tuỳ chỉnh, bạn phải đưa các lớp đó vào AndroidManifest.xml để có hiệu lực. Đảm bảo rằng tệp kê khai bao gồm các
công cụ hợp nhất bằng cách khai báo thuộc tính thích hợp bên trong thẻ <manifest>,
như sau:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.firebase.messaging.cpp.samples" xmlns:tools="http://schemas.android.com/tools">
Trong kho lưu trữ firebase_messaging_cpp.aar, có một tệp AndroidManifest.xml
khai báo FCM mặc định của ListenerService. Tệp kê khai này thường được hợp nhất với tệp kê khai dành riêng cho dự án. Đây là cách ListenerService có thể chạy. Bạn cần thay thế ListenerService này bằng dịch vụ trình nghe tuỳ chỉnh. Bạn có thể thực hiện việc này bằng cách xoá ListenerService mặc định và thêm Dịch vụ tuỳ chỉnh. Bạn có thể thực hiện việc này bằng các dòng sau trong tệp AndroidManifest.xml của dự án:
<service android:name="com.google.firebase.messaging.cpp.ListenerService" tools:node="remove" />
<service android:name="com.google.firebase.messaging.cpp.samples.MyListenerService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service>
Các phiên bản mới của SDK C++ của Firebase (từ 7.1.0 trở đi) sử dụng JobIntentService. Điều này đòi hỏi phải sửa đổi thêm trong tệp AndroidManifest.xml.
<service android:name="com.google.firebase.messaging.MessageForwardingService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false" > </service>
Ngăn khởi chạy tự động
FCM tạo mã thông báo đăng ký cho việc nhắm mục tiêu thực thể ứng dụng.
Khi một mã thông báo được tạo, thư viện sẽ tải dữ liệu cấu hình và mã nhận dạng lên Firebase. Nếu muốn nhận được sự đồng ý rõ ràng trước khi sử dụng mã thông báo, bạn có thể ngăn việc tạo mã thông báo tại thời điểm định cấu hình bằng cách tắt FCM (và trên Android, Analytics). Để thực hiện việc này, hãy thêm giá trị siêu dữ liệu vào
Info.plist (không phải GoogleService-Info.plist) trên các nền tảng Apple,
hoặc AndroidManifest.xml trên Android:
Android
<?xml version="1.0" encoding="utf-8"?> <application> <meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" /> <meta-data android:name="firebase_analytics_collection_enabled" android:value="false" /> </application>
Swift
FirebaseMessagingAutoInitEnabled = NO
Để bật lại FCM, bạn có thể thực hiện lệnh gọi thời gian chạy:
::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);
Giá trị này vẫn tồn tại trên các lần khởi động lại ứng dụng sau khi được đặt.
Thông báo có đường liên kết sâu trên Android
FCM cho phép gửi thông báo có chứa đường liên kết sâu vào ứng dụng của bạn. Để nhận thông báo có chứa đường liên kết sâu, bạn phải thêm bộ lọc ý định mới vào hoạt động xử lý đường liên kết sâu cho ứng dụng. Bộ lọc ý định sẽ nắm bắt các đường liên kết sâu của miền. Nếu thông báo của bạn không chứa đường liên kết sâu, thì bạn không cần định cấu hình này. Trong tệp AndroidManifest.xml:
<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="http"/> <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="https"/> </intent-filter>
Bạn cũng có thể chỉ định ký tự đại diện để làm cho bộ lọc ý định linh hoạt hơn. Ví dụ:
<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="*.example.com" android:scheme="http"/> <data android:host="*.example.com" android:scheme="https"/> </intent-filter>
Khi người dùng nhấn vào một thông báo có chứa đường liên kết đến lược đồ và máy chủ mà bạn chỉ định, ứng dụng của bạn sẽ bắt đầu hoạt động bằng bộ lọc ý định này để xử lý đường liên kết.
Các bước tiếp theo
Sau khi hoàn tất các bước thiết lập, bạn có thể tham khảo một số lựa chọn để tiếp tục sử dụng FCM cho C++: