2

我目前正在开发一个 App Clip,但func scene(_ scene: UIScene, continue userActivity: NSUserActivity)在我的主应用目标中触发 sceneDelegate 方法时遇到问题。我能够通过_XCAppClipURL在我的应用剪辑目标中设置环境变量来测试应用剪辑。我尝试在物理设备上安装主要和应用剪辑目标,使用我的应用剪辑BUNDLE ID&设置本地体验URL PREFIX,但仅启动应用剪辑。如果它启动我的主应用程序,我如何测试应用程序剪辑的用户体验?

4

2 回答 2

2

尝试检查func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)而不是continue userActivity您提到的。

我也必须在 Clip 里面这样做SceneDelegate

NSUserActivity如果需要根据 Clip 修改体验,可以这样提取:

if let activity = connectionOptions.userActivities.filter({ $0.activityType == NSUserActivityTypeBrowsingWeb }).first {
  // do something with your activity... for example
  guard
    activity.activityType == NSUserActivityTypeBrowsingWeb,
    let incomingUrl = activity.webpageURL,
    let components = NSURLComponents(url: incomingUrl, resolvingAgainstBaseURL: true)
  else { return }
}
于 2020-12-08T01:44:48.060 回答
1

这是 App Clip苹果中的一个限制,由于某种原因在他们的文档中没有描述或强调。

让我们考虑一下这种情况:

  1. 用户扫描二维码,安装并运行 App Clip。
  2. 用户根据 App Clip Card 参考或 App Clip 参考决定安装完整的应用程序。
  3. 完整的应用程序打开

我们希望调用 URL 将被传递到完整的应用程序中,但它不会发生。可怜的用户被迫扫描二维码,然后使用通用链接流程打开完整的应用程序。

在这两种情况下都使用 App Clip 打开

  1. 当设备上尚未安装 App Clip 时,使用:
   func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        // Get URL components from the incoming user activity
        guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
              let incomingURL = userActivity.webpageURL,
              let components = NSURLComponents(url: incomingURL,
              resolvingAgainstBaseURL: true)
        else {
            return
        }
              
        // log url
        print("AppClip invocation url is : \(incomingURL)") 
    }
  1. App Clip 已安装在设备上。用户不会看到差异,但场景生命周期存在差异:
   func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let _ = (scene as? UIWindowScene) else { return }
        
        // Get URL components from the incoming user activity.
        guard let userActivity = connectionOptions.userActivities.first,
            userActivity.activityType == NSUserActivityTypeBrowsingWeb,
            let incomingURL = userActivity.webpageURL,
            let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true)
        else {
            return
        }
                
        // log url
        print("AppClip invocation url is : \(incomingURL)")
    }

我们解决了 AppsFlyer 用户的问题,允许他们使用我们的OneLink流程进行延迟深度链接

于 2020-12-27T09:53:50.220 回答