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
相关产品推荐
相关产品推荐

