Как настроить Firebase Push-уведомление с Deep Link с Unity3D - PullRequest
0 голосов
/ 12 июня 2019

Я внедряю 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); }</p> <pre><code>/** * 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 в целом?

1 Ответ

1 голос
/ 12 июня 2019

Этот код с 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...