Thiết lập ứng dụng khách Nhắn tin qua đám mây Firebase bằng C++

Để viết ứng dụng khách Nhắn tin qua đám mây Firebase đa nền tảng của bạn bằng C++, hãy sử dụng API Nhắn tin qua đám mây Firebase . SDK C++ hoạt động cho cả nền tảng Android và Apple, với một số thiết lập bổ sung cần thiết cho từng nền tảng.

Thiết lập Firebase và SDK FCM

Android

  1. Nếu bạn chưa có, hã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 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 để xây dựng ứng dụng của bạn.

    • Trong tệp build.gradle cấp dự án của bạn, hãy đảm bảo bao gồm kho lưu trữ Maven của Google trong cả phần buildscriptallprojects của bạn.

  2. Tạo một đối tượng Ứng dụng Firebase, chuyể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 giao diện firebase::messaging::Listener .

  4. Khởi tạo FCM, chuyển vào Ứng dụng và Trình nghe được xây dựng:

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

  5. Các ứng dụng dựa trên SDK dịch vụ Google Play phải kiểm tra thiết bị để tìm 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+

  1. Bạn cần có chứng chỉ APN hợp lệ. Nếu bạn chưa có, hãy đảm bảo tạo một tài khoản trong Trung tâm thành viên nhà phát triển của Apple .
  2. Nếu bạn chưa có, hãy thêm Firebase vào dự án C++ của bạn . Sau đó, để thiết lập dự án của bạn cho FCM:
    1. Trong Podfile của dự án của bạn, hãy thêm phần phụ thuộc FCM:
      pod 'FirebaseMessaging'
    2. Kéo các khung firebase.frameworkfirebase_messaging.framework vào dự án Xcode của bạn từ SDK Firebase C++ .
  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 từ khu vực Điều hướng .
    2. Chọn mục tiêu dự án từ khu vực Biên tập .
    3. Chọn tab Chung từ khu vực Biên tập .

      1. Cuộn xuống Linked Frameworks and Libraries , sau đó nhấp vào nút + để thêm framework.
      2. Trong cửa sổ xuất hiện, cuộn đến UserNotifications.framework , nhấp vào mục đó, sau đó nhấp vào Add .

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

    4. Chọn tab Khả năng từ khu vực Trình chỉnh sửa .

      1. Chuyển Thông báo đẩy sang 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 giao diện firebase::messaging::Listener .

  6. Khởi tạo Nhắn tin qua đám mây Firebase, chuyển vào Ứng dụng và Trình nghe được xây dựng:

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

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

Khi khởi tạo thư viện Nhắn tin qua đám mây Firebase, 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 với lệnh gọi lại OnTokenReceived , mã này cần được xác định trong lớp triển khai firebase::messaging::Listener .

Nếu bạn muốn nhắm mục tiêu thiết bị cụ thể đó, bạn sẽ cần 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

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 sẽ không được chuyển 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 tin nhắn được nhận thông qua Intent được sử dụng để khởi động ứng dụng. Để FCM chuyển tiếp các tin nhắn đến này tới 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à chuyển Intent cho 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 tin nhắn nhận được khi ứng dụng chạy ở chế độ nền có nội dung của trường thông báo được sử dụng để điền vào 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 tới FCM. Nghĩa là, Message::notification sẽ là null.

Tóm tắt:

Trạng thái ứng dụng Thông báo Dữ liệu Cả hai
Vấn đề xung quanh OnMessageReceived OnMessageReceived OnMessageReceived
Lý lịch 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ý tin nhắn tùy chỉnh trên Android

Theo mặc định, thông báo gửi tới ứng dụng sẽ được chuyển tới ::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 phải viết các lớp tùy chỉnh mở rộng com.google.firebase.messaging.cpp.ListenerService cũng như cập nhật AndroidManifest.xml của dự án của bạn.

Ghi đè các phương thức ListenerService .

ListenerService là lớp Java chặn các tin nhắn đến được gửi tới ứng dụng và định tuyến chúng đến thư viện C++. Khi ứng dụng ở nền trước (hoặc khi ứng dụng ở chế độ nền và nhận tải trọng chỉ có dữ liệu), các tin nhắn sẽ chuyể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 tùy chỉnh vào việc xử lý tin nhắn, 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 hành động 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 vài phương thức khác ít được sử dụng hơn. Chúng cũng có thể được ghi đè, để biết thêm thông tin, hãy xem tài liệu tham khảo 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

Khi các lớp tùy chỉnh của bạn đã được viết, chúng phải được đưa 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ó 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 cụ thể của dự án, đó là cách ListenerService có thể chạy. ListenerService này cần được thay thế bằng dịch vụ nghe cusom. Điều đó được thực hiện bằng cách xóa ListenerService mặc định và thêm Dịch vụ tùy chỉnh, có thể được thực hiện bằng các dòng sau trong tệp AndroidManifest.xml dự án của bạ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 Firebase C++ (7.1.0 trở đi) sử dụng JobIntentService yêu cầu 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 chặn tự động khởi tạo

FCM tạo 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 dữ liệu nhận dạng và cấu hình lên Firebase. Nếu bạn muốn nhận được quyền chọn tham gia rõ ràng trước khi sử dụng mã thông báo, bạn có thể ngăn việc tạo vào 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 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>

Nhanh

FirebaseMessagingAutoInitEnabled = NO

Để kích hoạt lại FCM, bạn có thể thực hiện cuộc gọi thời gian chạy:

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

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

FCM cho phép gửi tin nhắn chứa liên kết sâu vào ứng dụng của bạn. Để nhận được thư chứa 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ý liên kết sâu cho ứng dụng của mình. Bộ lọc ý định sẽ bắt được các liên kết sâu trong miền của bạn. Nếu tin nhắn của bạn không chứa liên kết sâu thì 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>

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 thông báo chứa 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 với bộ lọc ý định này để xử lý liên kết.

Bước tiếp theo

Sau khi thiết lập ứng dụng khách, bạn đã sẵn sàng gửi tin nhắn theo chủ đề và xuôi dòng bằng Firebase. Để tìm hiểu thêm, hãy xem chức năng này được minh họa 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 tin nhắn từ máy chủ ứng dụng:

Hãy nhớ rằng bạn sẽ cần triển khai máy chủ để sử dụng các tính năng này.