如何检查我的应用程序是不是由 WatchOS 上的 Siri 快捷方式启动?

Posted

技术标签:

【中文标题】如何检查我的应用程序是不是由 WatchOS 上的 Siri 快捷方式启动?【英文标题】:How do I check if my app is launched by a Siri shortcut on WatchOS?如何检查我的应用程序是否由 WatchOS 上的 Siri 快捷方式启动? 【发布时间】:2020-04-28 15:53:34 【问题描述】:

我正在尝试在 WatchOS 上创建自定义 SiriKit 快捷方式。我为 ios 问题阅读了此 question,但我相信解决方案在 watchOS 中有所不同。

为了做到这一点,我遵循了以下步骤:

    在 WatchKit Extension 目标中,我添加了 Siri 功能; 我通过以下方式创建了一个 Intents 扩展:File> New > Target > watchOS > Intents Extension; 在意图扩展组中,我创建了一个 SiriKit 意图定义文件。在此文件中,我进行了一些自定义更改并选中了“意图符合 Siri 建议”框; 在 Intent Extension 组中,我还创建了一个名为 HandWashIntentHandler.swift 的文件,其中包含以下代码:
class HandWashIntentHandler: NSObject, HandWashIntentHandling
    func handle(intent: HandWashIntent, completion: @escaping (HandWashIntentResponse) -> Void) 
        let activity = NSUserActivity(activityType: "HandWashIntent")
        let title = "Hand Wash"
        activity.title = title
        activity.suggestedInvocationPhrase = "Start hand wash"
        activity.isEligibleForPrediction = true
        activity.persistentIdentifier = title

        let response = HandWashIntentResponse(code: .continueInApp,
                                              userActivity: activity)

        completion(response)
    

    然后,在 IntentHandler.swift 中,我添加了以下代码:
class IntentHandler: INExtension 

    override func handler(for intent: INIntent) -> Any 
        guard intent is HandWashIntent else 
             fatalError("Unhandled intent type: \(intent)")
        

        return HandWashIntentHandler()
    

    最后,在 Intent Extension Group 内的 Info.plist 中,我在 IntentsSupported 中添加了“HandWashIntent”。同样,在 WatchKit 扩展组内的 Info.plist 中,我在 NSUserActivityTypes 中添加了“HandWashIntent”。

所以,基本上,我希望通过语音快捷方式“开始洗手”。此快捷方式将打开应用程序并推送特定控制器。我在question 中读到,watchOS 中的 WKExtensionDelegate 与 iOS 中的 AppDelegate “等效”。然后,我尝试在 ExtensionDelegate 中操作 userActivity,但是没有函数可以这样做。

然后,我在 ExtensionDelegate 中使用了函数handle(_:):

func handle(_ userActivity: NSUserActivity) 
     if userActivity.activityType == "HandWashIntent"
         WKExtension.shared().rootInterfaceController?.pushController(withName: "Wash", context: nil)
     

但没有成功。那么,如何检查我的应用程序是否由 WatchOS 上的 Siri 快捷方式启动?

【问题讨论】:

【参考方案1】:

在 AppDelegate 类上检查此方法。 launchOptions 字典指示应用程序启动的原因。从LaunchOptionsKey你会得到信息。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
    // Override point for customization after application launch.
    return true

【讨论】:

谢谢,但这不行。由于我正在开发一个仅限手表的应用程序,因此没有委托人可以解决,正如问题本身所提到的那样。

以上是关于如何检查我的应用程序是不是由 WatchOS 上的 Siri 快捷方式启动?的主要内容,如果未能解决你的问题,请参考以下文章

WatchOS 上的 HealthKit 查询是不是受限?

如何在真实设备上安装独立的 watchOS 应用程序进行测试?

带有独立 WatchOS 应用程序的 Siri 表盘上的快捷方式/操作

如何在 WatchOS 的基于页面的界面中显示警报?

watchOS 上的 SwiftUI 表单:点击手势间歇性失败

watchOS 上的后台 URLSession - 周期是啥?