Catch up on everthing we announced at this year's Firebase Summit. Learn more

C++ ile bir Firebase Cloud Messaging istemci uygulaması kurun

C ile çapraz platform Firebase Bulut Mesajlaşma istemcisi uygulamasını yazmak için ++, kullanmak Firebase Bulut Mesajlaşma API. C++ SDK, hem Android hem de Apple platformları için çalışır ve her platform için bazı ek kurulumlar gerekir.

Firebase ve FCM SDK'yı kurun

Android

  1. Zaten yapmadıysanız, C ++ projeye Firebase ekleyin .

    • Bağlantılı kurulum talimatlarında, uygulamanızı oluşturmak için CMake kullanma önerisi de dahil olmak üzere Firebase C++ SDK'yı kullanmak için cihaz ve uygulama gereksinimlerini inceleyin.

    • Projeniz düzeyi olarak build.gradle dosyası, sizin hem de Google'ın Maven'in depo eklemeyi unutmayın buildscript ve allprojects bölümleri.

  2. : JNI çevre ve Etkinlik geçirmeden bir Firebase App nesne oluşturun

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

  3. Bir sınıf olduğunu uygular tanımla firebase::messaging::Listener arayüzü.

  4. Başlatma FCM, App ve inşa Dinleyici içinde geçen:

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

  5. Google Play hizmetleri SDK'sına dayanan uygulamalar, özelliklere erişmeden önce cihazda uyumlu bir Google Play hizmetleri APK'sı olup olmadığını kontrol etmelidir. Daha fazla bilgi için bkz Google Play hizmetleri APK için kontrol edin .

iOS+

  1. Geçerli bir ihtiyaç APN'ler sertifikası. Eğer zaten bir tane var yoksa, emin içinde oluşturmak için yapmak Elma Geliştirici Üye Merkezi .
  2. Zaten yapmadıysanız, C ++ projeye Firebase ekleyin . Ardından, projenizi FCM için ayarlamak için:
    1. Projenizin Podfile yılında FCM bağımlılık ekleyin:
      pod 'Firebase/Messaging'
    2. Drag firebase.framework ve firebase_messaging.framework gelen Xcode projeye çerçeveler Firebase C ++ SDK .
  3. Push Bildirimlerini etkinleştirmek için Xcode projenizi yapılandırın:

    1. Navigator alanından projeyi seçin.
    2. Editör alanından proje hedefi seçin.
    3. Editör alanından Genel sekmesini seçin.

      1. Kaydırma Bağlantılı kafes ve Kütüphaneleri aşağı, daha sonra çerçeveler eklemek için + düğmesini tıklayın.
      2. Göründüğünde, UserNotifications.framework gidin Bu pencerede, o zaman, bu girişi tıklayın Add tıklayın.

        Bu çerçeve yalnızca Xcode v8 ve sonraki sürümlerde görünür ve bu kitaplık tarafından gereklidir.

    4. Editör alanından Yetenekleri sekmesini seçin.

      1. Açık olarak itin Bildirimler geçin.
      2. Kaydırma Arkaplan Modlarına aşağı, daha sonra Açık olarak geçin.
      3. Arkaplan Modları altında Uzaktan bildirimleri seçin.
  4. Bir Firebase Uygulama nesnesi oluşturun:

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

  5. Bir sınıf olduğunu uygular tanımla firebase::messaging::Listener arayüzü.

  6. Başlatma Firebase Bulut Mesajlaşma Uygulaması hem bir inşa İşleyici içinde geçen:

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

Cihaz kayıt belirtecine erişin

Firebase Bulut Mesajlaşma kitaplığı başlatıldığında, istemci uygulaması örneği için bir kayıt belirteci istenir. Uygulamanın ile belirteç alacak OnTokenReceived uygular bu sınıfta tanımlanmalıdır callback'inde, firebase::messaging::Listener .

Söz konusu cihazı hedeflemek istiyorsanız, bu simgeye erişmeniz gerekir.

Android'de mesaj teslimi hakkında not

Uygulama hiç çalışmıyorken ve kullanıcı bir bildirime dokunduğunda, mesaj varsayılan olarak FCM'nin yerleşik geri aramaları aracılığıyla yönlendirilmez. Bu durumda, mesaj yükleri bir yoluyla alınan Intent uygulamasını başlatmak için kullanılan. İleri C ++ kütüphanesi geri arama için bu gelen mesajlar FCM sahip olmak için, yöntem geçersiz kılmak gerekir onNewIntent Faaliyetinizdeki ve pas Intent etmek 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);
  }
}

Uygulama arka plandayken alınan mesajlar, sistem tepsisi bildirimini doldurmak için kullanılan bildirim alanlarının içeriğine sahiptir, ancak bu bildirim içeriği FCM'ye iletilmez. Olduğunu, Message::notification boş olacaktır.

Özetle:

Uygulama durumu Bildirim Veri Her ikisi de
ön plan OnMessageReceived OnMessageReceived OnMessageReceived
Arka plan Sistem tepsisi OnMessageReceived Bildirim: sistem tepsisi
Veri: niyetin ekstralarında.

Android'de Özel Mesaj İşleme

Varsayılan olarak, uygulamaya gönderilen bildirimler geçirilir ::firebase::messaging::Listener::OnMessageReceived , ancak varsayılan davranışı geçersiz isteyebilirsiniz bazı durumlarda. Android'de Bunun için uzatmak özel sınıflar yazmak gerekir com.google.firebase.messaging.cpp.ListenerService yanı güncelleme projenizin olarak AndroidManifest.xml .

Geçersiz Kıl ListenerService Yöntemleri.

ListenerService yakaladığını gelen iletiler C ++ kütüphaneye uygulaması ve yolları kendilerine gönderilen Java sınıftır. Uygulama ön planda olduğunda (veya uygulama arka planda olduğunda ve yalnızca veri yükü aldığında), mesajlar bu sınıfta sağlanan geri aramalardan birinden geçer. Mesajı işleme özel davranışı eklemek için, FCM varsayılan uzatmak gerekecektir ListenerService :

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

class MyListenerService extends ListenerService {

Yöntem geçersiz kılarak ListenerService.onMessageReceived , alınan dayalı eylemleri gerçekleştirebilirsiniz RemoteMessage nesne ve mesaj verilerini almak:

@Override
public void onMessageReceived(RemoteMessage message) {
  Log.d(TAG, "A message has been received.");
  // Do additional logic...
  super.onMessageReceived(message);
}

ListenerService da daha az sıklıkla kullanılmaktadır birkaç diğer yöntemleri vardır. Daha fazla bilgi için bkz Bunlar, hem de geçersiz kılınan olabilir FirebaseMessagingService referansı.

@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);
}

Güncelleme AndroidManifest.xml

Özel sınıflar yazılı edildikten sonra, bunlar dahil edilmelidir AndroidManifest.xml etkili olması. Tezahür içindeki uygun niteliğini bildirerek birleştirme araçları içerir emin olun <manifest> şöyle etiketi,:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.firebase.messaging.cpp.samples"
    xmlns:tools="http://schemas.android.com/tools">

Gelen firebase_messaging_cpp.aar arşivde bir var AndroidManifest.xml FCM varsayılan beyan dosya ListenerService . Bu apaçık normalde nasıl proje özgü tezahür ile birleştirilir ListenerService çalışabiliyor. Bu ListenerService cusom dinleyici hizmeti ile değiştirilmesi gerekir. Bu varsayılan olarak uzaklaştırılması ile sağlanır ListenerService ve aşağıdaki satırları sizin projeler ile yapılabilir özel Servisi, ekleme AndroidManifest.xml dosyası:

<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>

Firebase C ++ SDK'sıyla (7.1.0 sonrası) kullanımı yeni versiyonları JobIntentService ek değişiklikler gerektirir AndroidManifest.xml dosyası.

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

Otomatik başlatmayı engelle

FCM, cihaz hedefleme için bir kayıt belirteci oluşturur. Bir belirteç oluşturulduğunda kitaplık, tanımlayıcıyı ve yapılandırma verilerini Firebase'e yükler. Belirteci kullanmadan önce açık bir onay almak istiyorsanız, FCM'yi (ve Android, Analytics'te) devre dışı bırakarak yapılandırma zamanında oluşturmayı önleyebilirsiniz. Bunu yapmak için, bir meta veri değeri eklemek Info.plist (değil GoogleService-Info.plist Elma platformlarda) veya AndroidManifest.xml Android'de:

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>

Süratli

FirebaseMessagingAutoInitEnabled = NO

FCM'yi yeniden etkinleştirmek için bir çalışma zamanı çağrısı yapabilirsiniz:

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

Bu değer, ayarlandıktan sonra uygulama yeniden başlatmaları boyunca devam eder.

FCM, uygulamanıza derin bir bağlantı içeren mesajların gönderilmesine izin verir. Derin bağlantı içeren iletileri almak için uygulamanız için derin bağlantıları işleyen etkinliğe yeni bir amaç filtresi eklemeniz gerekir. Amaç filtresi, alanınızın derin bağlantılarını yakalamalıdır. Mesajlarınız derin bir bağlantı içermiyorsa bu yapılandırma gerekli değildir. AndroidManifest.xml'de:

<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>

Amaç filtresini daha esnek hale getirmek için bir joker karakter belirtmek de mümkündür. Örneğin:

<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>

Kullanıcılar, belirttiğiniz şemaya ve ana bilgisayara bir bağlantı içeren bir bildirime dokunduğunda, uygulamanız bağlantıyı işlemek için bu amaç filtresiyle etkinliği başlatır.

Sonraki adımlar

İstemci uygulamasını kurduktan sonra, Firebase ile aşağı akış ve konu mesajları göndermeye hazırsınız. Daha fazla bilgi için gösterilmiştir bu işlevselliği bakın hızlı başlangıç numunesi sen, çalışma ve inceleme indirebilirsiniz.

Uygulamanıza başka, daha gelişmiş davranışlar eklemek için bir uygulama sunucusundan mesaj gönderme kılavuzlarına bakın:

Bir gerekir unutmayın sunucu uygulaması bu özelliklerin yapmak kullanımına.