通用链接打开我的应用程序但不调用 application:continueUserActivity:restorationHandler

Posted

技术标签:

【中文标题】通用链接打开我的应用程序但不调用 application:continueUserActivity:restorationHandler【英文标题】:Universal Link opens my app but doesn't call application:continueUserActivity:restorationHandler 【发布时间】:2016-08-08 21:56:44 【问题描述】:

我正在尝试在我的应用中实现通用链接。我阅读了很多教程,并按照这封信: How to support Universal Links in ios App and setup server for it?

当我单击通用链接时,我的应用成功打开,但我的 AppDelegate.m 文件中的 application:continueUserActivity:restorationHandler 未被调用,因此我无法定向到应用中的特定页面。

我的 apple-app-site-association 文件位于 https 上,对于路径,我放置了 [ "*", "/" ]。我三重检查了应用程序前缀和 ID,确认在开发者网站和我的目标中都启用了 AssociatedDomains。在 Associated Domains 部分中,我放置了我的根域以及以 * 开头的第二个条目。处理所有可能的子域。我是在真机上进行测试,而不是在模拟器上。

-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler 
    ALog(@"Did I get here?");

任何人都可以就我应该查看的内容提供建议以弄清楚为什么没有调用application:continueUserActivity:restorationHandler

更新:

我使用了 Apple 的验证工具 https://search.developer.apple.com/appsearch-validation-tool,它给出了这样的结果:

应用链接

需要操作

无法提取通用链接所需的信息。了解如何实施推荐的通用链接。

错误没有具有域权利的应用程序 用于验证深度链接双重身份验证的权利数据来自您应用的当前发布版本。此数据可能需要 48 小时才能更新。

我不知道这是否与我的问题有关。我不这么认为,因为我需要测试我的应用程序以确保在实际发布更新之前正确实施了通用链接。

【问题讨论】:

自从您的应用程序打开以来,您已经解决了 99% 的通用链接常见问题。您无需担心来自 Apple 验证工具的消息——我几乎从未见过它不存在,而且它存在于许多完美运行的实现中。您使用什么方法来确定 continueUserActivity 处理程序没有被调用? 我在第一行放了一个 ALog 语句,它永远不会被打印出来。我确实发现application:openURL:sourceApplication:annotation 被调用了,但又不知道为什么。根据文档application:continueUserActivity:restorationHandler 应该被调用。 嗯。您是在物理设备而不是模拟器上测试它,对吗?我们可能需要看一个实际的链接示例 链接格式为mydomain://phase1/phase2?key1=var1&key2=var2#hash。我目前的解决方法是只使用application:openURL:sourceApplication:annotation,但我仍然想知道为什么会触发而application:continueUserActivity:restorationHandler 不会。 @primehalo 如果你在你的应用中实现了 Google Analytics 和 Localytics,你可能想看看这个 git 问题:github.com/BranchMetrics/ios-branch-deep-linking/issues/485 【参考方案1】:

如果应用中使用了 Google Analytics 或某些 Firebase 功能,则可能是由于方法混用造成的。在application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) 中添加以下方法为我解决了这个问题。我认为禁用方法混合也可以。

private func swizzleSelectors() 
    
    let aClass: AnyClass! = object_getClass(UIApplication.shared.delegate)
    let originalMethod = class_getInstanceMethod(aClass, #selector(self.application(_:continue:restorationHandler:)))
    let swizzledMethod = class_getInstanceMethod(aClass, #selector(UIApplication.shared.delegate!.application(_:continue:restorationHandler:)))
    if let originalMethod = originalMethod, let swizzledMethod = swizzledMethod 
        method_exchangeImplementations(originalMethod, swizzledMethod)
    

【讨论】:

【参考方案2】:

现在的问题可能是消息没有发送到 AppDelegate,而是发送到其继任者:场景委托。因此,请改用此方法:

UIWindowSceneDelegate::scene(_ scene: UIScene, continue userActivity: NSUserActivity)

【讨论】:

以上是关于通用链接打开我的应用程序但不调用 application:continueUserActivity:restorationHandler的主要内容,如果未能解决你的问题,请参考以下文章

通用链接, continueUserActivity 和 sourceApplication 未被调用

单击通用链接在我的应用程序中打开 WKWebView

使用通用链接在我的会议应用程序中打开 jitsi 视频,但它只打开我的 App.not 会议

Branch.io 自定义网址缩短器和通用链接

在委托方法中无法检测到 IOS 通用链接

如何不以编程方式处理一些通用链接?