如何在Xcode主应用与Widget目标间共享.geojson文件且不增大包体积?
在Xcode中让主应用与Widget共享项目内的.geojson文件(无重复打包)
要实现主应用和Widget共享项目内的.geojson文件且不增大包体积,核心是把共享文件放到独立的资源Bundle中,让两个目标共同引用这个Bundle,避免文件重复打包。具体步骤如下:
1. 创建共享资源Bundle目标
- 打开Xcode,点击菜单栏
File > New > Target - 在模板列表中选择
iOS > Framework & Library > Bundle,点击「Next」 - 给Bundle命名(比如
SharedResources),确保平台选择与主应用/Widget一致(如iOS),完成创建 - 将你的.geojson文件拖入这个新Bundle的目录下,仅勾选该Bundle的「Target Membership」(不要勾选主应用和Widget的)
2. 让主应用和Widget依赖并引用这个Bundle
- 选中主应用目标,切换到「Build Phases」标签页:
- 在「Dependencies」栏点击「+」,添加刚才创建的
SharedResourcesBundle目标 - 在「Copy Bundle Resources」栏点击「+」,添加
SharedResources.bundle
- 在「Dependencies」栏点击「+」,添加刚才创建的
- 对Widget目标执行完全相同的操作,确保它也依赖并复制这个Bundle
3. 在代码中读取共享的.geojson文件
不管是主应用还是Widget,都需要先获取共享Bundle的实例,再读取其中的文件。示例Swift代码如下:
// 获取共享资源Bundle guard let sharedBundleURL = Bundle.main.url(forResource: "SharedResources", withExtension: "bundle"), let sharedBundle = Bundle(url: sharedBundleURL) else { fatalError("SharedResources bundle 加载失败") } // 读取目标geojson文件 guard let geojsonFileURL = sharedBundle.url(forResource: "你的文件名", withExtension: "geojson") else { fatalError("未找到目标.geojson文件") } do { let geojsonData = try Data(contentsOf: geojsonFileURL) // 此处处理geojson数据 } catch { print("读取geojson文件出错:\(error.localizedDescription)") }
为什么这种方式可行?
直接给两个目标勾选「Target Membership」会导致Xcode将.geojson文件分别打包到主应用和Widget的资源目录中,造成重复文件、增大包体积。而使用共享Bundle的方式,.geojson文件仅在Bundle中存储一份,主应用和Widget都通过引用这个Bundle来访问文件,从根本上避免了重复打包。
内容的提问来源于stack exchange,提问作者Fez Vrasta
相关产品推荐
相关产品推荐

