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'sini kullanın. C++ SDK'sı hem Android hem de Apple platformlarında çalışır. Her platform için ek kurulum gerekir.

Firebase ve FCM SDK'sını ayarlama

Android

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

    • Bağlı kurulum talimatlarında, uygulamanızı oluşturmak için CMake'i kullanma önerisi de dahil olmak üzere Firebase C++ SDK'sını kullanmayla ilgili cihaz ve uygulama koşullarını inceleyin.

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

  2. JNI ortamını ve etkinliği ileterek bir Firebase App nesnesi oluşturun:

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

  3. firebase::messaging::Listener arabirimini uygulayan bir sınıf tanımlayın.

  4. Uygulamayı ve oluşturulmuş bir dinleyiciyi ileterek FCM'ü 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 için Google Play Hizmetleri APK'sını kontrol etme başlıklı makaleyi inceleyin.

iOS+

  1. Henüz yapmadıysanız Firebase'i C++ projenize ekleyin. Ardından, projenizi FCM için ayarlamak üzere:
    1. Projenizin Podfile dosyasına FCM bağımlılığını ekleyin:
      pod 'FirebaseMessaging'
    2. Firebase C++ SDK'sından firebase.framework ve firebase_messaging.framework çerçevelerini Xcode projenize sürükleyin.
  2. APNs kimlik doğrulama anahtarınızı Firebase'e yükleyin. APN kimlik doğrulama anahtarınız yoksa Apple Developer Üye Merkezi'nde bir anahtar oluşturduğunuzdan emin olun.

    1. Firebase Konsolu'ndaki projenizde dişli simgesini, ardından Proje Ayarları'nı ve Cloud Mesajlaşma sekmesini seçin.

    2. iOS uygulama yapılandırması bölümündeki APNs kimlik doğrulama anahtarı'nda Yükle düğmesini tıklayın.

    3. Anahtarınızı kaydettiğiniz konuma gidin, anahtarı seçin ve 'ı tıklayın. Anahtarın anahtar kimliğini ekleyin ( Apple Developer Üye Merkezi'nde bulunur) ve Yükle'yi tıklayın.

  3. Xcode projenizi Push bildirimlerini etkinleştirecek şekilde yapılandırın:

    1. Gezinme alanından projeyi seçin.
    2. Düzenleyici alanından proje hedefini seçin.
    3. Düzenleyici alanından Genel sekmesini seçin.

      1. Bağlı Çerçeveler ve Kitaplıklar'a gidin ve çerçeve eklemek için + düğmesini tıklayın.
      2. Açılan pencerede UserNotifications.framework'a gidin, bu girişi ve ardından Ekle'yi tıklayın.

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

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

      1. Push Bildirimleri'ni Açık konuma getirin.
      2. Arka Plan Modları'na gidin ve Açık'a getirin.
      3. Arka Plan Modları altında Uzaktan bildirimler'i seçin.
  4. Firebase uygulaması nesnesi oluşturun:

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

  5. firebase::messaging::Listener arabirimini 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ığı başlatıldıktan sonra istemci uygulama örneği için bir kayıt jetonu istenir. Uygulama, jetonu OnTokenReceived geri çağırma işleviyle alır. Bu işlev, firebase::messaging::Listener'u uygulayan sınıfta tanımlanmalıdır.

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

Android'de mesaj teslimiyle ilgili not

Uygulama hiç çalışmadığında ve bir kullanıcı bir bildirime dokunduğunda, mesaj varsayılan olarak FCM'ın yerleşik geri çağırma işlevleri üzerinden yönlendirilmez. Bu durumda, mesaj yükü, uygulamayı başlatmak için kullanılan bir Intent aracılığıyla alınır. FCM'ün bu gelen mesajları C++ kitaplığı geri çağırma işlevine iletmesi için Etkinliğinizde onNewIntent yöntemini geçersiz kılmanız ve Intent öğesini MessageForwardingService'a 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ındaki içerik, sistem tepsisi bildirimini doldurmak için kullanılır ancak bu bildirim içeriği FCM'e iletilmez. Yani Message::notification null olur.

Özet olarak:

Uygulama durumu Bildirim Veriler İkisi de
Ön plan OnMessageReceived OnMessageReceived OnMessageReceived
Arka plan Sistem tepsisi OnMessageReceived Bildirim: sistem tepsisi
Veriler: intent'in ekstralarında.

Android'de Özel Mesaj İşleme

Uygulamaya gönderilen bildirimler varsayılan olarak ::firebase::messaging::Listener::OnMessageReceived'e iletilir ancak bazı durumlarda varsayılan davranışı geçersiz kılmak isteyebilirsiniz. Android'de bunu yapmak için com.google.firebase.messaging.cpp.ListenerService sınıfını genişleten özel sınıflar yazmanız ve projenizin AndroidManifest.xml dosyasını güncellemeniz gerekir.

ListenerService yöntemlerini geçersiz kılabilirsiniz.

ListenerService, uygulamaya gönderilen gelen mesajları yakalayıp C++ kitaplığına yönlendiren Java sınıfıdır. Uygulama ön plandayken (veya uygulama arka plandayken ve yalnızca veri yüklü bir mesaj aldığında) mesajlar bu sınıfta sağlanan geri çağırmalardan birinden geçer. Mesaj işlemeye özel davranış eklemek için FCM'ın varsayılan ListenerService özelliğini 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 göre işlemler yapabilir 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, daha az kullanılan başka yöntemlere de sahiptir. 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 uygulamasını güncelle

Özel sınıflarınız yazıldıktan sonra geçerli olmaları için AndroidManifest.xml dosyasına eklenmeleri gerekir. <manifest> etiketinde uygun özelliği açıklayarak manifest'in birleştirme araçlarını içerdiğinden emin olun. Örneğin:

<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 değerini belirten bir AndroidManifest.xml dosyası vardır. Bu manifest genellikle projeye özel manifest ile birleştirilir. Bu sayede ListenerService çalışabilir. Bu ListenerService, özel dinleyici hizmetiyle değiştirilmelidir. Bu, varsayılan ListenerService kaldırılarak ve özel Hizmet eklenerek yapılır. Bu işlem, projenizin AndroidManifest.xml dosyasında 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'sının yeni sürümleri (7.1.0 ve sonraki sürümler) JobIntentService kullanır. Bu da AndroidManifest.xml dosyasında ek değişiklikler yapılmasını gerektirir.

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

Otomatik başlatmayı önleme

FCM, cihaz hedefleme için bir kayıt jetonu oluşturur. Bir jeton oluşturulduğunda kitaplık, tanımlayıcıyı ve yapılandırma verilerini Firebase'e yükler. Jetonu kullanmadan önce açık bir katılım almak istiyorsanız FCM'yi (ve Android'de Analytics'i) devre dışı bırakarak yapılandırırken jeton oluşturulmasını önleyebilirsiniz. Bunu yapmak için Apple platformlarındaki Info.plist (GoogleService-Info.plist değil) veya Android'deki AndroidManifest.xml öğenize 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>

Swift

FirebaseMessagingAutoInitEnabled = NO

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

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

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

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 için derin bağlantıları işleyen etkinliğe yeni bir intent filtresi eklemeniz gerekir. Intent filtresi, alanınızın derin bağlantılarını yakalamalıdır. Mesajlarınız derin bağlantı içermiyorsa bu yapılandırma gerekli değildir. AndroidManifest.xml dosyasında:

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

Intent filtresini daha esnek hale getirmek için joker karakter de belirtebilirsiniz. Ö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 şemanın ve barındırıcının bağlantısını içeren bir bildirime dokunduğunda uygulamanız, bağlantıyı işlemek için etkinliği bu intent filtresiyle başlatır.

Sonraki adımlar

İstemci uygulamasını ayarladıktan sonra Firebase ile yayın mesajları ve konu mesajları göndermeye hazırsınız demektir. Daha fazla bilgi edinmek için bu işlevin, indirip çalıştırabileceğiniz ve inceleyebileceğiniz hızlı başlangıç örneğinde gösterildiğine göz atın.

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

Bu özelliklerden yararlanmak için sunucu uygulaması kullanmanız gerektiğini unutmayın.