iOS应用开启On-Demand Resource后App Store上传失败:路径不被允许
解决ODR上传App Store时「路径不被允许」的问题
看起来你遇到的问题很典型——本地ODR测试正常,但上传审核时触发路径错误,结合你怀疑的子文件夹问题,我整理了几个针对性的排查和解决步骤:
1. 修正SCNAssets的ODR标记方式
SCNAssets是Xcode特殊处理的资源bundle,直接给包含子文件夹的SCNAssets父文件夹打ODR标签,很可能导致App Store审核时识别到非法嵌套路径。正确的做法是:
- 展开你的SCNAssets文件夹,逐个选中内部的具体资源文件(.scn、粒子系统文件、图片等),在右侧属性面板的「On Demand Resources Tags」中添加对应标签;
- 取消SCNAssets父文件夹的ODR标签,避免整个bundle被标记为ODR资源(本地测试可能兼容,但App Store的审核机制对bundle嵌套路径更严格)。
2. 验证Build Settings的关键配置
除了确认「Enable On Demand Resources」为YES,还要检查以下设置:
- 确保「Resource Rules Path」为空(Xcode 10+已经废弃这个设置,但旧版本残留的配置可能导致问题);
- 检查「Strip Debug Symbols During Copy」设置为
YES(Debug版本可以是NO,但Release版本必须开启,否则可能影响ODR资源的打包结构); - 确认「Embed On Demand Resources」为
YES(这个选项在Target的「Build Phases」→「Copy Bundle Resources」上方的设置里)。
3. 重新组织资源结构(可选但有效)
如果子文件夹的嵌套是必须的,尝试把每个子文件夹打包成独立的SCNAssets bundle:
- 新建多个SCNAssets文件夹,将不同模块的资源分别放入;
- 给每个独立的SCNAssets文件夹单独打ODR标签,这样可以避免单个bundle内的嵌套路径问题,同时更清晰地管理不同模块的资源。
4. 彻底清理后重新打包
常规的清理可能不够彻底,建议按以下步骤操作:
- 关闭Xcode,删除Derived Data(可以通过
Xcode → Preferences → Locations → Derived Data找到路径后删除); - 清空项目的Build文件夹(
Product → Clean Build Folder); - 重新生成Archive,再尝试上传到App Store。
代码层面的小优化
你的ODR Manager代码逻辑是正确的,可以加一个小优化避免重复请求已下载的资源:
func requestSceneWith(tag: String, onSuccess: @escaping () -> Void, onFailure: @escaping (NSError) -> Void) { // 先检查资源是否已可用 let request = NSBundleResourceRequest(tags: [tag]) if request.progress.fractionCompleted == 1.0 { onSuccess() return } currentRequest = request request.beginAccessingResources { error in if let error = error { onFailure(error as NSError) return } onSuccess() } }
这些步骤应该能解决你遇到的路径问题,核心是避免在SCNAssets这种特殊bundle内用嵌套文件夹的ODR标记方式,让每个资源或独立bundle的标签更清晰。
内容的提问来源于stack exchange,提问作者Manganese
相关产品推荐
相关产品推荐

