C++ ile Firebase Cloud Messaging istemci uygulaması kurma

Platformlar arası Firebase Cloud Messaging istemci uygulamanızı C++ ile yazmak için Firebase Cloud Messaging API'yi kullanın. C++ SDK, hem Android hem de Apple platformlarında çalışır ve her platform için bazı ek kurulumlar gerekir.

Firebase'i ve FCM SDK'yı kurun

Android

  1. Henüz yapmadıysanız C++ projenize Firebase'i ekleyin .

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

    • Proje düzeyindeki build.gradle dosyanızda, hem buildscript hem de allprojects bölümlerinize Google'ın Maven deposunu eklediğinizden emin olun.

  2. JNI ortamından ve Etkinlikten geçen bir Firebase Uygulama nesnesi oluşturun:

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

  3. firebase::messaging::Listener arayüzünü uygulayan bir sınıf tanımlayın.

  4. Uygulamayı ve oluşturulmuş bir Dinleyiciyi ileterek FCM'yi başlatın:

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

  5. Google Play hizmetleri SDK'sını kullanan uygulamalar, özelliklere erişmeden önce cihazda uyumlu bir Google Play hizmetleri APK'sı olup olmadığını kontrol etmelidir. Daha fazla bilgi edinmek için Google Play hizmetleri APK'sını kontrol etme konusuna bakın.

iOS+

  1. Geçerli bir APN sertifikasına ihtiyacınız var. Henüz bir hesabınız yoksa Apple Geliştirici Üye Merkezi'nde bir tane oluşturduğunuzdan emin olun.
  2. Henüz yapmadıysanız C++ projenize Firebase'i ekleyin . Ardından projenizi FCM'ye ayarlamak için:
    1. Projenizin Pod dosyasına FCM bağımlılığını ekleyin:
      pod 'FirebaseMessaging'
    2. firebase.framework ve firebase_messaging.framework çerçevelerini Firebase C++ SDK'sından Xcode projenize sürükleyin.
  3. Anlık Bildirimleri etkinleştirmek için Xcode projenizi yapılandırın:

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

      1. Bağlantılı Çerçeveler ve Kitaplıklar seçeneğine ilerleyin, ardından çerçeve eklemek için + düğmesini tıklayın.
      2. Görüntülenen pencerede UserNotifications.framework öğesine gidin, söz konusu girişi tıklayın ve ardından Ekle öğesini tıklayın.

        Bu çerçeve yalnızca Xcode v8 ve sonrasında görünür ve bu kitaplık için gereklidir.

    4. Düzenleyici alanından Yetenekler sekmesini seçin.

      1. Anlık Bildirimleri Açık olarak değiştirin.
      2. Arka Plan Modları seçeneğine ilerleyin ve ardından Açık olarak değiştirin.
      3. Arka Plan Modları altında Uzak bildirimler'i seçin.
  4. Firebase Uygulama nesnesi oluşturun:

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

  5. firebase::messaging::Listener arayüzünü uygulayan bir sınıf tanımlayın.

  6. Uygulamayı ve oluşturulmuş bir Dinleyiciyi ileterek Firebase Cloud Messaging'i başlatın:

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

Cihaz kayıt jetonuna erişme

Firebase Cloud Messaging kitaplığının başlatılmasının ardından istemci uygulaması örneği için bir kayıt jetonu istenir. Uygulama, belirteci, firebase::messaging::Listener uygulayan sınıfta tanımlanması gereken OnTokenReceived geri çağrısıyla alacaktır.

Belirli bir cihazı hedeflemek istiyorsanız bu belirtece erişmeniz gerekir.

Android'de mesaj teslimi hakkında not

Uygulama hiç çalışmadığında 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 verileri, uygulamayı başlatmak için kullanılan bir Intent aracılığıyla alınır. FCM'nin bu gelen iletileri C++ kitaplığı geri çağrısına iletmesini sağlamak için Activity öğenizdeki onNewIntent yöntemini geçersiz kılmanız ve Intent MessageForwardingService öğesine iletmeniz gerekir.

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ın bildirim alanının içeriği sistem tepsisi bildirimini doldurmak için kullanılır, ancak bu bildirim içeriği FCM'ye iletilmez. Yani, Message::notification boş olacaktır.

Özetle:

Uygulama durumu Bildiri Veri İkisi birden
Ön plan OnMessageReceived OnMessageReceived OnMessageReceived
Arka plan Sistem tepsisi OnMessageReceived Bildirim: sistem tepsisi
Veri: amacın ekstralarında.

Android'de Özel Mesaj İşleme

Varsayılan olarak, uygulamaya gönderilen bildirimler ::firebase::messaging::Listener::OnMessageReceived öğesine iletilir, ancak bazı durumlarda varsayılan davranışı geçersiz kılmak isteyebilirsiniz. Bunu Android'de yapmak için com.google.firebase.messaging.cpp.ListenerService genişleten özel sınıflar yazmanız ve projenizin AndroidManifest.xml güncellemeniz gerekecektir.

ListenerService Yöntemlerini Geçersiz Kıl.

ListenerService , uygulamaya gönderilen gelen mesajları yakalayan ve bunları C++ kitaplığına yönlendiren Java sınıfıdı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çecektir. Mesaj işlemeye özel davranış eklemek için FCM'nin varsayılan ListenerService genişletmeniz gerekir:

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

class MyListenerService extends ListenerService {

ListenerService.onMessageReceived yöntemini geçersiz kılarak, alınan RemoteMessage nesnesine dayalı eylemler gerçekleştirebilir ve mesaj verilerini alabilirsiniz:

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

ListenerService ayrıca daha az kullanılan birkaç yöntemi daha vardır. Bunlar da geçersiz kılınabilir; daha fazla bilgi için FirebaseMessagingService referansına bakın.

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

AndroidManifest.xml güncelleyin

Özel sınıflarınız yazıldıktan sonra etkili olmaları için AndroidManifest.xml dosyasına dahil edilmeleri gerekir. Aşağıdaki gibi <manifest> etiketi içinde uygun özniteliği bildirerek manifest'in birleştirme araçlarını içerdiğinden emin olun:

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

firebase_messaging_cpp.aar arşivinde, FCM'nin varsayılan ListenerService bildiren bir AndroidManifest.xml dosyası bulunur. Bu manifest normalde projeye özel manifest ile birleştirilir ve bu da ListenerService nasıl çalışabildiğini gösterir. Bu ListenerService özel dinleyici servisiyle değiştirilmesi gerekiyor. Bu, varsayılan ListenerService kaldırılması ve özel Hizmetin eklenmesiyle gerçekleştirilir; bu, projelerinizin AndroidManifest.xml dosyasındaki aşağıdaki satırlarla yapılabilir:

<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'nın yeni sürümleri (7.1.0 ve sonrası), AndroidManifest.xml dosyasında ek değişiklikler gerektiren JobIntentService kullanır.

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

Otomatik başlatmayı önle

FCM, cihaz hedefleme için bir kayıt jetonu oluşturur. Bir jeton oluşturulduğunda kitaplık, tanımlayıcı ve yapılandırma verilerini Firebase'e yükler. Belirteci kullanmadan önce açık bir katılım almak istiyorsanız, yapılandırma sırasında FCM'yi (ve Android'de Analytics'i) devre dışı bırakarak oluşturmayı engelleyebilirsiniz. Bunu yapmak için, Apple platformlarında Info.plist dosyanıza ( GoogleService-Info.plist değil) veya Android'de AndroidManifest.xml dosyanıza bir meta veri değeri ekleyin:

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 çalışma zamanı çağrısı yapabilirsiniz:

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

Bu değer, ayarlandıktan sonra uygulama yeniden başlatıldığında devam eder.

FCM, uygulamanıza derin bağlantı içeren mesajların gönderilmesine olanak tanır. Derin bağlantı içeren mesajları almak için uygulamanızın derin bağlantılarını işleyen etkinliğe yeni bir amaç filtresi eklemeniz gerekir. Niyet filtresi alan adınızın derin bağlantılarını yakalamalıdır. Mesajlarınız derin bağlantı içermiyorsa bu yapılandırmaya gerek yoktur. 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 belirlemek 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 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 edinmek için indirebileceğiniz, çalıştırabileceğiniz ve inceleyebileceğiniz hızlı başlangıç ​​örneğinde gösterilen bu işlevselliğe bakın.

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

Bu özelliklerden yararlanmak için bir sunucu uygulamasına ihtiyacınız olacağını unutmayın.