一、M2/M1运行模拟器报错
M2芯片的苹果电脑使用xcode在使用cocoapods安装第三方库编译模拟器的时候可能会报错
building for iOS Simulator, but linking in object file built for iOS, ld: symbol(s) not found for architecture arm64
librealmcore-ios.a for architecture arm64
导致这样的原因是由于M1芯片模拟器架构是arm64架构,而Inter芯片是x86_64的架构,而我们的静态库时,会分别打包出一份针对真机(arm64)和模拟器(x86_64),然后将这两份合并成一个包后引入项目中进行使用。在Intel机型上,真机上使用arm64指令,模拟器(x86_64)中使用x86_64指令,所以不存在问题。但是在M1芯片的机型上,模拟器是以arm64运行的,显然再以x86_64运行就会出现问题。
解决方案:
1、以Rosetta模式运行Xcode
在应用程序中,Xcode右键,显示简介,勾选使用Rosetta打开即可
2、修改Build Settings -> Excluded Architectures选项,添加Any iOS Simulator SDK选项,并设置为arm64
备注:以Rosetta模式运行是M1机器上x86软件无法运行的解决方案,它会将x86指令转译成ARM指令运行,这种转译显然是存在性能损耗的,损耗大概在20%~30%。
装了个友盟sdk,只支持真机,然后清除,好家伙既然报错:Undefined symbols...
可以通过如下配置来解决:在 Podfile 中添加如下设置:
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
end
end
通过上述内容,我们知道了问题的由来,它是由于项目中存在.a或.framework,它们提供的指令集不完整导致的。Apple对于这类问题,也提供了解决方案,以Xcode13为例,在我们创建静态库时,选择真机编译出来的包只包含arm64指令,选择模拟器编译出来的会同时包含arm64和x86_64指令。我看一些网上的教程,教别人将模拟器部分的arm64移除,其实大可不必。因为要支持M1机器正常跑模拟器,模拟器必须同时包含arm64和x86_64指令。2019年的WWDC,apple提供了一种新的框架封装格式XCFramework。简单理解就是以前使用lipo合并不同指令集的包,现在则使用新的指令合并成XCFramework格式。打包成framework。XCFramework就是把两个不同指令集的framework放入了同一个文件夹(.xcframework),并生成了一个配置文件Info.plist。这样生成的XCFramework就可以完美的解决M1机器无法编译模拟器的问题。
二、M2/M1打包脚本报错
"Provisioning profile "iOS Team Provisioning Profile" doesn't include the currently selected device "xxx's MacBook Pro"
"Provisioning profile "iOS Team Provisioning Profile" doesn't include the currently selected device "Mac Mini"
M2上的Xcode打包时,脚本打包默认会选中当前Mac作为打包设备
修改 jenkins 脚本 或者 本地打包脚本,在对应的 xcodebuild 命令后添加对应参数
-destination 'generic/platform=iOS'
xcodebuild archive -workspace $project_name.xcworkspace -scheme $scheme_name -configuration $build_configuration -archivePath $export_archive_path -destination 'generic/platform=iOS'
链接:https://www.jianshu.com/p/6127509147de
链接:https://www.jianshu.com/p/98d807ee27d8