Firebase 动态链接在特定情况下未启动我的应用程序
Firebase dynamic links is not launching my app in specific situation
我制作了动态 link 供用户在我的应用中分享一些内容。
当我在 Android 设备上使用 href
标签单击 HTML 页面中的 link 时,link 正常工作。
这意味着,如果未安装该应用程序,请转到 Play 商店,否则打开该应用程序,我可以获得深度 link 地址。
但是当 link 在其他地方如 facebook 信使或电子邮件等完全相同时。我单击 link,然后它不起作用。
即使我的应用已经安装,它也总是被重定向到 Play 商店。
有什么问题?
我的代码在这里。
.java 接收深度 link
GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(AppInvite.API)
.build();
boolean autoLaunchDeepLink = false;
AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, autoLaunchDeepLink)
.setResultCallback(
new ResultCallback<AppInviteInvitationResult>() {
@Override
public void onResult(@NonNull AppInviteInvitationResult result) {
if (result.getStatus().isSuccess()) {
// Extract deep link from Intent
Intent intent = result.getInvitationIntent();
String deepLink = AppInviteReferral.getDeepLink(intent);
Log.e("sf", "### deep link : " + deepLink );
} else {
Log.d("asdf", "getInvitation: no deep link found.");
}
}
});
AndroidManifest.xml
中 activity 的意图部分
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="mycode.app.goo.gl/"
android:scheme="https"
android:pathPattern=".*" />
</intent-filter>
动态link
https://mycode.app.goo.gl/?link=web page address
&al=my custom scheme for sharing
&apn=my android app's package name
//Remove this lines
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE"/>
and android:pathPattern=".*" /> //not required remove it also
and use android:scheme="http"
我们已根据此文档实施了 Firebase 动态链接 https://firebase.google.com/docs/dynamic-links/,它们在除 Facebook 和 Facebook Messenger 应用程序之外的所有情况下都能正常工作。
首先我们为我们的应用程序生成动态 link:
Builder builder = new Builder()
.scheme("https")
.authority("winged-guild-133523.appspot.com")
.appendPath("share")
.appendQueryParameter("query", query);
然后我们生成长动态link:
Builder builder = new Builder()
.scheme("https")
.authority("zkkf4.app.goo.gl")
.appendPath("")
.appendQueryParameter("link", deepLink)
.appendQueryParameter("apn", "com.mydomain.myapp");
然后我们在 https://firebasedynamiclinks.googleapis.com/v1/shortLinks 将长动态 link 与短 link 交换并使用 intent:
共享
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, text);
startActivity(Intent.createChooser(intent, null));
如果我们使用 Facebook 应用分享此 link:
- 短片 link 已正确分享。
- 如果未安装该应用程序,在 Facebook 应用程序中单击 link 会正确进入 Google 播放,并且在安装该应用程序后正确处理深度 link。
- 如果安装了应用程序,点击 Facebook 应用程序中的 link 也会进入 Google 播放,点击打开按钮后,深度 link 不会转移到应用程序,因为 Google 如果尚未执行安装,Play 不会将引荐来源信息传递给应用程序。
如果我们使用 Facebook Messenger 应用分享此 link:
- link 被分享为 https://l.facebook.com/l.php?u=https%3A%2F%2Fwinged-guild-133523.appspot.com%2Fshare%3Fquery%3Dquery&h=fAQEAiTGn&s=1
- 如果安装了该应用程序,单击 Facebook Messenger 应用程序中的 link 将转到深层 link 目标(我们的网站)而不是 Google 播放。
- 如果安装了该应用程序,则在 Facebook Messenger 应用程序中单击 link 可以正确打开该应用程序。
所以我在这里看到三个问题:
- Facebook 应用程序未正确检测到该应用程序已安装。
- Facebook Messenger 应用分享长动态 link 而不是短动态。
- Facebook Messenger 应用程序可以检测到该应用程序已安装,但如果未安装该应用程序,则会转到 link 而不是 Google 播放。
有人知道发生了什么以及如何解决这些问题吗?
PS:虽然这无关紧要,因为应用程序中的深层 link 处理工作正常,但这是我们的清单意图过滤器:
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:host="winged-guild-133523.appspot.com"/>
<data android:host="www.winged-guild-133523.appspot.com"/>
<data android:pathPattern="/share.*"/>
</intent-filter>
同样的问题。 iOS 和 Facebook 应用内浏览器。
根据 this,截至 2019 年 12 月 19 日,它仍然是一个未解决的问题。
但是,删除 "efr=1" 参数(换句话说,您必须显示预览页面)使其工作。这是关闭问题的开发人员所说的,但这当然不是一个理想的解决方案。
正如同一 link 上的一位用户所解释的那样,您可以通过以下 Javascript 行检查用户是否正在使用 Facebook 应用程序内浏览器:
..... - 编辑 - 删除了这行代码---
我删除了上面的内容,因为它在不在 Facebook 应用程序中时实际上崩溃了。我在下面推荐这段代码,我在 Chrome、Safari、Firefox Android iOS.
上测试过
function isFacebookApp() {
var ua = navigator.userAgent || navigator.vendor || window.opera;
return (ua.indexOf("FBAN") > -1) || (ua.indexOf("FBAV") > -1);
}
这是评分最高的答案 。
.....
就我个人而言,这有点奏效,因为用户首先访问我的网站,我在其中提供动态 link。因此,我的网站处理逻辑并且仅在用户使用 Facebook 浏览器和 iOS 时传递 "efr=1"。同样,不理想,所以希望他们能解决这个长期存在的问题。
可能有点像link开发者说的,"afaik it is currently not possible to open an app via universal link out of the Facebook, Messenger, or WeChat apps without using a preview page..."
Here 是另一个 Github 问题供您参考。
我制作了动态 link 供用户在我的应用中分享一些内容。
当我在 Android 设备上使用 href
标签单击 HTML 页面中的 link 时,link 正常工作。
这意味着,如果未安装该应用程序,请转到 Play 商店,否则打开该应用程序,我可以获得深度 link 地址。
但是当 link 在其他地方如 facebook 信使或电子邮件等完全相同时。我单击 link,然后它不起作用。
即使我的应用已经安装,它也总是被重定向到 Play 商店。
有什么问题?
我的代码在这里。
.java 接收深度 link
GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(AppInvite.API) .build(); boolean autoLaunchDeepLink = false; AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, autoLaunchDeepLink) .setResultCallback( new ResultCallback<AppInviteInvitationResult>() { @Override public void onResult(@NonNull AppInviteInvitationResult result) { if (result.getStatus().isSuccess()) { // Extract deep link from Intent Intent intent = result.getInvitationIntent(); String deepLink = AppInviteReferral.getDeepLink(intent); Log.e("sf", "### deep link : " + deepLink ); } else { Log.d("asdf", "getInvitation: no deep link found."); } } });
AndroidManifest.xml
中 activity 的意图部分<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="mycode.app.goo.gl/" android:scheme="https" android:pathPattern=".*" /> </intent-filter>
动态link
https://mycode.app.goo.gl/?link=
web page address
&al=my custom scheme for sharing
&apn=my android app's package name
//Remove this lines
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE"/>
and android:pathPattern=".*" /> //not required remove it also
and use android:scheme="http"
我们已根据此文档实施了 Firebase 动态链接 https://firebase.google.com/docs/dynamic-links/,它们在除 Facebook 和 Facebook Messenger 应用程序之外的所有情况下都能正常工作。
首先我们为我们的应用程序生成动态 link:
Builder builder = new Builder()
.scheme("https")
.authority("winged-guild-133523.appspot.com")
.appendPath("share")
.appendQueryParameter("query", query);
然后我们生成长动态link:
Builder builder = new Builder()
.scheme("https")
.authority("zkkf4.app.goo.gl")
.appendPath("")
.appendQueryParameter("link", deepLink)
.appendQueryParameter("apn", "com.mydomain.myapp");
然后我们在 https://firebasedynamiclinks.googleapis.com/v1/shortLinks 将长动态 link 与短 link 交换并使用 intent:
共享Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, text);
startActivity(Intent.createChooser(intent, null));
如果我们使用 Facebook 应用分享此 link:
- 短片 link 已正确分享。
- 如果未安装该应用程序,在 Facebook 应用程序中单击 link 会正确进入 Google 播放,并且在安装该应用程序后正确处理深度 link。
- 如果安装了应用程序,点击 Facebook 应用程序中的 link 也会进入 Google 播放,点击打开按钮后,深度 link 不会转移到应用程序,因为 Google 如果尚未执行安装,Play 不会将引荐来源信息传递给应用程序。
如果我们使用 Facebook Messenger 应用分享此 link:
- link 被分享为 https://l.facebook.com/l.php?u=https%3A%2F%2Fwinged-guild-133523.appspot.com%2Fshare%3Fquery%3Dquery&h=fAQEAiTGn&s=1
- 如果安装了该应用程序,单击 Facebook Messenger 应用程序中的 link 将转到深层 link 目标(我们的网站)而不是 Google 播放。
- 如果安装了该应用程序,则在 Facebook Messenger 应用程序中单击 link 可以正确打开该应用程序。
所以我在这里看到三个问题:
- Facebook 应用程序未正确检测到该应用程序已安装。
- Facebook Messenger 应用分享长动态 link 而不是短动态。
- Facebook Messenger 应用程序可以检测到该应用程序已安装,但如果未安装该应用程序,则会转到 link 而不是 Google 播放。
有人知道发生了什么以及如何解决这些问题吗?
PS:虽然这无关紧要,因为应用程序中的深层 link 处理工作正常,但这是我们的清单意图过滤器:
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:host="winged-guild-133523.appspot.com"/>
<data android:host="www.winged-guild-133523.appspot.com"/>
<data android:pathPattern="/share.*"/>
</intent-filter>
同样的问题。 iOS 和 Facebook 应用内浏览器。
根据 this,截至 2019 年 12 月 19 日,它仍然是一个未解决的问题。
但是,删除 "efr=1" 参数(换句话说,您必须显示预览页面)使其工作。这是关闭问题的开发人员所说的,但这当然不是一个理想的解决方案。
正如同一 link 上的一位用户所解释的那样,您可以通过以下 Javascript 行检查用户是否正在使用 Facebook 应用程序内浏览器:
..... - 编辑 - 删除了这行代码---
我删除了上面的内容,因为它在不在 Facebook 应用程序中时实际上崩溃了。我在下面推荐这段代码,我在 Chrome、Safari、Firefox Android iOS.
上测试过function isFacebookApp() {
var ua = navigator.userAgent || navigator.vendor || window.opera;
return (ua.indexOf("FBAN") > -1) || (ua.indexOf("FBAV") > -1);
}
这是评分最高的答案
.....
就我个人而言,这有点奏效,因为用户首先访问我的网站,我在其中提供动态 link。因此,我的网站处理逻辑并且仅在用户使用 Facebook 浏览器和 iOS 时传递 "efr=1"。同样,不理想,所以希望他们能解决这个长期存在的问题。
可能有点像link开发者说的,"afaik it is currently not possible to open an app via universal link out of the Facebook, Messenger, or WeChat apps without using a preview page..."
Here 是另一个 Github 问题供您参考。