iOS Intents Extension Hello World Demo

本文记录使用 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,在项目中会创建两个文件夹:HelloWorldIntentHelloWorldIntentUI

先修改 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 -> 新建快捷指令 -> 搜索项目名称

运行效果

相关推荐
键盘敲没电2 小时前
【IOS】GCD学习
学习·ios·objective-c·xcode
SY.ZHOU2 小时前
Significant Location Change
macos·ios·cocoa
吴Wu涛涛涛涛涛Tao10 小时前
深入理解 Swift Codable:从基础到进阶
ios
Jouzzy16 小时前
【iOS安全】iPhone X iOS 16.7.11 (20H360) WinRa1n 越狱教程
安全·ios·iphone
二流小码农1 天前
鸿蒙开发:实现一个标题栏吸顶
android·ios·harmonyos
season_zhu1 天前
iOS开发:关于日志框架
ios·架构·swift
Digitally1 天前
如何在电脑上轻松访问 iPhone 文件
ios·电脑·iphone
安和昂1 天前
【iOS】YYModel源码解析
ios
pop_xiaoli1 天前
UI学习—cell的复用和自定义cell
学习·ui·ios
Daniel_Coder1 天前
Xcode 16.4 + iOS 18 系统运行时崩溃:___cxa_current_primary_exception 符号丢失的原因与解决方案
ios·xcode·ios 18·dyld·libc++abi