Hola, tenemos la respuesta a lo que buscabas, has scroll y la obtendrás más abajo.
Solución:
Me temo que este es realmente el error correcto y que el marco no debería contener código iOS y iOS Simulator al mismo tiempo. Apple intenta obligarnos a usar XCFramework
s para este propósito. Lo comenzaron en XCode 11 y simplemente endurecieron las restricciones.
La única forma correcta de resolver esto es reconstruir el marco como un XCFramework. Que es fácil de hacer:
$ xcrun xcodebuild -create-xcframework
-framework /path/to/ios.framework
-framework /path/to/sim.framework
-output combined.xcframework
Puede comenzar con una combinación .framework
haga dos copias del marco y use lipo
para eliminar los segmentos del binario que están asociados con un SDK diferente.
Basado en la respuesta original de Apple aquí.
Mi caso particular es que recibo este error al usar Rome, que produce estos marcos (una posible solución está aquí). Además, hay mucha lucha en el lado de Cartago.
Espero que ayude 😉
Debe excluir las arquitecturas de los dispositivos mientras construye para el simulador y mientras construye para el dispositivo debe excluir las arquitecturas del simulador.
Para hacer eso, navegue a Build Settings
de tu proyecto -> Excluded Architectures
-> Seleccione la configuración (Depurar/Liberar/Etc…) -> Toque + -> Any iOS Simulator SDK
-> Agregar arm64
, arm64e
, armv7
Del mismo modo, agregue x86_64
, i386
a Any iOS SDK
.
PD: puede verificar todas las arquitecturas que están presentes en su marco ejecutando file
o lipo -info
.
Ex. file /Users/srikanth.kv/MyProject/MyLibrary.framework/MyLibrary
Tengo un marco con binario universal que contiene x86_64
y arm64
con el que me fusiono lipo
con un script personalizado en el momento de la compilación del marco. Encontré este mismo problema para XCode 12.3 y he creado una solución por ahora. Con suerte, esto se solucionará rápidamente en XCode, pero hasta entonces, una solución rápida sería reducir las arquitecturas y usar el marco que necesita. EDITAR: vea mi respuesta aquí sobre cómo comenzar a producir .xcframeworks, que es la solución a largo plazo para los autores de marcos
Por ejemplo, supongamos que estoy en una terminal en el directorio de trabajo donde mi marco universal some_framework.framework
es. Si quiero ejecutar en un dispositivo físico real, ejecuto el siguiente comando:
lipo -thin arm64 some_framework.framework/some_framework -output some_framework
Con el comando anterior, extrae el arm64
binario. Luego, reemplace el actual some_framework.framework/some_framework
con los recién generados arm64
solo binario
mv some_framework some_framework.framework
Si tiene un marco universal construido solo a partir de fuentes de Objective-C, su trabajo está hecho. Pero si también tiene un código Swift, entonces deberá actualizar some_framework.framework/Modules/some_framework.swiftmodule
para que no contenga ninguna referencia a arquitecturas que no sean arm64
.
Seguiría un proceso similar para ejecutar en el simulador excepto que necesita x86_64
. Actualmente estoy manteniendo dos versiones de mi marco hasta que esto se solucione. Cada vez que cambio entre el simulador y el dispositivo, simplemente cambio qué marco está en mi proyecto.
Sección de Reseñas y Valoraciones
No se te olvide dar visibilidad a esta división si lograste el éxito.