环境
- MacBook Pro(13英寸,2017年,两个Thunderbolt 3端口)
- Big Sur 11.3.1
- Xcode 12.5
- Apple Swift版本5.4(swiftlang-1205.0.26.9 clang-1205.0.19.55)
- 目标:x86_64-apple-darwin20.4.0
问题
在Xcode 12.4之前,我们使用此解决方法为项目获取框架,这些框架以bundle的形式存在(黄色文件夹图标)。此外,我需要为每个目标手动创建一个Carthage Copy File
脚本(位于Build Phase下),这很烦人且容易出错。
几天前,我阅读了Carthage官方文档,它建议使用xcframework
。从步骤来看,似乎不再需要烦人的copy file
步骤,于是我决定尝试一下。
我完全按照迁移步骤进行操作。我还更改了框架搜索路径,使其从$(PROJECT_DIR)/YOUR_PROJECT/Carthage/Build/iOS
指向$(PROJECT_DIR)/YOUR_PROJECT/Carthage/Build
。应用程序可以在模拟器上运行,但为时过早,当我尝试在iPhone上运行它时,它会崩溃。在调试器控制台中,它报告以下错误:
dyld: Library not loaded: @rpath/Auth0.framework/Auth0
Referenced from: /private/var/containers/Bundle/Application/9575D8AA-BD35-447B-ACC3-F8545CDB62EE/FIT dev.app/FIT dev
Reason: image not found
dyld: launch, loading dependent libraries
DYLD_LIBRARY_PATH=/usr/lib/system/introspection
DYLD_INSERT_LIBRARIES=/Developer/usr/lib/libBacktraceRecording.dylib:/Developer/usr/lib/libMainThreadChecker.dylib:/Developer/Library/PrivateFrameworks/DTDDISupport.framework/libViewDebuggerSupport.dylib
解决方案
最终我找到了这篇两年前的Medium博客文章,在其中建议将拖放到项目中的frameworks设置为嵌入并签名
。我通过更改一些frameworks的嵌入
状态,从不嵌入
更改为嵌入并签名
(从选项卡General/Frameworks, Libraries and Embedded Content
)做了同样的事情。
太好了!该项目可以在模拟器和真实设备上运行,UI测试也与之前一样运行。
Carthage官方文档中的迁移步骤并没有提到这一步。此外,我找不到任何解决类似问题的帖子。因此,我想分享我的迁移步骤,希望对其他人有所帮助。
- 按照迁移步骤进行操作(如果您有多个目标,请将所有xcframeworks放在文件导航器中的
/Frameworks
组下,这样您就可以同时将xcframeworks链接到所有目标)
为您新添加的xcframeworks设置
嵌入
状态,请参见下面的快照,我将frameworks分成了三组- 绿色,第三方库,例如auth0,alamofire ->
嵌入并签名
- 橙色 -> 开发库 ->
嵌入并签名
- 其余部分,在我的情况下是Firebase的xcframeworks ->
不嵌入
- 绿色,第三方库,例如auth0,alamofire ->