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

Flutter iOS端Swift获取On Demand Resources音频资源失败问题

iOS On Demand Resources 资源查找失败问题解决

核心排查方向与修复方案

1. 先确认Xcode端的资源配置是否到位

  • 检查音频文件的Target Membership:必须勾选Runner target,同时在右侧检查器的On Demand Resources栏,确认german标签已准确绑定(标签区分大小写,别打错)。
  • 核对资源类型:WAV文件的Type要设为Audio,错误归类会导致ODR无法识别资源。
  • 验证Build Phases配置:进入Runner target的Build Phases -> Copy Bundle Resources,选中目标音频文件,确认右侧的Resource Tags确实关联了german。

2. 修正代码中的资源查找逻辑

你当前代码里用url(forResource: nil, withExtension: "wav")是无效的——这个方法无法匹配标签关联的资源,也不能批量获取同类型文件。调整代码如下:

private func getDownloadRessources(tag: String, result: @escaping FlutterResult) {
    let resourceRequest = NSBundleResourceRequest(tags: [tag])
    resourceRequest.beginAccessingResources { (error: Error?) in
        // 确保资源访问结束后释放
        defer { resourceRequest.endAccessingResources() }
        
        if let error = error {
            print("资源访问错误: \(error)")
            result(FlutterError(code: "RESOURCE_ERROR", message: "\(error) tag:\(tag)", details: error.localizedDescription))
            return
        }
        
        let bundle = resourceRequest.bundle
        // 优先用具体文件名查找(精准高效)
        if let audioURL = bundle.url(forResource: "你的德语音频文件名", withExtension: "wav") {
            print("找到资源: \(audioURL.absoluteString)")
            result(audioURL.absoluteString)
            return
        }
        
        // 若不知道文件名,遍历bundle中所有WAV并筛选带目标标签的资源
        do {
            let allWavFiles = try bundle.contentsOfDirectory(atPath: "")
                .filter { $0.hasSuffix(".wav") }
            
            for file in allWavFiles {
                guard let fileURL = bundle.url(forResource: file.deletingPathExtension, withExtension: file.pathExtension),
                      let tagsForFile = bundle.resourceTags(for: fileURL),
                      tagsForFile.contains(tag) else {
                    continue
                }
                print("找到标签匹配的资源: \(fileURL.absoluteString)")
                result(fileURL.absoluteString)
                return
            }
            result(FlutterError(code: "RESOURCE_NOT_FOUND", message: "未找到标签为\(tag)的WAV资源", details: nil))
        } catch {
            result(FlutterError(code: "DIRECTORY_ERROR", message: "读取bundle内容失败", details: error.localizedDescription))
        }
    }
}

3. 验证ODR资源是否正确打包

  • 归档验证:执行Product -> Archive,在Organizer中选中归档包,点击Distribute App选择Development,查看弹窗中的On Demand Resources部分,确认german标签对应的资源已被包含。
  • 检查Info.plist:确保NSBundleResourceRequestPreferNetworkAccess配置符合需求,没有阻止资源下载的设置。

4. 测试环境必注意

  • 必须用真机测试:ODR在模拟器中无法正常工作,物理设备才能触发资源下载逻辑。
  • 网络权限:确保App已配置网络访问权限,若资源存于非HTTPS服务器,需在Info.plist中配置NSAppTransportSecurity允许HTTP访问。
  • 资源大小限制:ODR单包不能超过2GB,单个资源不能超过500MB,过大的音频文件会导致加载失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:45:03