ios - 未使用正确的元数据调用 Branch.io 深度链接处理程序

标签 ios branch.io deeplink

情况是这样的:如果我点击与自定义键/值关联的链接之一,来自 initSessionWithLaunchOptions:andRegisterDeepLinkHandler 的回调将被正常触发,但仅“params”包含自定义键/值(如果应用程序是从链接新打开的)。如果应用程序已经在后台运行并且我单击链接,则会调用回调但不存在任何参数。这在几周前还有效,现在似乎停止工作了。我也尝试升级到 iOS SDK 0.12.1,但还没有成功。

作为解决方法,我尝试在应用程序激活后对 Branch.getInstance().getLatestReferringParams() 进行延迟调用,有时我会从那里获取参数,但它不是确定性的,有时需要 2 秒,有时需要 10 秒,有时永远不会。 @AlexBauer 这是应用程序委托(delegate)的部分。顺便说一句,我的应用程序中没有 Facebook 集成:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let branch: Branch = Branch.getInstance()
    branch.initSessionWithLaunchOptions(launchOptions, andRegisterDeepLinkHandler: { params, error in
        if (error == nil) {
            print(params)
            self.tryInviteFlow(params)
        } else {
            print(error.localizedDescription)
        }
    })
}

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
    // pass the url to the handle deep link call
    return Branch.getInstance().continueUserActivity(userActivity);
}

最佳答案

这是一个快速故障排除入门,用于解决分支链接在冷启动时正常工作但在应用程序在后台运行后变得活跃时无法正常工作的问题...

当从分支链接打开应用程序时:

  • 如果应用冷启动(即不在后台),则入口点为 didFinishLaunchingWithOptions
  • 如果应用位于后台并通过通用链接打开(如果设备运行 iOS 9.2+,则会出现这种情况),入口点将为 continueUserActivity 函数
  • 如果通过 URI 方案打开应用程序(如果设备运行的是 iOS 9 之前的版本,则可能是这种情况,对于 iOS 9 至 9.2 的版本也可能是这种情况),入口点将是 openURL功能

插入到 openURL 和 continueUserActivity 函数中的 Branch 代码也会调用 didFinishLaunchingWithOptions 中定义的相同 Branch init 回调:

  • 在 openURL 中是:Branch.getInstance().handleDeepLink(url);
  • 在 continueUserActivity 中,这是:Branch.getInstance().continue(userActivity)

如果不调用这些分支函数,则在恢复应用时将不会调用接收链接参数的分支初始化回调,因此链接参数将不可用。

即使调用这些函数,openURL 和 continueUserActivity 函数中的其他代码也可能会阻止到达分支代码。如果这些代码路径中有其他代码,请通过在 Branch 函数或 init 回调中的代码行上设置断点进行测试来验证是否确实正在调用相应的 Branch 函数。

另一种可能导致热启动问题而非冷启动问题的潜在情况是,在 Branch init 回调之外且在该回调完成之前调用读取 Branch 参数的代码。如果应用程序在 didFinishLaunchingWithOptions 中足够繁忙,则 init 回调可能会延迟足够长的时间,以便 init 回调在检查参数之前完成。稍后,当应用程序恢复时,应用程序中发生的情况可能会减少,并且可能会在 init 回调完成之前检查检查参数的代码。这种情况不太可能发生,但有可能发生。

为了避免这种“竞争条件”类型的情况,仅在 init 回调中检查分支链接参数,或者在收到已配置为表明 init 回调正在完成的通知后检查(您可以查看使用的示例) SDK 附带的 TestBed-Swift 项目中以这种方式发出通知,此处: https://github.com/BranchMetrics/ios-branch-deep-linking/tree/master/Branch-TestBed-Swift )。

关于ios - 未使用正确的元数据调用 Branch.io 深度链接处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37380423/

相关文章:

javascript - 试图将 JS 脚本移植到 Swift,但计算不正确

ios - iOS 的 Branch.io 链接在安装后不传递数据,但适用于冷启动

Android Branch IO 深度链接无法打开我的应用程序

ios - 如果多个应用程序指向同一个域,通用链接不会显示应用程序选择菜单

IOS- 与 Firebase 的通用链接和使用 location.href 的错误?

ios - 如何快速显示数组的所有元素?

objective-c - 从 XML 文件构建 iOS 应用程序

ios - 如何快速创建和添加值到字典

android - Android 中的动态深度链接

android - 通过 web 链接/html/web 应用程序启动安装的第三方 android 应用程序?