Để viết ứng dụng khách Firebase Cloud Messaging đa nền tảng 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ố chế độ thiết lập bổ sung bắt buộc cho mỗi nền tảng.
Thiết lập Firebase và SDK FCM
Nếu 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 xét các yêu cầu về thiết bị và ứng dụng để sử dụng SDK Firebase C++, 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ụcbuildscript
vàallprojects
.
Tạo một đối tượng Ứng dụng Firebase, truyền vào 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 triển khai giao diện
firebase::messaging::Listener
.Khởi chạy FCM, truyền vào Ứng dụng và một Trình nghe đã tạo:
::firebase::messaging::Initialize(app, listener);
Những ứng dụng dựa vào SDK Dịch vụ Google Play nên kiểm tra thiết bị để tìm một tệp 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 phần Kiểm tra APK Dịch vụ Google Play.
- Nếu 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.framework
vàfirebase_messaging.framework
vào dự án Xcode của bạn 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 bạn chưa có khoá xác thực APNs, hãy nhớ tạo một khoá trong Trung tâm thành viên của nhà phát triển Apple.
-
Trong dự án của bạn trên bảng điều khiển Firebase, hãy chọn biểu tượng bánh răng, chọn Project Settings (Cài đặt dự án), rồi chọn thẻ Cloud Messaging (Nhắn tin qua đám mây).
-
Trong phần Khoá xác thực APNs trong 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 khoá, chọn khoá đó rồi nhấp vào Mở. Thêm mã khoá cho khoá (có trong Trung tâm thành viên của nhà phát triển Apple) rồi nhấp vào Tải lên.
-
Định cấu hình dự án Xcode để bật Thông báo đẩy:
- Chọn dự án trong khu vực Trình điều hướng.
- Chọn mục tiêu dự án trong vùng Trình chỉnh sửa.
Chọn thẻ Chung trong vùng Trình chỉnh sửa.
- Di chuyển xuống phần Linked Frameworks and Libraries (Thư viện và khung đượ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 đó, rồi nhấp vào Add (Thêm).
Khung này chỉ xuất hiện trong Xcode phiên bản 8 trở lên và là yêu cầu bắt buộc đối với thư viện này.
Chọn thẻ Capabilities (Tính năng) trong Editor area (Khu vực trình chỉnh sửa).
- Chuyển Thông báo đẩy sang trạng thái Bật.
- Di chuyển xuống phần Chế độ nền, sau đó chuyển sang trạng thái Bật.
- Chọn Thông báo từ xa trong mục Chế độ nền.
Tạo một đối tượng Ứng dụng Firebase:
app = ::firebase::App::Create(::firebase::AppOptions());
Xác định một lớp triển khai giao diện
firebase::messaging::Listener
.Khởi động Giải pháp gửi thông báo qua đám mây của Firebase, truyền vào Ứ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ý thiết bị
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 phiên bản ứng dụng khách. Ứng dụng sẽ nhận được mã thông báo bằng lệnh gọi lại OnTokenReceived
. Lệnh gọi lại này phải được xác định trong lớp triển khai firebase::messaging::Listener
.
Nếu muốn nhắm đến thiết bị 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 tin nhắn trên Android
Theo mặc định, khi ứng dụng hoàn toàn 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. 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 của mình 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); } }
Những tin nhắn nhận được khi ứng dụng ở chế độ nền sẽ có nội dung của trường thông báo được dùng để điền sẵn thông báo trên 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ẽ có giá trị rỗng.
Tóm lại:
Trạng thái ứng dụng | Thông báo | Dữ liệu | Cả hai |
---|---|---|---|
Màu nổi | 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. Để làm việc này trên Android, bạn sẽ 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 quá trình xử lý thông báo, bạn sẽ cần mở rộng ListenerService
mặc định của FCM:
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 thao tác dựa trên đối tượng RemoteMessage đã nhận và lấy dữ liệu tin nhắn:
@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 giá trị 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 bạn viết các lớp tuỳ chỉnh, bạn phải thêm các lớp đó vào AndroidManifest.xml
để có hiệu lực. Đảm bảo rằng tệp kê khai có 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 ListenerService
mặc định của FCM. 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, đó là cách ListenerService
có thể chạy. ListenerService
này cần được thay thế 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 Firebase C++ SDK (từ 7.1.0 trở lên) sử dụng JobIntentService
. Điều này đòi hỏi bạn 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 quá trình khởi chạy tự động
FCM tạo mã đăng ký để nhắm đến thiết bị.
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à giá trị 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à Analytics trên Android). Để làm việc này, hãy thêm một 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 của Apple hoặc AndroidManifest.xml
trên 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>
FirebaseMessagingAutoInitEnabled = NO
Để bật lại FCM, bạn có thể thực hiện một lệnh gọi thời gian chạy:
::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);
Giá trị này vẫn giữ nguyên khi ứng dụng khởi động lại sau khi được đặt.
Xử lý thông báo bằng đường liên kết sâu trên Android
FCM cho phép gửi các thông báo có chứa một đường liên kết sâu vào ứng dụng của bạn. Để nhận các thông báo có chứa một đường liên kết sâu, bạn phải thêm một bộ lọc ý định mới vào hoạt động xử lý các đường liên kết sâu cho ứng dụng của mình. Bộ lọc ý định này 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 phải thiết lập 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 để giúp 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 thiết lập ứng dụng khách, bạn đã sẵn sàng gửi các thông báo truyền xuống và thông báo theo chủ đề bằng Firebase. Để tìm hiểu thêm, hãy xem chức năng này được minh hoạ trong mẫu bắt đầu nhanh mà bạn có thể tải xuống, chạy và xem xét.
Để thêm những hành vi khác, nâng cao hơn vào ứng dụng, hãy xem hướng dẫn gửi thông báo từ máy chủ ứng dụng:
Xin lưu ý rằng bạn sẽ cần triển khai máy chủ để sử dụng các tính năng này.