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

运行效果

相关推荐
90后的晨仔16 分钟前
Xcode 26.6编译 AFNetworking 报错全解:5 种方案从应急到根治
ios
初级代码游戏14 小时前
iOS开发 Swift 速记1:变量和基本数据类型
开发语言·ios·swift
for_ever_love__15 小时前
iOS:网络请求再学习
网络·学习·ios·objective-c
2501_9159214320 小时前
SwiftUI开发框架入门指南:从基础到实战
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_916007471 天前
Python实现HTTPS爬虫的完整指南:使用requests、BeautifulSoup、Selenium和Scrapy
爬虫·python·ios·小程序·https·uni-app·iphone
LDyun_1 天前
云手机低延迟怎么实现的?为什么云手机能够 7×24 小时在线?
ios·智能手机·安卓·玩游戏
for_ever_love__1 天前
iOS: 网络请求第三方库的使用: AFNetworking
网络·学习·ios·objective-c·cocoa·xcode
李白你好1 天前
强大的 Frida 重打包工具,用于 iOS 和 Android。轻松修改 Frida 特征
android·ios
zhao1zhihui2 天前
iOS Bug 定位实战:从断点、LLDB 到 Xcode 与 Instruments
ios·xcode
zhao1zhihui2 天前
Objective-C Runtime:从消息派发到安全 Hook
ios