C++ uygulamalarında Firebase Cloud Messaging'i kullanmaya başlama

Platform seçin: iOS+ Android Web Flutter Unity C++


Bu kılavuzda, mesajları güvenilir bir şekilde gönderebilmeniz için C++ istemci uygulamalarınızda Firebase Cloud Messaging'yı kullanmaya nasıl başlayacağınız açıklanmaktadır.

C++ ile platformlar arası Firebase Cloud Messaging istemci uygulamanızı 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. iOS ve Android için C++ SDK'sının FCM ile nasıl çalıştığı hakkında daha fazla bilgi edinmek isterseniz C++ için Firebase'i anlama başlıklı makaleyi inceleyin.

Firebase'i ve FCM SDK'sını kurma

Android

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

    • Bağlantılı kurulum talimatlarında, uygulamanızı derlemek için CMake kullanma önerisi de dahil olmak üzere Firebase C++ SDK'sını kullanmayla ilgili cihaz ve uygulama şartları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 arayüzünü uygulayan bir sınıf tanımlayın.

  4. FCM öğesini ilk kullanıma hazırlayın, App ve oluşturulmuş bir işleyiciyi iletin:

    ::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.framework ve firebase_messaging.framework çerçevelerini Firebase C++ SDK'sından Xcode projenize sürükleyin.
  2. APNs kimlik doğrulama anahtarınızı Firebase'e yükleyin. Henüz bir APNs kimlik doğrulama anahtarınız yoksa Apple Developer Member Center'da bir anahtar oluşturun.

    1. Firebase konsolunda Ayarlar > Genel'e gidin. Ardından Cloud Messaging sekmesini tıklayın.
    2. iOS uygulama yapılandırması bölümündeki APNs kimlik doğrulama anahtarı'nda, geliştirme kimlik doğrulama anahtarınızı veya üretim kimlik doğrulama anahtarınızı ya da her ikisini de yüklemek için Yükle'yi tıklayın. En az bir tane bildirmeniz gerekir.
    3. Anahtarınızı kaydettiğiniz konuma gidin, anahtarı seçin ve Aç'ı tıklayın. Anahtarın anahtar kimliğini ekleyin (Apple Developer Member Center'da bulunur) ve Yükle'yi tıklayın.
  3. Xcode projenizi push bildirimlerini etkinleştirecek şekilde yapılandırın:

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

      1. Linked Frameworks and Libraries (Bağlı Çerçeveler ve Kitaplıklar) bölümüne gidin ve çerçeve eklemek için + düğmesini tıklayın.
      2. Açılan pencerede UserNotifications.framework'e gidin, girişi tıklayın ve ardından Add'i (Ekle) tıklayın.

        Bu çerçeve yalnızca Xcode 8 ve sonraki sürümlerde görünür ve bu kitaplık için 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 olarak değiştirin.
      3. Arka Plan Modları bölümünde Uzaktan bildirimler'i seçin.
  4. Bir Firebase uygulaması 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. Firebase Cloud Messaging'i başlatın, App ve oluşturulmuş bir Listener'ı iletin:

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

Firebase yükleme kimliğine erişme

Firebase Installation ID kullanılarak kaydı etkinleştirme

Firebase Kurulum Kimliği'ni (FID) kullanarak uygulama örneğinizi FCM ile kaydetmeyi etkinleştirmek için öncelikle uygulamanızın hem Android hem de Apple platformlarındaki yapılandırmasında FID'leri etkinleştirmeniz gerekir:

Android

AndroidManifest.xml öğenizin <application> öğesinin içine aşağıdaki <meta-data> öğesini ekleyin:

<meta-data android:name="firebase_messaging_installation_id_enabled"
           android:value="true" />

Swift

Info.plist dosyanıza FirebaseMessagingInstallationIdEnabled anahtarını ekleyin ve YES olarak ayarlayın:

FirebaseMessagingInstallationIdEnabled = YES

onRegistrationReceived işleyicisini uygulama

Firebase Cloud Messaging kitaplığı başlatılırken istemci uygulama örneği, Firebase yükleme kimliği (FID) kullanılarak mesaj almak üzere kaydedilir. Uygulama, OnRegistrationReceived geri çağırma işleviyle FID'yi alır. Bu işlev, firebase::messaging::Listener uygulamanızda tanımlanmalıdır:

class MyListener : public firebase::messaging::Listener {
 public:
  void OnRegistrationReceived(const char* installation_id) override {
    LogMessage("Received Firebase Installation ID: %s", installation_id);
    // TODO: Send the Firebase Installation ID (FID) to your app server to
    // target this device for messages.
  }
};

Bu belirli uygulama örneğini hedeflemek istiyorsanız FID'yi uygulama sunucunuza gönderin ve tercih ettiğiniz yöntemi kullanarak saklayın.

Otomatik başlatma devre dışı bırakıldığında manuel olarak kaydetme

Ayrıca, çalışma zamanında FCM ile kaydı manuel olarak da tetikleyebilirsiniz: Register():

// Manually register with FCM
firebase::Future<void> register_future = firebase::messaging::Register();
register_future.OnCompletion([](const firebase::Future<void>& future) {
  if (future.status() == firebase::kFutureStatusComplete &&
      future.error() == 0) {
    // Note: The registered Firebase Installation ID is delivered to the
    // OnRegistrationReceived callback.
    LogMessage("Registered with FCM");
  }
});

FCM kayıt jetonuna erişme (desteği sonlandırıldı)

Firebase Cloud Messaging kitaplığı başlatıldığında istemci uygulama örneği için bir kayıt jetonu istenir. Uygulama, OnTokenReceived geri çağırmasıyla jetonu alır. Bu geri çağırma, firebase::messaging::Listener öğesini uygulayan sınıfta tanımlanmalıdır.

Belirli bir uygulama örneğini hedeflemek istiyorsanız bu jetona erişmeniz gerekir.

Android'de mesaj teslimiyle ilgili not

Uygulama hiç çalışmıyorken kullanıcı bir bildirime dokunduğunda mesaj, varsayılan olarak FCM'nin yerleşik geri çağırmaları üzerinden yönlendirilmez. Bu durumda, mesaj yükleri uygulamayı başlatmak için kullanılan bir Intent aracılığıyla alınır. FCM uygulamasının bu gelen mesajları C++ kitaplığı geri çağırma işlevine yönlendirmesi için etkinliğinizdeki onNewIntent yöntemini geçersiz kılmanız ve Intent değerini MessageForwardingService yöntemine 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 ile paylaşılmaz. Yani Message::notification boş 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 işleme

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

ListenerService yöntemi geçersiz kılma

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 içeren bir yük aldığında) mesajlar bu sınıfta sağlanan geri çağırma işlevlerinden birinden geçer. Mesaj işlemeye özel davranış eklemek için FCM'nin varsayılan ListenerService sınıfını 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şlem 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 birkaç yönteme 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 dahil edilmeleri gerekir. Manifestin, <manifest> etiketi içinde uygun özelliği bildirerek 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 için varsayılan ListenerService değerini bildiren bir AndroidManifest.xml dosyası var. Bu manifest normalde projeye özgü manifest ile birleştirilir. ListenerService bu şekilde çalıştırılabilir. Bu ListenerService, özel dinleyici hizmetiyle değiştirilmelidir. Bu işlem, varsayılan ListenerService kaldırılıp özel hizmet eklenerek gerçekleştirilir. Bu işlem, projelerinizin AndroidManifest.xml dosyasına aşağıdaki satırlar eklenerek 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 nedenle, AndroidManifest.xml dosyasında ek değişiklikler yapılması gerekir.

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

Otomatik başlatmayı önleme

FCM, uygulama örneği 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ça izin almak istiyorsanız FCM'yi (ve Android'de Analytics'i) devre dışı bırakarak yapılandırma sırasında jeton oluşturulmasını engelleyebilirsiniz. Bunu yapmak için Apple platformlarındaki Info.plist öğenize (GoogleService-Info.plist öğenize 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 bir çalışma zamanı çağrısı yapabilirsiniz:

::firebase::messaging::SetRegistrationOnInitEnabled(true);

Bu değer, ayarlandıktan sonra uygulama yeniden başlatıldığında da geçerli olur.

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ızdaki 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ızda derin bağlantı yoksa 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>

Ayrıca, amaç 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 şemaya ve ana makineye bağlantı içeren bir bildirime dokunduğunda uygulamanız, bağlantıyı işlemek için bu intent filtresiyle etkinliği başlatır.

Sonraki adımlar

Kurulum adımlarını tamamladıktan sonra C++ için FCM ile devam etmek üzere kullanabileceğiniz birkaç seçenek vardır: