Catch up on highlights from Firebase at Google I/O 2023. Learn more

Thiết lập ứng dụng khách Nhắn tin qua đám mây của Firebase với 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 của 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à FCM SDK

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 đối với thiết bị và ứng dụng để sử dụng SDK Firebase C++, bao gồm đề xuất sử dụng CMake để tạo ứ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 đố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 dành cho 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 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 Editor .
    3. Chọn tab Chung từ khu vực Trình chỉnh sửa .

      1. Cuộn xuống Linked Frameworks and Libraries , sau đó nhấp vào nút + để thêm các framework.
      2. Trong cửa sổ hiện ra, cuộ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 v8 trở lên và được yêu cầu bởi thư viện này.

    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 thành Bật .
      2. Cuộn xuống Chế độ nền , sau đó chuyển 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 Firebase Cloud Messaging, 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ý đượ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 cuộc gọi lại OnTokenReceived , nê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ề 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, 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 sẵn 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 thư đến này tới lệnh gọi lại của 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 tới 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 trong khi ứng dụng ở chế độ nền có nội dung của trường thông báo được sử dụng để điề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 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 mục đích.

Xử lý tin nhắn tùy chỉnh trên Android

Theo mặc định, thông báo gửi đến ứng dụng đượ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. Để 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.

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

ListenerService là lớp Java chặn các tin nhắn đến được gửi đến ứ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à ứng dụng nhận được tải trọng chỉ chứa 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 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à nhận 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. Chúng cũng có thể bị ghi đè, để 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

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 mà ListenerService có thể chạy. ListenerService này cần được thay thế bằng dịch vụ người 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 với các dòng sau 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>

Phiên bản mới của Firebase C++ SDK (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 khởi tạo tự động

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 mã định danh và dữ liệu cấu hình 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 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 của bạn (không phải GoogleService-Info.plist ) trên nền tảng 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>

Nhanh

FirebaseMessagingAutoInitEnabled = NO

Để bậ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 trong các lần khởi động lại ứng dụng sau khi được đặt.

FCM cho phép gửi tin nhắn có chứa liên kết sâu tới ứng dụng của bạn. Để nhận 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 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, 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 một 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 có chứa liên kết đến lược đồ và máy chủ lưu trữ 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 xuôi dòng và tin nhắn theo chủ đề bằng Firebase. Để tìm hiểu thêm, hãy xem chức năng này được trình bà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 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.