I have an app which compiles and runs fine in older Macs with Intel processors in physical devices & iOS simulators.
The same app also compiles and runs fine from newer Apple Silicon Mac with M1 processor with physical iPhone devices, but it refuses to be compiled for iOS simulator.
Without simulator support, debugging turn around time gets gets really long so I am trying to solve this issue. Not to mention Xcode preview feature isn't working either which is annoying.
The first error that I encountered without making any changes (but moved from Intel Mac to M1 Mac) is like below.
building for iOS Simulator, but linking in dylib built for iOS, file '/Users/andy/workspace/app/Pods/GoogleWebRTC/Frameworks/frameworks/WebRTC.framework/WebRTC' for architecture arm64
The Cocoapods library that I am using is GoogleWebRTC, and according to its doc, arm64 should be supported so I am baffled why above error is getting thrown. As I have said before, it compiles fine in real device which I believe is running on arm64.
According to the doc..
This pod contains the WebRTC iOS SDK in binary form. It is a dynamic library that contains the armv7, arm64 and x86_64 slices. Bitcode is not supported. Our currently provided API’s are Objective C only.
I searched online and it appears there appears to be 2 workarounds for this issue.
arm64
to Excluded Architectures
Build Active Architecture Only
for Release
build.I don't exactly understand if above are necessary even when I am compiling my app on M1 Mac which is running under arm64 architecture, because the solution seems to be applicable only for for Intel Mac which does not support arm64 simulator, as for Intel Mac, simulators might have been running in x86_64, not with arm64, so solution #1 is not applicable in my case.
When I adapt the second change only, nothing really changes and the same error is thrown.
When I make both changes and tried building, I now get the following 2nd error during build. (not really 100% sure if I solved the 1st error / I might have introduced 2nd error in addition to 1st by adapting two changes)
Could not find module 'Lottie' for target 'x86_64-apple-ios-simulator'; found: arm64, arm64-apple-ios-simulator
The second library that I am using is lottie-ios and I am pulling this in with a swift package manager. I guess what is happening is that because I excluded arm64
in build setting for iOS simulator, Xcode is attempting to run my app in x86_64
. However, library is not supported running in x86_64
for some reason, and is throwing an error. I don't have much insights into what dictates whether or not library can run in x86_64 or arm64 so I couldn't dig to investigate this issue.
My weak conclusion is that GoogleWebRTC
cannot be compiled to run in iOS simulator with arm64
for some reason (unlike what its doc says), and lottie-ios
cannot be compiled to run in iOS simulator with x86_64
. So I cannot use them both in this case.
Q1. I want to know what kind of changes I can make to resolve this issue...
The app compiles and runs perfectly in both device & simulator when compiled from Intel Mac. The app compiles and runs fine in device when compiled from Apple Silicon Mac. It is just that app refuse to be compiled and run in iOS simulator from Apple Silicon Mac, and I cannot seem to figure out why.
Q2. If there is no solution available, I want to understand why this is happening in the first place.
I really wish not to buy old Intel Mac again just to make things work in simulator.
Answering my own question in a hope to help others who are having similar problems. (and until a good answer is added from another user)
I found out that GoogleWebRTC actually requires its source to be compiled with x64
based on its source depo.
For builds targeting iOS devices, this should be set to either "arm" or "arm64", depending on the architecture of the device. For builds to run in the simulator, this should be set to "x64".
https://webrtc.github.io/webrtc-org/native-code/ios/
This must be why I was getting the following error.
building for iOS Simulator, but linking in dylib built for iOS, file '/Users/andy/workspace/app/Pods/GoogleWebRTC/Frameworks/frameworks/WebRTC.framework/WebRTC' for architecture arm64
Please correct me if I am wrong, but by default, it seems that Xcode running in Apple M1 silicon seems to launch iOS simulator with arm
arch type. Since my app did run fine on simulators in Intel Mac, I did the following as a workaround for now.
Get Info
Open using Rosetta
.That was all I needed to do to make my app, which relies on a library that is not yet fully supported on arm simulator, work again. (I believe launching Xcode in Rosetta mode runs simulator in x86 as well..?? which explains why things are working after making the above change)
A lot of online sources (often posted before M1 Mac launch on Nov/2020) talks about "add arm64 to Excluded Architectures
", but that solution seems to be only applicable to Intel Mac, and not M1 Mac, as I did not need to make that change to make things work again.
Of course, running Xcode in Rosetta mode is not a permanent solution, and Xcode slows down lil bit, but it is an interim solution that gets things going in case one of libraries that you are using is not runnable in arm64 simulator.. yet.