iOS中无法从项目根目录读取文件的问题求助
问题原因与解决方案
问题根源
你这段代码在模拟器能正常运行,真机上却报错,核心原因有两个:
#file的路径逻辑不适用真机:模拟器里#file指向的是你本地电脑上的源码文件路径,所以能找到放在源码目录里的TestFolder;但真机上App运行在沙盒环境中,源码目录的文件不会被打包到沙盒里,自然找不到目标文件。- 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
相关产品推荐
相关产品推荐

