Я внедряю 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 в целом?





Этот код с 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
Дайте мне знать, если это вас отклеит!
Я думаю, что вы должны быть в состоянии получить пару ключ/значение, которую вы установили в консоли. Я не знаком со всеми тонкостями обмена сообщениями и глубинными ссылками, я просто привык смешивать нативный код iOS и Android с Unity.
Эй, спасибо! Я проверю это сегодня! Итак, базовая настройка уже работает, и я могу получать push-уведомления. Итак, для включения глубоких ссылок в уведомление я использую пару значений ключа в консоли Firebase?