10

我为用户创建了一个动态链接,以在我的应用程序中分享一些内容。

href当我在 Android 设备上使用标签单击 HTML 页面中的链接时,该链接有效。

这意味着,如果未安装该应用程序,请转到 Play 商店,否则打开该应用程序,我会收到深层链接地址。

但是,当链接在其他地方(如 facebook Messenger 或电子邮件等)完全相同时。我单击该链接,然后它就不起作用了。

即使我的应用程序已经安装,它也总是被重定向到 Play 商店。

有什么问题?

我的代码在这里。

  • .java 用于接收深层链接

    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 中活动的意图部分

        <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>  
    
  • 动态链接

    https://mycode.app.goo.gl/?link=web page address &al= my custom scheme for sharing&apn=my android app's package name

4

3 回答 3

8

我们已根据此文档https://firebase.google.com/docs/dynamic-links/实施 Firebase 动态链接,并且它们在除 Facebook 和 Facebook Messenger 应用程序之外的所有情况下都能正常工作。

首先,我们生成一个指向我们应用程序的动态链接:

Builder builder = new Builder()
  .scheme("https")
  .authority("winged-guild-133523.appspot.com")
  .appendPath("share")
  .appendQueryParameter("query", query);

然后我们生成长动态链接:

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用短链接交换长动态链接,并使用意图共享它:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, text);
startActivity(Intent.createChooser(intent, null));

如果我们使用 Facebook 应用分享此链接:

  • 短链接已正确共享。
  • 如果未安装该应用程序,则单击 Facebook 应用程序中的链接会正确转到 Google Play,并且在安装该应用程序后,深层链接会得到正确处理。
  • 如果安装了应用程序,单击 Facebook 应用程序中的链接也会转到 Google Play,单击打开按钮后,深层链接不会转移到应用程序,因为如果安装没有,Google Play 不会将引荐来源信息传递给应用程序被执行。

如果我们使用 Facebook Messenger 应用分享此链接:

所以我在这里看到三个问题:

  • Facebook 应用程序未正确检测到该应用程序已安装。
  • Facebook Messenger 应用程序共享一个长动态链接而不是短链接。
  • Facebook Messenger 应用程序可以检测到该应用程序已安装,但如果未安装该应用程序,则会转到链接而不是 Google Play。

有谁知道发生了什么以及如何解决这些问题?

PS:虽然这无关紧要,因为应用程序中的深层链接处理工作正常,这是我们的清单意图过滤器:

  <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>
于 2017-01-04T13:45:52.900 回答
0

这里同样的问题。iOS 和 Facebook 应用内浏览器。

据此,截至 2019 年 12 月 19 日,仍然是一个未解决的问题。

但是,删除“efr=1”参数(换句话说,您必须显示预览页面)使其工作。这就是关闭问题的开发人员所说的,但这当然不是一个理想的解决方案。

正如同一链接上的一位用户所解释的那样,您可以通过以下 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);
}

这是这里评价最高的答案。

......

对我个人而言,这在一定程度上起作用,因为用户首先访问我的网站,我在其中提供动态链接。因此,我的网站处理逻辑并且仅在用户使用 Facebook 浏览器和 iOS 时传递“efr=1”。同样,不理想,所以希望他们能解决这个长期存在的问题。

可能有点,正如该链接上的开发人员所说,“afaik 目前无法在不使用预览页面的情况下通过 Facebook、Messenger 或微信应用程序之外的通用链接打开应用程序......”

是另一个 Github 问题供您参考。

于 2019-12-19T23:04:53.300 回答
-1
//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"
于 2016-12-19T12:55:11.420 回答