Я пытаюсь реализовать уведомления Firebase для нашего приложения для Android.
Я также использовал Dynamic Links в приложении.
Но я не могу определить способ отправки уведомления с помощью динамической ссылки (чтобы при нажатии на уведомление открывалась определенная динамическая ссылка). Я могу видеть только вариант отправки текстового уведомления.
Есть ли какое-либо обходное решение или это ограничение FCM?
Вам нужно будет выполнить отправку уведомления на стороне сервера с помощью настраиваемых данных, поскольку в настоящее время консоль не поддерживает его. (Использование настраиваемых пар ключ-значение не будет работать так же, как если ваше приложение находится в фоновом режиме, уведомление не будет иметь глубокую ссылку). Подробнее здесь: https://firebase.google.com/docs/cloud-messaging/server
После того, как у вас есть собственный сервер приложений, вы можете добавить URL-адрес Deep Link в раздел пользовательских данных уведомления.
В вашей реализации FirebaseMessagingService
вам нужно будет посмотреть полезную нагрузку и получить URL-адрес оттуда, создать собственное намерение, использующее этот URL-адрес Deep Link.
В настоящее время я использую библиотеку диспетчера глубоких ссылок AirBnb (https://github.com/airbnb/DeepLinkDispatch), которая хорошо работает в этой ситуации, поскольку вы можете установить данные и ссылку на DeepLinkActivity, и это сделает обработку ссылок для вас. В приведенном ниже примере я конвертирую полезную нагрузку с сервера в объект, называемый DeepLinkNotification, и содержит поле URL.
private void sendDeepLinkNotification(final DeepLinkNotification notification) {
...
Intent mainIntent = new Intent(this, DeepLinkActivity.class);
mainIntent.setAction(Intent.ACTION_VIEW);
mainIntent.setData(Uri.parse(notification.getUrl()));
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntent(mainIntent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(notificationId, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = buildBasicNotification(notification);
builder.setContentIntent(pendingIntent);
notificationManager.notify(notificationId, builder.build());
}
DeepLinkActivity:
@DeepLinkHandler
public class DeepLinkActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dispatch();
}
private void dispatch() {
DeepLinkResult deepLinkResult = DeepLinkDelegate.dispatchFrom(this);
if (!deepLinkResult.isSuccessful()) {
Timber.i("Deep link unsuccessful: %s", deepLinkResult.error());
//do something here to handle links you don't know what to do with
}
finish();
}
}
При выполнении этой реализации вы также не будете открывать какие-либо ссылки, которые вы не можете обрабатывать, по сравнению с тем, если вы просто задали намерение Intent.ACTION_VIEW
с любым URL-адресом.