Как настроить push-уведомления Firebase с Deep Link с Unity3D

Я внедряю Firebase Cloud Messaging для отправки push-уведомлений в мой проект Unity для устройств Android и iOS. Сейчас я отлаживаю Android. Я получаю push-уведомления на своем устройстве, но я хочу настроить его так, чтобы я мог отправлять и получать глубокие ссылки, которые ведут меня после нажатия push-уведомления на определенную страницу в приложении.

Я следовал руководству от Google (https://firebase.google.com/docs/cloud-messaging/unity/client), но не уверен, правильно ли я его понял. При настройке пользовательской точки входа они предлагают добавить данный код в мою активность:

/** * Workaround for when a message is sent containing both a Data and Notification payload. * * When the app is in the background, if a message with both a data and notification payload is * receieved the data payload is stored on the Intent passed to onNewIntent. By default, that * intent does not get set as the Intent that started the app, so when the app comes back online * it doesn't see a new FCM message to respond to. As a workaround, we override onNewIntent so * that it sends the intent to the MessageForwardingService which forwards the message to the * FirebaseMessagingService which in turn sends the message to the application. */ @Override protected void onNewIntent(Intent intent) { Intent message = new Intent(this, MessageForwardingService.class); message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT); message.putExtras(intent); message.setData(intent.getData()); startService(message); }

/**
 * Dispose of the mUnityPlayer when restarting the app.
 *
 * This ensures that when the app starts up again it does not s tart with stale data.
 */
@Override
 protected void onCreate(Bundle savedInstanceState) {
  if (mUnityPlayer != null) {
    mUnityPlayer.quit();
    mUnityPlayer = null;
  }
  super.onCreate(savedInstanceState);
}

Я получаю следующие вопросы: Это собственный код Android? Или мне нужно добавить это где-то в Unity? Что насчет iOS?

Чтение раздела: Обработка сообщений с глубокими ссылками на Android Я добавил код настройки домена в свой манифест Android.

Кроме того, я не понимаю, как отправить deepLink из консоли Firebase и обработать его с помощью Unity. Должен ли я настраивать его как пару "ключ-значение"? С каким ключом? Как мне обработать пару ключ-значение / или, если это не так, как мне обработать deepLink в целом?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
4 871
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот код с onCreate указан в разделе Настройка пользовательской точки входа Действие. Это необходимо только в том случае, если вы следовали инструкциям для Расширение активности UnityPlayerActivity от самого Unity (обычно вы должны знать, когда сделали это, хотя иногда плагины (такие как этот) должны делать это сами, чтобы функционировать.

Для обработки глубоких ссылок вам необходимо изменить фильтр намерений для вашего ApplicationManifest.xml. У вас должен быть файл AndroidManifest.xml в Assets/Plugins/AndroidManifest.xml после импорта плагина Firebase Messaging. Начиная с 6.1.1 это выглядит так:

<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:tools = "http://schemas.android.com/tools" package = "com.google.firebase.unity.database.testapp.patrick" android:versionCode = "1" android:versionName = "1.0">
  <application android:label = "@string/app_name" android:icon = "@drawable/app_icon">
    <!-- The MessagingUnityPlayerActivity is a class that extends
         UnityPlayerActivity to work around a known issue when receiving
         notification data payloads in the background. -->
    <activity android:name = "com.google.firebase.MessagingUnityPlayerActivity" android:configChanges = "fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
      <intent-filter>
        <action android:name = "android.intent.action.MAIN" />
        <category android:name = "android.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data android:name = "unityplayer.UnityActivity" android:value = "true" />
    </activity>
    <service android:name = "com.google.firebase.messaging.MessageForwardingService" android:exported = "false" />
  </application>
</manifest>

Просто добавьте туда свои фильтры намерений, например, если ваш домен — example.com:

<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:tools = "http://schemas.android.com/tools" package = "com.google.firebase.unity.database.testapp.patrick" android:versionCode = "1" android:versionName = "1.0">
  <application android:label = "@string/app_name" android:icon = "@drawable/app_icon">
    <!-- The MessagingUnityPlayerActivity is a class that extends
         UnityPlayerActivity to work around a known issue when receiving
         notification data payloads in the background. -->
    <activity android:name = "com.google.firebase.MessagingUnityPlayerActivity" android:configChanges = "fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
      <intent-filter>
        <action android:name = "android.intent.action.MAIN" />
        <category android:name = "android.intent.category.LAUNCHER" />

        <!-- stuff for deep links -->
        <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>
      <meta-data android:name = "unityplayer.UnityActivity" android:value = "true" />
    </activity>
    <service android:name = "com.google.firebase.messaging.MessageForwardingService" android:exported = "false" />
  </application>
</manifest>

Вам не нужна пара ключ-значение. Чтобы узнать, как получать сообщения, в дополнение к документации, которую вы уже нашли, вы должны проверить файл образец заявления.

Важно отметить, что он проверяет зависимости firebase, прежде чем что-либо делать:

      Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => {
        dependencyStatus = task.Result;
        if (dependencyStatus == Firebase.DependencyStatus.Available) {
          InitializeFirebase();
        } else {
          Debug.LogError(
            "Could not resolve all Firebase dependencies: " + dependencyStatus);
        }
      });

В функции инициализации регистрируются обработчики для входящих сообщений:

      Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
      Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;

(это также место, где образец подписывается на тему, если вы это делаете)

и запрашиваются разрешения на получение уведомлений:

      Firebase.Messaging.FirebaseMessaging.RequestPermissionAsync().ContinueWithOnMainThread(
        task => {
          LogTaskCompletion(task, "RequestPermissionAsync");
        }
      );

Образец OnMessageReceived очень общий. Вы можете увидеть, как получить сообщение только с заголовком/телом:

      if (notification != null) {
        DebugLog("title: " + notification.Title);
        DebugLog("body: " + notification.Body);
        var android = notification.Android;
        if (android != null) {
            DebugLog("android channel_id: " + android.ChannelId);
        }
      }

или, необязательно, массив ключей/значений, о котором вы спрашивали:

      if (e.Message.Data.Count > 0) {
        DebugLog("data:");
        foreach (System.Collections.Generic.KeyValuePair<string, string> iter in
                 e.Message.Data) {
          DebugLog("  " + iter.Key + ": " + iter.Value);
        }
      }

На iOS вам нужно просто настроить параметры APN: https://firebase.google.com/docs/cloud-messaging/ios/certs

Дайте мне знать, если это вас отклеит!

Эй, спасибо! Я проверю это сегодня! Итак, базовая настройка уже работает, и я могу получать push-уведомления. Итак, для включения глубоких ссылок в уведомление я использую пару значений ключа в консоли Firebase?

ElHombre 13.06.2019 03:58

Я думаю, что вы должны быть в состоянии получить пару ключ/значение, которую вы установили в консоли. Я не знаком со всеми тонкостями обмена сообщениями и глубинными ссылками, я просто привык смешивать нативный код iOS и Android с Unity.

Patrick Martin 14.06.2019 17:46

Другие вопросы по теме