Вопрос:

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

c# android firebase unity3d firebase-cloud-messaging

23 просмотра

1 ответ

43 Репутация автора

Я внедряю 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); }

<pre>/** * 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?

Чтение раздела: Работа с сообщениями с помощью Deep Links на Android Я добавил код для настройки домена в свой манифест Android.

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

Автор: ElHombre Источник Размещён: 12.06.2019 02:51

Ответы (1)


0 плюса

46 Репутация автора

Этот код с onCreate указан в разделе « Настройка пользовательской точки входа Activity» . Это должно быть необходимо, только если вы следовали инструкциям по расширению 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

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

Автор: user3043663 Размещён: 12.06.2019 05:22
Вопросы из категории :
32x32