Динамическая ссылка Android не выдерживает новой установки приложения

# #android #firebase #kotlin #firebase-dynamic-links

Вопрос:

Я пытаюсь реализовать направление в своем приложении с помощью динамической ссылки Firebase.

Счастливый путь был бы:

  1. Ссылка используется совместно с токеном JWT в качестве параметра
  2. Другой пользователь нажимает на ссылку, у него нет приложения, поэтому он переходит в Playstore
  3. После установки приложения при запуске приложения токен JWT извлекается через параметры и сохраняется локально
  4. Новая регистрация завершена, токен отправляется на серверную часть для активации вознаграждения реферера

Проблема в том, что в этом сценарии шаг 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'  

Вопрос: Есть ли что-то, чего мне здесь не хватает ?

Заранее благодарю вас за вашу помощь !

Редактировать:

В этом случае ссылка и токен будут найдены правильно.

  1. Ссылка используется совместно с токеном JWT в качестве параметра
  2. Другой пользователь нажимает на ссылку, у него нет приложения, поэтому он переходит в Playstore
  3. После установки приложения второй пользователь снова нажимает на ссылку и открывает приложение в первый раз

Комментарии:

1. и что происходит, data?.link когда после var isReferralLink ...

2. Извините, я только что проверил его заново, и данные на самом деле пусты.

Ответ №1:

Итак, после нескольких дней тестирования и исследований я выяснил, почему это не работает.

 FirebaseDynamicLinks.getInstance()  .getDynamicLink(getIntent())  .addOnSuccessListener(activity) { data -gt;   // Some data reading  }  

В этом случае я использовал addOnSuccessListener() с параметром activity в качестве параметра, который делает его осведомленным о жизненном цикле. В моем приложении новый пользователь (новая установка) будет перенаправлен на входную активность, поэтому активность слушателя приостанавливается, а обратный вызов никогда не запускается.

=gt; TLDR: Удаление этого параметра активности решило мою проблему.