gpt4 book ai didi

ios - 如何打开 SwiftUI 应用程序并使用 Siri Intent Extension 中的 NSUseractivity 执行功能?

转载 作者:行者123 更新时间:2023-12-01 22:38:39 24 4
gpt4 key购买 nike

我的问题

我的应用程序有自己的使用意图扩展创建的快捷方式操作。他们完美地执行后台操作。

对于某些操作,我尝试使意图扩展在快捷方式中运行时打开主(容器)应用程序并执行功能。

我在使用 NSUserActivity 时遇到了问题,我不确定它是一个 SwiftUI 项目还是我实现它的方式(或两者兼而有之)。

我尝试过的

我已在 info.plist 中将我的 NSUserActivity 名称注册为 NSUserActivityType(“com.me.project.activityName”)。

我已将以下代码添加到我的 AppDelegate 中。

我在意图扩展中初始化了一个新的 NSUserActivity,其类型与 info.plist 中声明的类型相同。

我还尝试在应用程序内声明事件(我认为我不需要这样做?)

我正在运行:iOS(iPhone XS、测试版 6)macOS 10.15 Catalina(测试版 5)Xcode 11.0(测试版 5)

到目前为止我的代码

我的 AppDelegate 中有这个:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

if userActivity.activityType == "com.me.project.activityName" {
if let url = URL(string: "https://www.google.com") {
UIApplication.shared.open(url)
}
return true
}
return false
}

这在我的意图扩展中:

let openApp = intent.launchApp?.boolValue ?? false
if openApp {

let UA = NSUserActivity(activityType: "com.me.project.activityName")
UA.title = "Dummy title"

completion(UserActivityTestIntentResponse(code: .continueInApp, userActivity: UA))

} else {
completion(UserActivityTestIntentResponse.success(result: "You chose not to open the app with a user activity."))
}

在info.plist中

<key>NSUserActivityTypes</key>
<array>
<string>com.me.project.activityName</string>
</array>

我在项目的一个 swift 文件中声明了这个(尽管我认为我不需要它):

let openURLActivityType = "com.me.project.activityName"

let viewPageActivity: NSUserActivity = {
let userActivity = NSUserActivity(activityType: openURLActivityType)
userActivity.title = "Dummy Title"
userActivity.suggestedInvocationPhrase = "Dummy phrase"
userActivity.isEligibleForSearch = false
userActivity.isEligibleForPrediction = false
return userActivity
}()

意外的结果

我希望当该操作在“快捷方式”中运行时,我的应用程序会打开并显示网站“https://www.google.com”。

目前,在快捷方式中运行操作后,我的应用程序会启动到主屏幕,并且没有任何其他 react 。我的 appDelegate 中似乎没有命中断点。

我无法弄清楚是否是因为我错误地使用了 NSUserActivity,是否因为它是 SwiftUI,或者它是否只是在意图内部无法工作。

提前非常感谢您的帮助!

最佳答案

就像您已经评论过的那样,您可以使用 func scene(_ scene: UIScene, continue userActivity: NSUserActivity)继续NSUserActivity当应用程序仍在后台时。

但是,当应用程序关闭时,您可以实现 let userActvity = connectionOptions.userActivities.first里面scene(_:willConnectTo:options:) SceneDelegate 内的方法访问用户想要继续的事件。

只需将这段代码添加到该方法的标准实现中,就会如下所示:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).

// Use a UIHostingController as window root view controller
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: ContentView())
self.window = window
window.makeKeyAndVisible()

//Standard implementation until here
if let userActvity = connectionOptions.userActivities.first {
if let intent = userActivity.interaction?.intent as? YourIntent {
print(“do something”)
}
}
}
}

这适用于使用 Swift 5 Xcode 11 的 Siri 意图。

对于切换,通过 .userActivities不应按照文档所述使用,而是将调用关联的委托(delegate)方法( scene(_:continue:) ):

This property does not contain user activity objects related to Handoff. At connection time, UIKit delivers only the type of a Handoff interaction in the handoffUserActivityType property. Later, it calls additional methods of the delegate to deliver the NSUserActivity object itself.

关于ios - 如何打开 SwiftUI 应用程序并使用 Siri Intent Extension 中的 NSUseractivity 执行功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57515983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com