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

Để viết cross-platform căn cứ hỏa lực Cloud Messaging ứng dụng khách hàng của bạn với C ++, sử dụng các căn cứ hỏa lực Cloud Messaging API. C ++ SDK 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 mỗi nền tảng.

Thiết lập Firebase và SDK FCM

Android

  1. Nếu bạn chưa sẵn sàng, thêm căn cứ hỏa lực để dự án của bạn C ++ .

    • 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ả khuyến nghị sử dụng CMake để xây dựng ứng dụng của bạn.

    • Trong dự án cấp của bạn build.gradle tập tin, hãy chắc chắn để bao gồm kho Maven của Google trong cả hai bạn buildscriptallprojects phần.

  2. Tạo một đối tượng căn cứ hỏa lực App, đi qua trong môi trường JNI và Hoạt động:

    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);

  3. Định nghĩa một lớp mà thực hiện các firebase::messaging::Listener giao diện.

  4. Initialize FCM, đi qua trong App và xây dựng Thính giả:

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

  5. Các ứng dụng dựa trên SDK dịch vụ của 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 cho các dịch vụ chơi apk Google .

iOS +

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

      1. Cuộn xuống Linked Khung và thư viện, sau đó nhấn nút + để thêm khung.
      2. Trong cửa sổ xuất hiện, di chuyển đến UserNotifications.framework, nhấp chuột vào mục đó, sau đó nhấn 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 Editor.

      1. Chuyển Notifications Push to On.
      2. Cuộn xuống nền chế độ, sau đó chuyển nó sang On.
      3. Chọn thông báo từ xa dưới chế độ nền.
  4. Tạo một đối tượng căn cứ hỏa lực App:

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

  5. Định nghĩa một lớp mà thực hiện các firebase::messaging::Listener giao diện.

  6. Initialize căn cứ hỏa lực Cloud Messaging, đi qua trong App và một Listener 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 chạy thư viện Nhắn tin qua đám mây của 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 các OnTokenReceived gọi lại, mà phải được định nghĩa trong lớp mà thực hiện 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 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 được tích hợp sẵn của FCM. Trong trường hợp này, nội dung thông báo được nhận thông qua một Intent sử dụng để khởi động ứng dụng. Để có FCM mong những tin nhắn gửi đến với C ++ gọi lại thư viện, bạn cần phải ghi đè phương pháp onNewIntent trong hoạt động của bạn và vượt qua 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 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. Đó là, Message::notification sẽ là một 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
Tiểu sử 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 các ứng dụng được truyền cho ::firebase::messaging::Listener::OnMessageReceived , nhưng trong một số trường hợp, bạn có thể muốn ghi đè lên hành vi mặc định. Để làm điều này trên Android, bạn sẽ cần phải viết các lớp tùy chỉnh mà mở rộng com.google.firebase.messaging.cpp.ListenerService cũng như cập nhật của dự án của bạn AndroidManifest.xml .

Override ListenerService phương pháp.

Các ListenerService là lớp Java mà chặn tin nhắn gửi đến gửi đến các ứng dụng và các tuyến đường chúng vào thư viện C ++. Khi ứng dụng ở nền trước (hoặc khi ứng dụng ở nền và nó nhận trọng tải chỉ 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 để xử lý tin nhắn, bạn sẽ cần phải mở rộng mặc định FCM của ListenerService :

import com.google.firebase.messaging.cpp.ListenerService;

class MyListenerService extends ListenerService {

Bằng cách ghi đè các phương pháp ListenerService.onMessageReceived , bạn có thể thực hiện hành động dựa trên nhận RemoteMessage đối tượng và lấy dữ liệu thông điệp:

@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 pháp khác được sử dụng ít thường xuyên. Đây có thể là ghi đè là tốt, để biết thêm thông tin xem các FirebaseMessagingService tham khảo.

@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 lớp tùy chỉnh của bạn đã được viết, chúng phải được bao gồm trong AndroidManifest.xml có hiệu lực. Đảm bảo rằng các biểu hiện bao gồm các công cụ hợp nhất bằng cách tuyên bố các thuộc tính thích hợp bên trong <manifest> thẻ, như vậy:

<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 firebase_messaging_cpp.aar lưu trữ có một AndroidManifest.xml tập tin mà tuyên bố mặc định FCM của ListenerService . Manifest này thường được kết hợp với các dự án cụ thể biểu hiện đó là cách ListenerService có thể chạy. Đây ListenerService cần phải thay thế bằng dịch vụ cusom nghe. Đó là thực hiện bằng cách loại bỏ các mặc định ListenerService và thêm các dịch vụ tùy chỉnh, có thể được thực hiện với những dòng sau dự án của bạn AndroidManifest.xml file:

<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 căn cứ hỏa lực C ++ SDK (7.1.0 trở đi) sử dụng JobIntentService đòi hỏi sửa đổi bổ sung trong AndroidManifest.xml file.

<service android:name="com.google.firebase.messaging.MessageForwardingService"
     android:permission="android.permission.BIND_JOB_SERVICE"
     android:exported="false" >
</service>

Ngăn tự động khởi chạy

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 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 tại thời điểm định cấu hình bằng cách tắt FCM (và trên Android, Analytics). Để làm điều này, thêm một giá trị siêu dữ liệu để bạn Info.plist (không phải của bạn GoogleService-Info.plist ) trên nền tảng của Apple, hoặc bạn 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

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

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

Giá trị này vẫn tồn tại qua 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 vào ứng dụng của bạn. Để nhận được tin nhắn có 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 phải bắt được các liên kết sâu của 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 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 các thông báo về chủ đề và thông báo xuôi dòng với Firebase. Để tìm hiểu thêm, thấy chức năng này thể hiện trong mẫu quickstart mà bạn có thể tải về, chạy, và xem xét.

Để 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 một triển khai máy chủ để tận dụng các tính năng này.