如何在 Swift 3 中正确初始化 INStartWorkoutIntent?
How to init INStartWorkoutIntent properly in Swift 3?
我知道它有一个内置模板。
我转到“文件”菜单并选择“新建”>“目标”
Select iOS > 左侧窗格中的应用程序扩展。
现在选择 Intents 扩展。
这将创建两个新组:YourExtension 和 YourExtensionUI。如果您打开 YourExtension 组,您会看到 IntentHandler.swift,其中包含一些用于处理锻炼的示例代码。
下面是一个更简单的示例,可以帮助您入门:
class IntentHandler: INExtension, INSendMessageIntentHandling {
override func handler(for intent: INIntent) -> AnyObject {
// This is the default implementation. If you want different objects to handle different intents,
// you can override this and return the handler you want for that particular intent.
return self
}
func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) {
print("Send message: " + (intent.content ?? "No message"))
let response = INSendMessageIntentResponse(code: .success, userActivity: nil)
completion(response)
}
}
我做到了,没问题。
现在我的问题是使用 INStartWorkoutIntent 而不是 INSendMessageIntent,我该怎么办?这个意图也有内置模板吗?
最后我自己解决了这个问题
当你想正常使用INStartWorkoutIntent时,只需将内置模板内容全部移除即可。
您还必须将 INSendMessageIntentHandling 替换为 INStartWorkoutIntent Handling。
public func handle(startWorkout intent: INStartWorkoutIntent, completion: @escaping (INStartWorkoutIntentResponse) -> Swift.Void) {
let userActivity = NSUserActivity(activityType: NSStringFromClass(INStartWorkoutIntent.self))
let response = INStartWorkoutIntentResponse(code: .continueInApp, userActivity: userActivity)
completion(response)
}
别忘了:
对于您新创建的 Intents 目标,完全展开 NSExtension 字典以研究其内容。该词典更详细地描述了您的扩展程序支持哪些意图,以及您是否希望允许用户在设备锁定时调用意图。
如果您想支持多个,请在顶部插入最相关的意图。 Siri 使用这个顺序来确定用户想要使用哪个顺序以防出现歧义。
我们现在需要定义我们想要支持的意图。
例如,我想构建一个支持支付意图的扩展。修改Info.plist文件,匹配下图
这里我们指定我们想要处理 INSendPaymentIntent 并且我们需要解锁设备。我们不希望陌生人在设备丢失或被盗时付款!
最后一件事就是将您的 Intent 设置为 运行 并完成。
我知道它有一个内置模板。
我转到“文件”菜单并选择“新建”>“目标”
Select iOS > 左侧窗格中的应用程序扩展。
现在选择 Intents 扩展。
这将创建两个新组:YourExtension 和 YourExtensionUI。如果您打开 YourExtension 组,您会看到 IntentHandler.swift,其中包含一些用于处理锻炼的示例代码。
下面是一个更简单的示例,可以帮助您入门:
class IntentHandler: INExtension, INSendMessageIntentHandling {
override func handler(for intent: INIntent) -> AnyObject {
// This is the default implementation. If you want different objects to handle different intents,
// you can override this and return the handler you want for that particular intent.
return self
}
func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) {
print("Send message: " + (intent.content ?? "No message"))
let response = INSendMessageIntentResponse(code: .success, userActivity: nil)
completion(response)
}
}
我做到了,没问题。
现在我的问题是使用 INStartWorkoutIntent 而不是 INSendMessageIntent,我该怎么办?这个意图也有内置模板吗?
最后我自己解决了这个问题
当你想正常使用INStartWorkoutIntent时,只需将内置模板内容全部移除即可。
您还必须将 INSendMessageIntentHandling 替换为 INStartWorkoutIntent Handling。
public func handle(startWorkout intent: INStartWorkoutIntent, completion: @escaping (INStartWorkoutIntentResponse) -> Swift.Void) {
let userActivity = NSUserActivity(activityType: NSStringFromClass(INStartWorkoutIntent.self))
let response = INStartWorkoutIntentResponse(code: .continueInApp, userActivity: userActivity)
completion(response)
}
别忘了:
对于您新创建的 Intents 目标,完全展开 NSExtension 字典以研究其内容。该词典更详细地描述了您的扩展程序支持哪些意图,以及您是否希望允许用户在设备锁定时调用意图。
如果您想支持多个,请在顶部插入最相关的意图。 Siri 使用这个顺序来确定用户想要使用哪个顺序以防出现歧义。
我们现在需要定义我们想要支持的意图。
例如,我想构建一个支持支付意图的扩展。修改Info.plist文件,匹配下图
这里我们指定我们想要处理 INSendPaymentIntent 并且我们需要解锁设备。我们不希望陌生人在设备丢失或被盗时付款!
最后一件事就是将您的 Intent 设置为 运行 并完成。