Android上的Firebase动态链接无法在安装过程中继续

时间:2017-05-22 11:55:07

标签: firebase firebase-dynamic-links

我的问题类似于this recent question for iOS

Firebase动态链接在应用程序已存在的设备上按预期工作,但是当我从Play商店安装应用程序(目前处于测试版渠道)时,我无法获得推介。

具体而言,当从PlayStore测试版渠道安装应用时,AppInviteReferral.hasReferral(getIntent())会返回false

根据链接的答案,动态链接大部分时间都在工作,但可能存在未记录的边缘情况会导致其失败。我将突出显示我的案例的具体内容,因此您可以帮助我找到我的设置中缺少的内容。

  1. 我刚刚从10.2.6将我的Firebase库更新为10.2.4。更改日志中的Firebase邀请库没有任何更改。
  2. 如果重要,这是我包含库的顺序

    compile 'com.google.firebase:firebase-core:10.2.6'
    compile 'com.google.firebase:firebase-messaging:10.2.6'
    compile 'com.google.firebase:firebase-auth:10.2.6'
    compile 'com.google.firebase:firebase-database:10.2.6'
    compile 'com.google.firebase:firebase-invites:10.2.6'
    
    1. 我的SplashScreenActivity.java既是启动器活动,也是接受和处理深层链接的活动。这是AndroidManifest中的活动声明

      <activity
          android:name=".ui.setup.SplashScreenActivity"
          android:label="@string/app_name"
          android:theme="@style/SplashTheme">
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
      
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
          <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:scheme="https"
                  android:host="deeplinks.myCompanyDomain.com"
                  android:pathPrefix="/mobile"/>
          </intent-filter>
      </activity>
      
    2. SplashScreenActivity.javasetContentView(int id)。它只是使用一个主题来显示启动画面,而应用程序的其余资源“加载”。我不知道这是否重要,但我把它放在那里。

    3. 在应用程序启动之前,我会检查以确保该应用程序具有所需的权限。 continueIntoApp()方法(我想不出一个更好的名称)会在用户发现具有所需权限时,或者在用户授予应用程序所需的全部四个权限后将其带入应用程序。

    4. continueIntoApp()是实现Firebase Dynamic Links Docs上找到的所有代码的地方。我首先构建并连接GoogleApiClient

      GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
              .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() {
                  @Override
                  public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
                      LogUtils.e("Deeplink connection failed");
                      LogUtils.e(connectionResult.getErrorMessage());
                      LogUtils.e(String.valueOf(connectionResult.getErrorCode()));
                  }
              })
              .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                  @Override
                  public void onConnected(@Nullable Bundle bundle) {
                      LogUtils.d("Connected!");
                  }
      
                  @Override
                  public void onConnectionSuspended(int i) {
                      LogUtils.e("Connection suspended!");
                  }
              })
              .addApi(AppInvite.API)
              .build();
      
      googleApiClient.connect();
      
    5. 另外,动态链接文档假设开发人员已经知道如何设置GoogleApiClient。我没有。经过几个令人沮丧的日子之后,我意外地发现#connect()方法实际上让GoogleApiClient做了它应该做的事情。

      在此之后,我会检查AppInviteReferral是否有推介。

          //boolean autoLaunchDeepLink = true;
          if(AppInviteReferral.hasReferral(getIntent())){
              LogUtils.d("Referral found!");
              AppInvite.AppInviteApi.getInvitation(googleApiClient, SplashScreenActivity.this, true)
                      .setResultCallback(new ResultCallback<AppInviteInvitationResult>() {
                          @Override
                          public void onResult(@NonNull AppInviteInvitationResult appInviteInvitationResult) {
      
                              LogUtils.d("Processing appInviteInvitationResult...");
      
                              if(appInviteInvitationResult.getStatus().isSuccess()){
                                  Intent intent = appInviteInvitationResult.getInvitationIntent();
                                  String deepLink = AppInviteReferral.getDeepLink(intent);
      
                                  LogUtils.d("Deeplink is " + deepLink);
                                  AppConfig appConfig = new AppConfig(SplashScreenActivity.this);
                                  appConfig.put(ModelKeys.TEMP_JOIN_BRANCH_DEEPLINK, deepLink);
                                  startActivity(new Intent(SplashScreenActivity.this, MainActivity.class));
                                  //parseDeeplink(deepLink);
                              }else {
                                  LogUtils.d("No deeplink found!");
                                  startActivity(new Intent(SplashScreenActivity.this, MainActivity.class));
                              }
                          }
                      });
          }else {
              LogUtils.d("No referral found!");
              startActivity(new Intent(SplashScreenActivity.this, MainActivity.class));
          }
      

      您会注意到我已注释掉autoLaunchDeepLink,默认情况下会将true传递给AppInvite.AppInviteApi.getInvitation()。我仍然不确定何时应将此值设置为truefalse。在动态链接(autoLaunchDeepLinkfalse)全新安装后,我也不知道如何“启动动态链接”。

      就动态链接实现而言。我的问题如上所述:当我已经安装了应用程序时,AppInviteReferral.hasReferral(getIntent())返回true,代码正常运行。当用户关注PlayStore的动态链接并下载测试版时,AppInviteReferral.hasReferral(getIntent())会返回false,并且不会跟踪深层链接。

      为什么会这样?我错过了什么?

2 个答案:

答案 0 :(得分:2)

我认为你没有遗漏任何东西 - 看起来Play商店并没有为Beta频道安装发送INSTALL_REFERRER广播,而且它的推荐者也被用作机制在安装后传递deeplink。

如果您正在使用产品应用,它应该可以正常工作,但有点好奇,测试版安装不支持。

答案 1 :(得分:0)

有同样的问题。我们的问题是我们在AndroidManifest.xml 中有两个几乎相似的意图过滤器,这导致Google Play失去了我们想要的意图。它没有显示“继续”按钮,而是将我们重定向到播放中的卸载/打开页面。

建议与之合作 https://firebase.google.com/docs/dynamic-links/android/receive