# #android #firebase #kotlin #firebase-dynamic-links
Вопрос:
Я пытаюсь реализовать направление в своем приложении с помощью динамической ссылки Firebase.
Счастливый путь был бы:
- Ссылка используется совместно с токеном JWT в качестве параметра
- Другой пользователь нажимает на ссылку, у него нет приложения, поэтому он переходит в Playstore
- После установки приложения при запуске приложения токен JWT извлекается через параметры и сохраняется локально
- Новая регистрация завершена, токен отправляется на серверную часть для активации вознаграждения реферера
Проблема в том, что в этом сценарии шаг 3 не находит никаких данных при первом запуске приложения, в то время как они обнаруживаются, когда я снова нажимаю на ссылку после установки приложения.
Именно таким образом создается ссылка для реферера:
val parameters = new DynamicLink.SocialMetaTagParameters.Builder() .setImageUrl(...) .setTitle(...) .build(); val link = Uri.parse("https://my.domain.com/path/?token=${jwtToken}"); val dynamicLink = FirebaseDynamicLinks.getInstance().createDynamicLink() .setLink(link) .setSocialMetaTagParameters(parameters) .setDomainUriPrefix("https://my.domain.com") .setAndroidParameters(DynamicLink.AndroidParameters.Builder().build())) .setIosParameters(...) .setNavigationInfoParameters( DynamicLink.NavigationInfoParameters.Builder() .setForcedRedirectEnabled(true) .build ).buildDynamicLink()
Ссылка сокращается на:
FirebaseDynamicLinks.getInstance().createDynamicLink() .setDomainUriPrefix("https://my.domain.com/") .setLongLink(dynamicLink.getUri()) .buildShortDynamicLink() .addOnCompleteListener(activity, task -gt; { if (task.isSuccessful() amp;amp; task.getResult() != null) { linkCallback.success(task.getResult().getShortLink().toString()); } else { linkCallback.failure(task.getException()); } })
При открытии приложения ссылка считывается в методе onResume() начального действия :
override fun onResume() { super.onResume() FirebaseDynamicLinks.getInstance() .getDynamicLink(getIntent()) // getIntent() refers to the Activity's method .addOnSuccessListener(activity) { data -gt; // Get deep link from result (may be null if no link is found) val isReferralLink = data?.link?.toString()?.startsWith("https://my.domain.com/path") == true val jwt = data?.link?.getQueryParameter("token") // Here, data is null. lt;------- // Other attempt : data?.let { aiData -gt; FirebaseAppInvite.getInvitation(aiData)?.let { result -gt; // Here result is still null } } } }
Я видел в потоке переполнения стека, что он не выдерживает установки бета-трека, поэтому я попытался оставить бета-версию и использовать удаленную конфигурацию, чтобы скрыть ее в рабочем треке, но я не смог увидеть никакой разницы.
И версия, которую я использую, такова :
implementation 'com.google.firebase:firebase-dynamic-links:21.0.0' implementation 'com.google.firebase:firebase-analytics:20.0.0' implementation 'com.google.firebase:firebase-invites:17.0.0'
Вопрос: Есть ли что-то, чего мне здесь не хватает ?
Заранее благодарю вас за вашу помощь !
Редактировать:
В этом случае ссылка и токен будут найдены правильно.
- Ссылка используется совместно с токеном JWT в качестве параметра
- Другой пользователь нажимает на ссылку, у него нет приложения, поэтому он переходит в Playstore
- После установки приложения второй пользователь снова нажимает на ссылку и открывает приложение в первый раз
Комментарии:
1. и что происходит,
data?.link
когда послеvar isReferralLink ...
2. Извините, я только что проверил его заново, и данные на самом деле пусты.
Ответ №1:
Итак, после нескольких дней тестирования и исследований я выяснил, почему это не работает.
FirebaseDynamicLinks.getInstance() .getDynamicLink(getIntent()) .addOnSuccessListener(activity) { data -gt; // Some data reading }
В этом случае я использовал addOnSuccessListener() с параметром activity в качестве параметра, который делает его осведомленным о жизненном цикле. В моем приложении новый пользователь (новая установка) будет перенаправлен на входную активность, поэтому активность слушателя приостанавливается, а обратный вызов никогда не запускается.
=gt; TLDR: Удаление этого параметра активности решило мою проблему.