首页 > 解决方案 > 自定义 IntentResponse 返回图像

问题描述

我的应用程序应该向快捷方式应用程序捐赠一个快捷方式,以检索随机图像。但是我无法返回图像,并且理解应该如何完成。

我的意图文件如下。由于“图像”不是可能的返回类型,我改为返回一个文件。

在此处输入图像描述

我的代码:

class TestIntentHandler: NSObject, TestIntentIntentHandling {
        func handle(intent: TestIntentIntent, completion: @escaping (TestIntentIntentResponse) -> Void) {
            let response = TestIntentIntentResponse(code: .success, userActivity: nil)
            let data = UIImage(named: "test")!.pngData()!
            response.image = INFile(data: data, filename: "tester", typeIdentifier: "png")
            completion(response)
        }
        
      func confirm(intent: TestIntentIntent, completion: @escaping (TestIntentIntentResponse) -> Void) {
        completion(TestIntentIntentResponse(code: .ready, userActivity: nil))
      }
}

但测试快捷方式不显示图像。

在此处输入图像描述

标签: iosswiftxcodesirikitsirishortcuts

解决方案


尝试运行相同类型的代码,发现如果您在创建对象时给它正确typeIdentifier(UTI) ,Shortcut 会将文件识别为图像。INFile例如,要显示 PNG 文件,您可以使用"public.png"

这是一个将操作结果显示为图像的快捷方式示例 显示为操作结果的图像

现在您的问题可能是“我从哪里获得这些标识符?” . 好吧,这取决于您的目标 iOS 版本。您可以使用 UTTypeCreatePreferredIdentifierForTag(iOS <14) 或 UTType (iOS 14+),如果包含 URL,则直接从 URL 中提取它,或者您可以在此处阅读 Apple 参考列表

我将在这里留下 UTTypeCreatePreferredIdentifierForTag 示例,由这个答案提供

let fileExtension = "png" // This could be extracted from an URL
let uti = UTTypeCreatePreferredIdentifierForTag(
    kUTTagClassFilenameExtension,
    fileExtension,
    nil)

...和 ​​URL 示例,由其他答案提供

extension URL {
    var typeIdentifier: String? { (try? resourceValues(forKeys: [.typeIdentifierKey]))?.typeIdentifier }
    var localizedName: String? { (try? resourceValues(forKeys: [.localizedNameKey]))?.localizedName }
}

推荐阅读