Thiết lập ứng dụng nhắn tin qua đám mây của Firebase bằng C++

Để viết ứng dụng Firebase Cloud Messaging trên nhiều 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ố bước thiết lập bổ sung cho từng nền tảng.

Thiết lập Firebase và SDK FCM

Android

  1. Nếu bạn chưa làm như vậy, thêm Firebase vào dự án C++ của bạn.

    • Trong hướng dẫn thiết lập được liên kết, hãy xem lại thiết bị và ứng dụng các yêu cầu khi sử dụng SDK Firebase C++, bao gồm khuyến nghị sử dụng CMake để xây dựng ứng dụng.

    • Trong tệp build.gradle cấp dự án, hãy nhớ đưa vào Kho lưu trữ Maven của Google trong cả buildscriptallprojects mục.

  2. 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);

  3. Xác định một lớp triển khai firebase::messaging::Listener .

  4. Khởi chạy FCM, truyền vào Ứng dụng và một Trình nghe được tạo:

    ::firebase::messaging::Initialize(app, listener);

  5. Các ứng dụng dựa vào SDK Dịch vụ Google Play phải kiểm tra thiết bị cho APK Dịch vụ Google Play tương thích trước khi truy cập các tính năng. Để tìm hiểu thêm, hãy tham khảo Kiểm tra APK Dịch vụ Google Play.

iOS trở lên

  1. Nếu bạn chưa làm như vậy, thêm Firebase vào dự án C++ của bạn. Sau đó: để thiết lập dự án cho FCM:
    1. Trong Podfile của dự án, hãy thêm phần phụ thuộc FCM:
      pod 'FirebaseMessaging'
    2. Kéo firebase.frameworkfirebase_messaging.framework khung vào dự án Xcode của bạn từ SDK C++ Firebase.
  2. Tải khoá xác thực APN của bạn lên Firebase. Nếu chưa có khoá xác thực APN hãy nhớ tạo một khoá trong Trung tâm thành viên dành cho nhà phát triển của Apple.

    1. 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 Project Settings (Cài đặt dự án), sau đó chọn Thẻ Giải pháp gửi thông báo qua đám mây.

    2. Trong khoá xác thực AAPN ở phần Cấu hình ứng dụng iOS, nhấp vào nút Tải lên .

    3. Duyệt tới vị trí bạn đã lưu khoá của mình, 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 dành cho nhà phát triển của Apple) rồi nhấp vào Tải lên.

  3. Định cấu hình dự án Xcode của bạn để bật Thông báo đẩy:

    1. Chọn dự án trong Navigator4 (Khu vực điều hướng).
    2. Chọn mục tiêu dự án trong Khu vực chỉnh sửa.
    3. Chọn thẻ General (Chung) trong phần Editor khu vực.

      1. Di chuyển xuống phần Linked Frameworks and Libraries (Khung và thư viện được liên kết), rồi nhấp vào hãy nhấp vào nút + để thêm khung.
      2. Trong cửa sổ xuất hiện, hãy cuộn đến UserNotifications.framework, nhấp vào mục nhập đó rồi nhấp Thêm.

        Khung này chỉ xuất hiện trong Xcode v8 trở lên và yêu cầu bởi thư viện này.

    4. Chọn thẻ Capability (Chức năng) trong vùng chỉnh sửa.

      1. Chuyển mục Thông báo đẩy sang trạng thái Bật.
      2. Cuộn xuống Chế độ nền, sau đó chuyển sang Bật.
      3. Chọn Thông báo từ xa trong Chế độ nền.
  4. Tạo đối tượng Ứng dụng Firebase:

    app = ::firebase::App::Create(::firebase::AppOptions());

  5. Xác định một lớp triển khai firebase::messaging::Listener .

  6. 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à Người nghe:

    ::firebase::messaging::Initialize(app, listener);

Truy cập vào mã thông báo đăng ký thiết bị

Khi khởi động thư viện Giải pháp gửi thông báo qua đám mây của Firebase, mã thông báo đăng ký sẽ là đượ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 cùng với Lệnh gọi lại OnTokenReceived cần đượ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ề tính năng gửi tin nhắn trên Android

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, theo mặc định, tin nhắn không được định tuyến thông qua tính năng tích hợp của FCM lệnh gọi lại. Trong trường hợp này, phần tải tin nhắn được nhận thông qua Intent dùng để khởi động ứng dụng. Để yêu cầu FCM chuyển tiếp những cuộc gọi đến này thông báo đế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 bạn và chuyển Intent đến phương thức 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);
  }
}

Tin nhắn nhận được khi ứng dụng chạy trong nền có nội dung là trường thông báo của họ được dùng để điền thông báo và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ẽ 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, thông báo gửi đến ứng dụng sẽ được chuyể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 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 đè 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 chúng đến thư viện C++. Khi ứng dụng chạy ở nền trước (hoặc khi ứng dụng chạy ở chế độ nền và nhận được tải trọng chỉ dữ liệu), các thông báo sẽ chuyển qua một trong các lệnh gọi lại được cung cấp trong lớp này. Để thêm đối với việc xử lý thông báo, bạn sẽ cần mở rộng phạm vi xử lý của FCM ListenerService mặc định:

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 hành động dựa trên dữ liệu đã nhận được Tin nhắn từ xa 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 vài phương thức khác ít được dùng hơn. Bạn cũng có thể ghi đè các tuỳ chọn này. Để biết thêm thông tin, hãy xem FirebaseMessagingService tham chiếu.

@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, các lớp đó phải được đưa vào AndroidManifest.xml sẽ có hiệu lực. Đảm bảo rằng tệp kê khai bao gồm các hợp nhất các công cụ bằng cách khai báo thuộc tính thích hợp bên trong thẻ <manifest>, như thế:

<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 AndroidManifest.xml tệp 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 cụ thể của dự án. Đây là cách ListenerService có thể chạy. ListenerService này cần được thay thế bằng dịch vụ trình nghe cusom. Điều này được thực hiện bằng cách xoá chế độ mặc định ListenerService 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 dự án của bạn AndroidManifest.xml:

<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 (7.1.0 trở lên) sử dụng JobIntentService và yêu cầu các nội dung sửa đổi bổ sung 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 việc khởi chạy tự động

FCM tạo một mã thông báo đăng ký để nhắm mục tiêu theo thiết bị. Khi mã thông báo được tạo, thư viện sẽ tải giá trị nhận dạng và dữ liệu cấu hình cho Firebase. Nếu bạn muốn nhận được chọn tham gia trước khi sử dụng mã thông báo, bạn có thể ngăn việc tạo tại thời điểm định cấu hình bằng cách vô hiệu hoá 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 của bạn) trên các nền tảng của Apple, hoặc AndroidManifest.xml của bạn 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 một lệnh gọi trong thời gian chạy:

::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);

Giá trị này sẽ vẫn tồn tại khi ứng dụng khởi động lại sau khi đặt.

FCM cho phép gửi tin nhắn chứa đường liên kết sâu đến ứng dụng của bạn. Để nhận thư chứa đườ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ý đường liên kết sâu cho ứng dụng của bạn. Bộ lọc ý định sẽ tìm đường liên kết sâu trong miền của bạn. Nếu thư của bạn không chứa liên kết sâu, cấu hình này là không cần thiết. Trong 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 một ký tự đại diện để tăng bộ lọc ý định linh hoạt. 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 thông báo chứa đường liên kết đến lược đồ và lưu trữ 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ý .

Các bước tiếp theo

Sau khi thiết lập ứng dụng, bạn đã sẵn sàng gửi chủ đề và kênh tiếp theo tin nhắn bằng Firebase. Để tìm hiểu thêm, hãy xem chức năng được minh hoạ này trong mẫu bắt đầu nhanh mà bạn có thể tải xuống, chạy và xem lại.

Để thêm hành vi khác, nâng cao hơn vào ứng dụng của bạn, 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 cần có triển khai máy chủ để tận dụng các tính năng AI mới.