You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS iMessage扩展能否通过insertAttachment调用添加多个附件?

实现iMessage扩展一次性添加多个附件

当然可行!我之前开发iMessage扩展时刚好处理过类似需求,其实只要在你现有代码的基础上调整逻辑,就能轻松实现一次性添加2-3个附件。

核心思路

iMessage的MSConversation类本身就支持多次调用insertAttachment(_:completionHandler:)来添加多个附件,或者你也可以直接构造包含多个MSMessageAttachment的数组,通过创建MSMessage并设置其attachments属性来实现。不过结合你现有的单附件代码,用循环逐个添加的方式更贴合你的现有逻辑。

修改后的代码示例

首先,把你的回调方法参数从单个URL改成URL数组,然后遍历每个URL处理:

func didClickItems(_ controller: ItemViewController, itemUrls: [URL]) {
    // 确保当前有活跃的会话
    guard let conversation = activeConversation else {
        print("没有活跃的iMessage会话")
        return
    }
    
    // 使用DispatchGroup管理多个异步添加任务,方便统一处理完成状态
    let attachmentGroup = DispatchGroup()
    
    for url in itemUrls {
        attachmentGroup.enter()
        
        do {
            // 根据本地文件URL创建附件对象
            let attachment = try MSMessageAttachment(url: url)
            
            // 可选:设置附件的UTI类型,确保iMessage正确识别媒体类型
            // 比如图片用"public.jpeg",视频用"public.mpeg-4"
            if url.pathExtension.lowercased() == "jpg" || url.pathExtension.lowercased() == "jpeg" {
                attachment.type = "public.jpeg"
            } else if url.pathExtension.lowercased() == "png" {
                attachment.type = "public.png"
            }
            
            // 插入附件到会话中
            conversation.insertAttachment(attachment, completionHandler: { error in
                if let error = error {
                    print("添加附件失败:\(error.localizedDescription)")
                }
                attachmentGroup.leave()
            })
        } catch {
            print("创建附件对象失败:\(error.localizedDescription)")
            attachmentGroup.leave()
        }
    }
    
    // 所有附件添加完成后的回调
    attachmentGroup.notify(queue: .main) {
        print("所有附件已成功添加到消息输入框")
        // 这里可以添加用户提示,比如弹出Toast或者更新UI状态
    }
}

注意事项

  • 必须使用本地文件URL:iMessage附件要求是本地沙盒内的文件,如果你的媒体是远程资源,需要先下载到应用的Documents或Caches目录,再用本地URL创建附件。
  • 正确设置UTI类型:虽然系统会自动识别,但手动指定attachment.type可以避免识别错误,确保附件在iMessage中正常显示。
  • 会话有效性检查:一定要先判断activeConversation是否存在,否则会导致崩溃或无响应。

这样调整后,用户点击发送前就能一次性看到所有添加的附件,完全符合你的需求。

内容的提问来源于stack exchange,提问作者DrIndie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:45:04