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

iOS中无法从项目根目录读取文件的问题求助

问题原因与解决方案

问题根源

你这段代码在模拟器能正常运行,真机上却报错,核心原因有两个:

  1. #file的路径逻辑不适用真机:模拟器里#file指向的是你本地电脑上的源码文件路径,所以能找到放在源码目录里的TestFolder;但真机上App运行在沙盒环境中,源码目录的文件不会被打包到沙盒里,自然找不到目标文件。
  2. iOS沙盒机制限制:真机上App无法直接访问你电脑里的源码根目录,所有需要运行时读取的文件必须作为资源打包到App Bundle中。

解决步骤

1. 将文件添加到Xcode打包资源中

  • 找到本地的TestFolder/AppConfigKeyFile,直接拖放到Xcode项目里;
  • 在弹出的对话框中,勾选你的App Target,确保文件会被打包到App中;
  • 检查Target -> Build Phases -> Copy Bundle Resources,确认AppConfigKeyFile在列表里(如果拖放的是整个文件夹,要确保文件夹被正确添加)。

2. 修正文件读取代码

替换原来的路径获取逻辑,从App Bundle里读取文件:

// 从Bundle中获取文件URL
guard let appConfigKeysFileUrl = Bundle.main.url(forResource: "AppConfigKeyFile", withExtension: nil) else {
    print("找不到AppConfigKeyFile文件")
    return
}

print(appConfigKeysFileUrl)

do {
    let appconfigKeysData = try Data(contentsOf: appConfigKeysFileUrl)
    cancellable = MyJsonDecoder.decode(from: appconfigKeysData).sink { error in
        switch error {
        case .finished:
            break
        case .failure(let failure):
            print(failure.localizedDescription)
        }
    } receiveValue: { (appConfigKeys: AppConfigKeys) in
        print(appConfigKeys.myKey)
    }
} catch {
    print(error.localizedDescription)
}

补充说明

如果AppConfigKeyFile是放在TestFolder目录下(打包后Bundle里也保留这个目录结构),可以用subdirectory参数指定路径:

guard let appConfigKeysFileUrl = Bundle.main.url(forResource: "AppConfigKeyFile", withExtension: nil, subdirectory: "TestFolder") else {
    print("找不到AppConfigKeyFile文件")
    return
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:31:39