从 Xcode 启动 App Clip 时未调用 SceneDelegate 的“继续”
Posted
技术标签:
【中文标题】从 Xcode 启动 App Clip 时未调用 SceneDelegate 的“继续”【英文标题】:SceneDelegate's "continue" not called when launching App Clip from Xcode 【发布时间】:2020-09-14 21:23:54 【问题描述】:我正在尝试通过从 Xcode 运行应用剪辑来测试我的应用剪辑的 url 处理程序。然而,URL 方法处理程序(SceneDelegate
的 continue
方法)永远不会被调用,这与 Apple 的文档 documentation 相反,其中指出:
应用委托未实现对于基于 UIKit 的应用程序剪辑和支持基于场景的应用程序的完整应用程序 生命周期事件,实现 UISceneDelegate 中定义的回调。 比如实现scene(_:continue:)回调来访问用户 活动对象。
对于基于 UIKit 的应用剪辑和响应的完整应用 对于基于应用程序的生命周期事件,实现中定义的回调 UIApplicationDelegate。务必执行 application(:continue:restorationHandler:) 回调,因为你 无权访问 NSUserActivity 对象 应用程序(:didFinishLaunchingWithOptions:)。
application(_:continue:restorationHandler:)
方法
应用剪辑的方案启用了_XCApplClipURL 参数并设置为https://fruits.com/check?fruit_name=bananas
应用剪辑的Associated Domain
列出appclips:fruits.com
应用剪辑的SceneDelegate
如下
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
过去 2 天我一直在用头撞墙。我错过了什么?
注意:我正在使用这个sample app available in github,只是修改了签名配置以使应用剪辑能够编译和运行。
【问题讨论】:
【参考方案1】:提到的continue
方法仅在您的应用之前打开后被调用时调用。为了在您的应用第一次启动时获取_XCApplClipURL
中设置的值,您需要使用您提到的第二种方法(scene willConnectTo session
)。
你可以试试这样的:
if let activity = connectionOptions.userActivities.filter( $0.activityType == NSUserActivityTypeBrowsingWeb ).first
if let url = activity.webpageURL
print("incoming URL: \(url)")
【讨论】:
【参考方案2】:感谢您使用 AppsFlyer 的 App Clip 公开演示并强调此问题。我真的很感激。
我可以确认你做得很好,这个功能在 Beta 5 之后的某个时候被破坏了。
请关注并评论这个问题here
【讨论】:
Hugo,该问题已在演示应用程序中修复。请测试。谢谢以上是关于从 Xcode 启动 App Clip 时未调用 SceneDelegate 的“继续”的主要内容,如果未能解决你的问题,请参考以下文章
从深层链接启动应用程序时未调用 AppDelegate ContinueUserActivity,应归咎于 Firebase SDK
didReceiveRemoteNotification:当应用程序处于后台并且未连接到Xcode时未调用fetchCompletionHandler
Ktor App 部署到 AppEngine 时未调用 Main 方法