本文记录使用 Intents Extension 实现一个自定义弹框的 Hello World 案例。
1. 创建 Intents Extension
选中项目根目录 -> Xcode 顶部 File -> New -> Target...
搜索 Intents
选择 Intents Extension,然后 Next
勾选 Include UI Extension 因为要自定义UI,Finish 后选择 Activate
2. 创建 SiriKit Intent Definition File
选中项目根目录 -> 右键 -> New File... -> 搜索 Siri -> 选中 SiriKit Intent Definition File -> Next -> Create
3. 新建 Intent
打开刚才创建的 SiriKit Intent Definition File,文件后缀为 .intentdefinition
点左下角的 +
-> new Intent
这里命名为 HelloIntent,然后选中 HelloIntent,输入 Tittle、Description
Target Membership 需勾选上 HelloWorldIntent 和 HelloWorldIntentUI
创建好之后运行一下(快捷键 command + B)会自动生成 Intents 的依赖文件
4. 修改 Intents Extension 生成的文件
假如创建的 Intents Extension 命名为 HelloWorldIntent,在项目中会创建两个文件夹:HelloWorldIntent
和 HelloWorldIntentUI
先修改 HelloWorldIntent 下的 IntentHandler 文件:
swift
import Intents
class IntentHandler: INExtension, HelloIntentIntentHandling {
func handle(intent: HelloIntentIntent, completion: @escaping (HelloIntentIntentResponse) -> Void) {
// 创建成功响应
let response = HelloIntentIntentResponse(code: .success, userActivity: nil)
completion(response)
}
}
修改 HelloWorldIntentUI 下的 IntentViewController 文件:
swift
import IntentsUI
class IntentViewController: UIViewController, INUIHostedViewControlling {
// 需在 MainInterface 中创建并关联
@IBOutlet var valueLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
print("======viewDidLoad被调用====")
view.backgroundColor = .red // 直接改成红色背景
// 确保valueLabel已正确初始化
if valueLabel != nil {
valueLabel.text = "初始化成功"
print("valueLabel已初始化")
} else {
print("valueLabel未初始化")
}
}
// 必须实现这个方法,不然自定义 UI 可能不加载
func configureView(for parameters: Set<INParameter>, of interaction: INInteraction, interactiveBehavior: INUIInteractiveBehavior, context: INUIHostedViewContext, completion: @escaping (Bool, Set<INParameter>, CGSize) -> Void) {
self.valueLabel.text = "hello world"
completion(true, Set(), self.desiredSize)
}
var desiredSize: CGSize {
let width = self.extensionContext?.hostedViewMaximumAllowedSize.width ?? 320
return CGSize.init(width: width, height: 150)
}
}
在 MainInterface 中创建视图并关联字段,选中 Intent View Controller
点击右上角的 +
选择需要的组件,拖拽到视图中
关联组件:右上角切换到 Show the connections inspector -> 按住 Referencing Outlets 下的小圆点不松开 -> 拉到新建的 Label 组件上
关联后的效果
5. 修改 Info.plist
分别修改 HelloWorldIntent 和 HelloWorldIntentUI 的 Info.plist,与 Intent 关联上
6. 运行
选中主目录,然后直接运行
打开快捷指令app -> 新建快捷指令 -> 搜索项目名称
运行效果