C++ ile Firebase Cloud Messaging istemci uygulaması kurma

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

Firebase ve FCM SDK'sını ayarlama

Android

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

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

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

  2. JNI ortamı ve etkinliği ileterek 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. FCM'yi başlatın, uygulamayı ve oluşturulan bir Dinleyici'yi 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 edinmek için Google Play Hizmetleri APK'sını kontrol etme konusuna bakın.

iOS ve üzeri

  1. Geçerli bir APN sertifikasına ihtiyacınız vardır. Hesabınız yoksa Apple Developer Member Center'da hesap oluşturmayı unutmayın.
  2. Henüz yapmadıysanız Firebase'i C++ projenize ekleyin. Ardından, projenizi FCM için ayarlamak üzere:
    1. Projenizin Podfile'ı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. Push Bildirimleri'ni etkinleştirmek için Xcode projenizi 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. Bağlı Çerçeveler ve Kitaplıklar'a gidin ve çerçeve eklemek için + düğmesini tıklayın.
      2. Görüntülenen pencerede UserBildirimler.framework'e gidin, ilgili girişi ve ardından Ekle'yi tıklayın.

        Bu çerçeve, yalnızca Xcode v8 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 olarak ayarlayın.
      2. Arka Plan Modları'na gidin ve ardından ayarı Açık hale getirin.
      3. Arka Plan Modları altında Uzaktan 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şturulan bir Dinleyici 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 uygulaması örneği için bir kayıt jetonu istenir. Uygulama, jetonu firebase::messaging::Listener uygulayan sınıfta tanımlanması gereken OnTokenReceived geri çağırmalı jetonu alır.

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

Android'de ileti 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 çağırmaları üzerinden yönlendirilmez. Bu durumda, mesaj yükleri uygulamayı başlatmak için kullanılan bir Intent üzerinden alınır. FCM'nin bu gelen iletileri C++ kitaplığı geri çağırmasına yönlendirmesini sağlamak için Etkinliğinizde onNewIntent yöntemini geçersiz kılmanız ve Intent öğesini 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ı, sistem tepsisi bildirimini doldurmak için kullanılır, ancak bu bildirim içeriği FCM'ye iletilmez. Yani Message::notification, null olur.

Özet olarak:

Uygulama durumu Bildirim Veriler Her ikisi de
Ön plan OnMessageReceived OnMessageReceived OnMessageReceived
Genel bilgi Sistem tepsisi OnMessageReceived Bildirim: sistem tepsisi
Veriler: Amacın ekstraları.

Android'de Özel İleti İşleme

Varsayılan olarak, uygulamaya gönderilen bildirimler ::firebase::messaging::Listener::OnMessageReceived uygulamasına 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 ve projenizin AndroidManifest.xml öğesini güncellemeniz gerekir.

ListenerService yöntemlerini geçersiz kıl.

ListenerService, uygulamaya gönderilen gelen mesajlara müdahale eden ve bunları C++ kitaplığına yönlendiren Java sınıfıdır. Uygulama ön plandayken (veya uygulama arka planda olduğunda ve yalnızca veri 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 kapsamı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 dayalı işlemler 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, daha seyrek kullanılan birkaç yöntem daha sunar. 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 içeriğini güncelle

Özel sınıflarınız yazıldıktan sonra AndroidManifest.xml içine eklenmelidir. <manifest> etiketinin içinde uygun özelliği tanımlayarak manifestin 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 öğesini tanımlayan bir AndroidManifest.xml dosyası bulunmaktadır. Bu manifest normalde projeye özel manifest ile birleştirilir. Bu manifest, ListenerService çalıştırılabilir. Bu ListenerService öğesinin özel dinleyici hizmetiyle değiştirilmesi gerekir. Bu işlem, varsayılan ListenerService kaldırılıp özel Hizmet eklenerek yapılır. Bu işlem, proje AndroidManifest.xml dosyanızın aşağıdaki satırları ile 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ümlerinde (7.1.0 sonrası) JobIntentService kullanılır. Bunun için AndroidManifest.xml dosyasında ek değişiklikler gerekir.

<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 jetonu oluşturur. Kitaplık, jeton oluşturulduğunda tanımlayıcı ve yapılandırma verilerini Firebase'e yükler. Jetonu kullanmadan önce açık bir etkinleştirme işlemi almak isterseniz FCM'yi (ve Android'de Analytics'i) devre dışı bırakarak yapılandırma sırasında oluşturma işlemini engelleyebilirsiniz. Bunu yapmak için Apple platformlarında Info.plist öğenize (GoogleService-Info.plist değil) veya Android'de AndroidManifest.xml öğenize 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ı araması yapabilirsiniz:

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

Bu değer, ayarlandıktan sonra uygulamanın yeniden başlatılmasında da aynı kalır.

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 intent filtresi eklemeniz gerekir. Amaç filtresi, alanınızın derin bağlantılarını yakalamalıdır. Mesajlarınız bir 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>

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

<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 şema ve ana makinenin bağlantısını 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

İstemci uygulamasını kurduktan sonra Firebase ile aşağı akış ve konu mesajlarını gönderebilirsiniz. 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şleve göz atın.

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

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