我正在使用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;
答案 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。