使用不直接提供APK

时间:2018-02-21 12:53:43

标签: android branch.io

我正在使用Branch.io

为我的Android应用实施延迟深层链接

我正在处理用户单击链接但没有安装应用程序的用例(我的链接在安装应用程序时已经可用)。 目前我的应用程序不是在Play商店托管,而是在Fabric中托管。因此,我设置了我的深层链接,将用户重定向到以下网址:https://betas.to/ ...这样他最终可以下载Beta,然后下载应用。

不幸的是,我无法使用以下用例:

- >用户点击Android设备的深层链接(无应用)

- >用户到Fabric网页提供他的电子邮件进行测试

- >用户打开Fabric电子邮件

- >用户下载Beta(可选)

- >用户下载带有Beta版的应用

- >应用程序启动,并将延迟的深层链接纳入帐户

最后一步出现问题:不再考虑初始深层链接。我想这是因为最终没有从链接打开应用程序。

我可以期待这种流程以某种方式运作吗?如果没有,我想知道我在分支仪表板中提供的URL是否必须直接指向APK文件。

更新1

我刚刚意识到,当我测试延迟的深层链接时,我收到了与分支相关的错误(在Branch deferred deeplink testing procedure之后)。只有在我点击链接后才从Android Studio安装应用程序时才会出现此错误。 我觉得有些事情阻止了Branch正确捕获应用程序安装事件。

这是我得到的:

  

拒绝先前失败的类的重新初始化   java.lang.Class中:   java.lang.NoClassDefFoundError:解析失败:   LCOM /安卓/ installreferrer / API / InstallReferrerStateListener;       at void io.branch.referral.InstallListener.captureInstallReferrer(android.content.Context,   long,io.branch.referral.InstallListener $ IInstallReferrerEvents)   (InstallListener.java:54)       at void io.branch.referral.Branch.registerAppInit(io.branch.referral.Branch $ BranchReferralInitListener,   io.branch.referral.ServerRequest $ PROCESS_WAIT_LOCK)(Branch.java:2318)       在void io.branch.referral.Branch.initializeSession(io.branch.referral.Branch $ BranchReferralInitListener)   (Branch.java:2272)       at void io.branch.referral.Branch.initUserSessionInternal(io.branch.referral.Branch $ BranchReferralInitListener,   android.app.Activity,boolean)(Branch.java:1255)       at boolean io.branch.referral.Branch.initSession(io.branch.referral.Branch $ BranchReferralInitListener,   android.app.Activity)(Branch.java:917)       at boolean io.branch.referral.Branch.initSessionWithData(android.net.Uri,   android.app.Activity)(Branch.java:1037)       at void io.branch.referral.Branch.startSession(android.app.Activity)   (Branch.java:2522)       at void io.branch.referral.Branch.access $ 1000(io.branch.referral.Branch,   android.app.Activity)(Branch.java:73)       在void io.branch.referral.Branch $ BranchActivityLifeCycleObserver.onActivityStarted(android.app.Activity)   (Branch.java:2458)       at void android.app.Application.dispatchActivityStarted(android.app.Activity)   (Application.java:231)       at void android.app.Activity.onStart()(Activity.java:1271)       在void android.support.v4.app.FragmentActivity.onStart()(FragmentActivity.java:564)       在void android.support.v7.app.AppCompatActivity.onStart()(AppCompatActivity.java:177)       在void com ... MyActivity.onStart()   (MyActivity.java:48)       at void android.app.Instrumentation.callActivityOnStart(android.app.Activity)   (Instrumentation.java:1256)       at void android.app.Activity.performStart()(Activity.java:6972)       在android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread $ ActivityClientRecord,   android.content.Intent)(ActivityThread.java:2937)       在void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread $ ActivityClientRecord,   android.content.Intent,java.lang.String)(ActivityThread.java:3045)       at void android.app.ActivityThread.-wrap14(android.app.ActivityThread,   android.app.ActivityThread $ ActivityClientRecord,   android.content.Intent,java.lang.String)(ActivityThread.java:-1)       在void android.app.ActivityThread $ H.handleMessage(android.os.Message)   (ActivityThread.java:1642)       在void android.os.Handler.dispatchMessage(android.os.Message)(Handler.java:102)       at void android.os.Looper.loop()(Looper.java:154)       at void android.app.ActivityThread.main(java.lang.String [])(ActivityThread.java:6776)       at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object,java.lang.Object [])   (Method.java:-2)       at void com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run()   (ZygoteInit.java:1496)       at void com.android.internal.os.ZygoteInit.main(java.lang.String [])   (ZygoteInit.java:1386)引起:java.lang.ClassNotFoundException:   没找到上课   " com.android.installreferrer.api.InstallReferrerStateListener"上   path:DexPathList [[zip文件   " /data/app/com.myapp.debug-1/base.apk"],nativeLibraryDirectories = [/数据/应用/ com.myapp.debug-1 / LIB /臂,   /data/app/com.myapp.debug-1/base.apk!/lib/armeabi-v7a,   / system / lib,/ vendor / lib]]       at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String)   (BaseDexClassLoader.java:56)       at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String,boolean)   (ClassLoader.java:380)       at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String)   (ClassLoader.java:312)       at void io.branch.referral.InstallListener.captureInstallReferrer(android.content.Context,   long,io.branch.referral.InstallListener $ IInstallReferrerEvents)   (InstallListener.java:54)       at void io.branch.referral.Branch.registerAppInit(io.branch.referral.Branch $ BranchReferralInitListener,   io.branch.referral.ServerRequest $ PROCESS_WAIT_LOCK)(Branch.java:2318)       在void io.branch.referral.Branch.initializeSession(io.branch.referral.Branch $ BranchReferralInitListener)   (Branch.java:2272)       at void io.branch.referral.Branch.initUserSessionInternal(io.branch.referral.Branch $ BranchReferralInitListener,   android.app.Activity,boolean)(Branch.java:1255)       at boolean io.branch.referral.Branch.initSession(io.branch.referral.Branch $ BranchReferralInitListener,   android.app.Activity)(Branch.java:917)       at boolean io.branch.referral.Branch.initSessionWithData(android.net.Uri,   android.app.Activity)(Branch.java:1037)       at void io.branch.referral.Branch.startSession(android.app.Activity)   (Branch.java:2522)       at void io.branch.referral.Branch.access $ 1000(io.branch.referral.Branch,   android.app.Activity)(Branch.java:73)       在void io.branch.referral.Branch $ BranchActivityLifeCycleObserver.onActivityStarted(android.app.Activity)   (Branch.java:2458)       at void android.app.Application.dispatchActivityStarted(android.app.Activity)   (Application.java:231)       at void android.app.Activity.onStart()(Activity.java:1271)       在void android.support.v4.app.FragmentActivity.onStart()(FragmentActivity.java:564)       在void android.support.v7.app.AppCompatActivity.onStart()(AppCompatActivity.java:177)       在void com ..... MyActivity.onStart()   (MyActivity.java:48)       at void android.app.Instrumentation.callActivityOnStart(android.app.Activity)   (Instrumentation.java:1256)       at void android.app.Activity.performStart()(Activity.java:6972)       在android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread $ ActivityClientRecord,   android.content.Intent)(ActivityThread.java:2937)       在void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread $ ActivityClientRecord,   android.content.Intent,java.lang.String)(ActivityThread.java:3045)       at void android.app.ActivityThread.-wrap14(android.app.ActivityThread,   android.app.ActivityThread $ ActivityClientRecord,   android.content.Intent,java.lang.String)(ActivityThread.java:-1)       在void android.app.ActivityThread $ H.handleMessage(android.os.Message)   (ActivityThread.java:1642)       在void android.os.Handler.dispatchMessage(android.os.Message)(Handler.java:102)       at void android.os.Looper.loop()(Looper.java:154)       at void android.app.ActivityThread.main(java.lang.String [])(ActivityThread.java:6776)       at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object,java.lang.Object [])   (Method.java:-2)       at void com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run()   (ZygoteInit.java:1496)       at void com.android.internal.os.ZygoteInit.main(java.lang.String [])   (ZygoteInit.java:1386)

以下行是:

  

BranchSDK:解析失败:Lcom / android / installreferrer / api / InstallReferrerClient;

3 个答案:

答案 0 :(得分:3)

缺少的类(com.android.installreferrer.InstallReferrerClient)是Branch的依赖项,但不会自动包括在内。您必须自己将其添加到构建中。

implementation 'com.android.installreferrer:installreferrer:1.0'

Branch's gradle file中查看。

它是在version 2.17中添加的,但是文档似乎没有赶上。

在读取提交后,此堆栈跟踪可能会有点红鲱鱼。该库捕获ClassNotFound异常,并记住该类不可用。它还可以帮助打印异常。

但是,install referrer package涉及跟踪安装过程中的引荐来源,因此与您的复制步骤相匹配。

答案 1 :(得分:1)

TLDR; 您应该始终在活动开始时调用此方法:

Branch.getInstance().initSession(BranchReferralInitListener callback, @NonNull Uri data, Activity activity)

即使你有一个空Uri

由于Branch API使用@NonNull注释了这个参数,我感到很困惑。

我检查了源代码,并确认Branch正确处理了null值。当传入null时,Branch将自动检测它是冷启动还是延迟深层链接。

这是相关的piece of code from their github

// In case of a cold start by clicking app icon or bringing app to foreground Branch link click is always false.
if (intent.getData() == null || (!isActivityCreatedAndLaunched && isIntentParamsAlreadyConsumed(activity))) {
    // Considering the case of a deferred install. In this case the app behaves like a cold start but still Branch can do probabilistic match.
    // So skipping instant deep link feature until first Branch open happens
    if (!prefHelper_.getInstallParams().equals(PrefHelper.NO_STRING_VALUE)) {
        JSONObject nonLinkClickJson = new JSONObject();
        try {
            nonLinkClickJson.put(Defines.Jsonkey.Clicked_Branch_Link.getKey(), false);
            nonLinkClickJson.put(Defines.Jsonkey.IsFirstSession.getKey(), false);
            prefHelper_.setSessionParams(nonLinkClickJson.toString());
                isInstantDeepLinkPossible = true;
        } catch (JSONException e) {
             e.printStackTrace();
        }
    }
}

答案 2 :(得分:0)

布莱恩来自分公司。<​​/ p>

如果在安装应用程序时常规深度链接有效,则延迟深度链接也应该起作用。请确保您在onStart方法中初始化Branch并覆盖onNewIntent:

此外,我会通过点击分支链接并通过Android Studio在设备上构建应用来测试延迟深层链接:

自定义网址不需要直接指向APK文件。如果您仍遇到问题,可以写信至integrations@branch.io。