SiriKit发送语音消息异常:无法获取音频及权限问题求助
SiriKit语音消息发送权限与音频数据为空问题解决
问题现象
- 调用Siri指令
Send audio message with AppName后,Siri完成录音并触发INSendMessageIntent处理方法,但获取到的音频Data长度为0 - 直接通过
fileURL访问Siri生成的音频文件时,提示权限不足:file:///var/tmp/SiriMessages/E262A828-A24E-452E-BF70-867F5653BEFE.caf: Unable to open «E262A828-A24E-452E-BF70-867F5653BEFE.caf», you have no permissions.
解决方案
- 获取安全作用域资源权限:Siri生成的音频文件属于系统安全作用域资源,必须调用
fileURL.startAccessingSecurityScopedResource()临时获取访问权限,操作完成后调用stopAccessingSecurityScopedResource()释放权限 - 异步读取文件数据:
audio.data属性可能因文件未完全准备好返回空值,需通过fileURL主动读取文件内容
修改后的代码
func handle(intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) { let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent.self)) let MIMEType = "audio/x-caf" let failureResponse = INSendMessageIntentResponse(code: .failure, userActivity: userActivity) guard let audioAttachment = intent.attachments?.first, let audioFile = audioAttachment.audioMessageFile, let filePath = audioFile.fileURL else { print("no voice message attached") completion(failureResponse) return } Task { var finalResponse = INSendMessageIntentResponse(code: .success, userActivity: userActivity) // 获取安全作用域资源访问权限 guard filePath.startAccessingSecurityScopedResource() else { print("Failed to access security scoped resource") finalResponse = INSendMessageIntentResponse(code: .failure, userActivity: userActivity) completion(finalResponse) return } defer { // 操作完成后释放权限 filePath.stopAccessingSecurityScopedResource() } // 异步读取音频文件数据 do { let audioData = try Data(contentsOf: filePath) print("Size of file: \(audioData.count)") let networkService = NetworkService() await networkService.uploadAudioMessage(filePath: filePath, withMIMEType: MIMEType) print("Result success") } catch { print("Failed to read audio file: \(error.localizedDescription)") finalResponse = INSendMessageIntentResponse(code: .failure, userActivity: userActivity) } completion(finalResponse) } }
内容的提问来源于stack exchange,提问作者Ilya Krigouzov
相关产品推荐
相关产品推荐

