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

