Динамическая ссылка на firebase для Android PendingDynamicLinkData не имеет значения прямо через приложение
Проблема: почему "Короткие динамические ссылки", созданные программно, не открывают / не запускают приложение напрямую?
Я хочу запустить приложение напрямую, когда пользователь нажимает динамический URL, созданный динамически приложением Android.
При нажатии на динамическую короткую ссылку, динамически создаваемую приложением для Android, происходит следующее:
1.Опция показать два варианта, один через хром, другой через приложение.
2.Если я выбрал Chrome, браузер открывается, показывает диалоговое окно загрузки и запускает приложение с данными PendingDynamicLinkData
3.но если я выберу опцию приложения, приложение запускает приложение, но PendingDynamicLinkData теряется или имеет значение null.
Любая помощь будет великолепна. моя настройка манифеста ниже
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:host="myapp.page.link" android:scheme="http"/>
<data android:host="myapp.page.link" android:scheme="https"/>
</intent-filter>
1 ответ
Вы должны обработать ваш PendingDynamicLinkData в действии, чтобы переопределить onCreate и onNewIntent. Как это:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if (intent != null) {
handleDeepLink(intent);
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent != null) {
handleDeepLink(intent);
}
}
private void handleDeepLink(Intent intent) {
FirebaseDynamicLinks.getInstance().getDynamicLink(intent).addOnSuccessListener(pendingDynamicLinkData -> {
if (pendingDynamicLinkData != null) {
Uri deepLink = pendingDynamicLinkData.getLink();
if (deepLink != null) {
// todo .....
}
}
});
}
Я не знаю правильного решения, но нашел уловку, которая работает. Сначала убедитесь, что вы добавили следующий фильтр намерений к действию, которое должно обрабатывать динамическую ссылку:
<intent-filter android:autoVerify="true">
<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>
Затем в своей деятельности используйте следующий код, чтобы получить ссылку:
String link=null;
if (getIntent().getData()!=null){
link=getIntent().getData().toString();
}
В манифесте добавьте следующий фильтр намерений к действию, которое будет обрабатывать URL:
переопределить метод OnStart целевого Activity:
public override fun onStart() {
super.onStart()
FirebaseDynamicLinks.getInstance()
.getDynamicLink(getIntent())
.addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
@Override
public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
// Get deep link from result (may be null if no link is found)
Uri deepLink = null;
if (pendingDynamicLinkData != null) {
deepLink = pendingDynamicLinkData.getLink();
}
// ...
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "getDynamicLink:onFailure", e);
}
});
Полное руководство здесь. По какой-то причине я не мог заставить его работать в том же действии, что и действие MAIN.