我有一个应用程序,可以在物理设备和 iOS 模拟器中使用英特尔处理器的旧 Mac 上编译和运行良好。
同样的应用程序也可以在配备 M1 处理器的较新 Apple Silicon Mac 上编译并正常运行physicaliPhone 设备,but它拒绝为 iOS 模拟器进行编译。
如果没有模拟器支持,调试周转时间会变得非常长,所以我正在尝试解决这个问题。更不用说 Xcode 预览功能也不起作用,这很烦人。
我在没有进行任何更改(但从 Intel Mac 移至 M1 Mac)的情况下遇到的第一个错误如下所示。
为 iOS 模拟器构建,但链接到为 iOS 构建的 dylib,文件 '/Users/andy/workspace/app/Pods/GoogleWebRTC/Frameworks/frameworks/WebRTC.framework/WebRTC' 用于架构 arm64
我使用的 Cocoapods 库是 GoogleWebRTC,根据its doc https://cocoapods.org/pods/GoogleWebRTC,应该支持arm64,所以我很困惑为什么会抛出上述错误。正如我之前所说,它在真实设备中编译得很好,我相信它是在 arm64 上运行的。
根据医生的说法..
该 Pod 包含二进制形式的 WebRTC iOS SDK。这是一个动态的
包含armv7、arm64和x86_64切片的库。位码是
不支持。我们当前提供的 API 仅适用于 Objective C。
我在网上搜索了一下它出现 https://stackoverflow.com/questions/63607158/xcode-12-building-for-ios-simulator-but-linking-in-object-file-built-for-ios此问题似乎有 2 个解决方法。
- 第一个是添加
arm64
to Excluded Architectures
- 第二个选项是标记
Build Active Architecture Only
for Release
build.
即使我在运行于arm64架构下的M1 Mac上编译我的应用程序,我也不完全明白上述是否有必要,因为该解决方案似乎仅适用于不支持arm64模拟器的Intel Mac,至于Intel Mac ,模拟器可能在 x86_64 中运行,而不是在 arm64 中运行,因此解决方案 #1 不适用于我的情况。
当我只调整第二个更改时,没有任何真正的变化并且抛出相同的错误。
当我进行这两项更改并尝试构建时,我现在在构建过程中收到以下第二个错误。 (并不是真的100%确定我是否解决了第一个错误/我可能通过调整两个更改除了第一个错误之外还引入了第二个错误)
找不到目标“x86_64-apple-ios-simulator”的模块“Lottie”;找到:arm64、arm64-apple-ios-simulator
我使用的第二个库是洛蒂-ios https://github.com/airbnb/lottie-ios我正在用一个快速的包管理器来解决这个问题。我想发生的事情是因为我排除了arm64
在 iOS 模拟器的构建设置中,Xcode 正在尝试运行我的应用程序x86_64
。但是,不支持库运行x86_64
由于某种原因,并且抛出错误。我对决定库是否可以在 x86_64 或 arm64 上运行的因素没有太多了解,因此我无法深入研究这个问题。
我的弱结论是GoogleWebRTC
无法编译以在 iOS 模拟器中运行arm64
由于某种原因(不同于its doc https://cocoapods.org/pods/GoogleWebRTC说),并且lottie-ios
无法编译以在 iOS 模拟器中运行x86_64
。所以在这种情况下我不能同时使用它们。
Q1.我想知道我可以做出什么样的改变来解决这个问题......
当从 Intel Mac 编译时,该应用程序可以在设备和模拟器中完美编译和运行。当从 Apple Silicon Mac 编译时,该应用程序可以在设备中编译并运行良好。只是该应用程序拒绝在 Apple Silicon Mac 的 iOS 模拟器中编译和运行,我似乎无法弄清楚为什么。
Q2。如果没有可用的解决方案,我想首先了解为什么会发生这种情况。
我真的希望不再购买旧的英特尔 Mac 只是为了让东西在模拟器中运行。