首页 > 解决方案 > 从 Xcode 启动 App Clip 时未调用 SceneDelegate 的“继续”

问题描述

我正在尝试通过从 Xcode 运行应用程序剪辑来测试我的应用程序剪辑的 url 处理程序。然而,URL 方法处理程序(SceneDelegatecontinue方法)永远不会被调用,这与 Apple 的文档文档相反,其中指出:

对于支持基于场景的应用程序生命周期事件的基于 UIKit 的应用程序剪辑和完整应用程序,请实现 UISceneDelegate 中定义的回调。例如,实现 scene(_:continue:) 回调来访问用户活动对象。

对于响应基于应用程序生命周期事件的基于 UIKit 的应用程序剪辑和完整应用程序,请实现 UIApplicationDelegate 中定义的回调。请务必实现 application( :continue:restorationHandler:) 回调,因为您无权访问 application( :didFinishLaunchingWithOptions:) 中的 NSUserActivity 对象。

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?
    
    
    func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {     
        // UGHH!!! Never gets called
        print("AppClip invocation url is : \(incomingURL)")
        
    }
    
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // OK!! This gets called
        guard let _ = (scene as? UIWindowScene) else { return } 
    }
}

在过去的两天里,我一直在用头撞墙。我错过了什么?

注意:我正在使用github 中提供的这个示例应用程序,只是修改了签名配置以使应用程序剪辑能够编译和运行。

标签: ios14apple-appclips

解决方案


continue仅当您的应用程序在之前打开后被调用时才会调用提到的方法。为了在_XCApplClipURL您的应用程序首次启动时获取设置的值,您需要使用您提到的第二种方法(scene willConnectTo session)。

你可以尝试这样的事情:

if let activity = connectionOptions.userActivities.filter({ $0.activityType == NSUserActivityTypeBrowsingWeb }).first {
  if let url = activity.webpageURL {
    print("incoming URL: \(url)")
  }
}

推荐阅读