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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:22:40