Con Xcode 6 tenemos la posibilidad de crear una dinámica propia Cocoa Frameworks
.
Porque:
El simulador todavía usa la
32-bit
biblioteca-
a partir del 1 de junio de 2015, las actualizaciones de la aplicación enviadas a la App Store deben incluir compatibilidad con 64 bits y estar compiladas con el SDK de iOS 8 ( developer.apple.com )
Tenemos que hacer una gran biblioteca para ejecutar proyectos en dispositivos y simuladores. es decir, soporta 32 y 64 bits en Frameworks.
Pero no encontré ningún manual sobre cómo exportar el marco universal fat para una futura integración con otros proyectos (y compartir esta biblioteca con alguien).
Aquí están mis pasos para reproducir:
Ambientado
ONLY_ACTIVE_ARCH=NO
en elBuild Settings
Agregue soporte
armv7 armv7s arm64 i386 x86_64
aArchitectures
(seguro)
- Construya Framework y ábralo en Finder:
- Agregar este marco a otro proyecto
Resultado actual:
Pero al final todavía tengo problemas para ejecutar el proyecto con este marco en los dispositivos y el simulador a la vez.
si tomo el marco de la
Debug-iphoneos
carpeta, funciona en dispositivos y obtiene un error en los simuladores:ld: symbol(s) not found for architecture i386
xcrun lipo -info CoreActionSheetPicker
Las arquitecturas en el archivo fat: CoreActionSheetPicker son: armv7 armv7s arm64
si tomo el marco de la
Debug-iphonesimulator
carpeta, funciona en simuladores. y tengo un error en el dispositivo:ld: symbol(s) not found for architecture arm64
xcrun lipo -info CoreActionSheetPicker
Las arquitecturas en el archivo fat: CoreActionSheetPicker son: i386 x86_64
Entonces, ¿cómo crear un marco dinámico que funcione en dispositivos y simuladores?
Esta respuesta relacionada con Xcode 6 iOS Creación de un marco Cocoa Touch - Problemas de arquitectura, pero no está duplicada.
Actualizar:
Encontré un "truco sucio" para este caso. Vea mi respuesta a continuación . Si alguien conoce la forma más conveniente, ¡hágamelo saber!
fuente
Respuestas:
La realidad de esta respuesta es: julio de 2015. Lo más probable es que las cosas cambien.
TLDR;
Actualmente, Xcode no tiene herramientas para la exportación automática de un marco fat universal, por lo que el desarrollador debe recurrir al uso manual de la
lipo
herramienta. Además, de acuerdo con este radar, antes de enviarlo al desarrollador de la AppStore, que es el consumidor del marco, también debe usarlolipo
para eliminar las secciones del simulador de un marco.Sigue una respuesta más larga
Hice una investigación similar sobre el tema (el enlace al final de la respuesta).
No había encontrado ninguna documentación oficial sobre la distribución de lo que mi investigación se basó en la exploración de Apple Developer foros, proyectos de Cartago y el reino y mis propios experimentos con
xcodebuild
,lipo
,codesign
herramientas.Aquí hay una cita larga (con un poco de marcado de mi parte) de la aplicación de exportación de hilos de los foros de desarrolladores de Apple con marco integrado :
Esto describe el proceso más o menos igual que @skywinder lo hizo en su respuesta.
Así es como Carthage usa lipo y Realm usa lipo .
DETALLE IMPORTANTE
Hay radar: Xcode 6.1.1 y 6.2: los marcos de iOS que contienen segmentos de simulador no se pueden enviar a la App Store y una larga discusión al respecto en Realm # 1163 y Carthage # 188 que terminó con una solución especial:
antes de enviarlo a la AppStore, los binarios del marco de trabajo de iOS deben eliminarse de las secciones del simulador
Carthage tiene un código especial: CopyFrameworks y la documentación correspondiente:
Realm tiene un script especial: strip-frameworks.sh y la documentación correspondiente:
También hay un buen artículo: Eliminación de arquitecturas no deseadas de bibliotecas dinámicas en Xcode .
Yo mismo utilicé Realm's,
strip-frameworks.sh
que me funcionó perfectamente sin ninguna modificación, aunque, por supuesto, cualquiera es libre de escribir uno desde cero.El enlace a mi tema que recomiendo leer porque contiene otro aspecto de esta pregunta: firma de código - Creación de marcos de trabajo iOS / OSX: ¿es necesario codificarlos antes de distribuirlos a otros desarrolladores?
fuente
Esta no es una solución tan clara, pero hay una única manera que encuentro:
Ambientado
ONLY_ACTIVE_ARCH=NO
en elBuild Settings
Abrir en la
Products
carpeta de la consola para su marco (puede abrirlo abriendo la carpeta del marco ycd ..
desde allí)Products
carpeta. Crea Fat Framework en esta carpeta. (o hágalo manualmente como se explica a continuación en 3. 4. )O:
Combine estos 2 Frameworks usando lipo por este script (reemplace
YourFrameworkName
a su nombre de Framework)Reemplazar con un nuevo binario de los marcos existentes:
./YourFrameworkName.framework
- ¡ es un binario gordo listo para usar! ¡Puedes importarlo a tu proyecto!Para el proyecto, que no está en los espacios de trabajo:
También puede intentar utilizar esta esencia como se describe aquí . Pero parece que no funciona para proyectos en espacios de trabajo.
fuente
Debug-
se usa la carpetalipo -create
? ¿Podría usarse este marco para laRelease
configuración y por qué? Gracias.La respuesta de @Stainlav fue muy útil, pero lo que hice fue compilar dos versiones del marco (una para el dispositivo y otra para el simulador) y luego agregué lo siguiente
Run Script Phase
para copiar automáticamente el marco precompilado requerido para la arquitectura en ejecuciónDe esta manera, no tengo uso
lipo
para crear un marco gordo ni el Realmstrip-frameworks.sh
para eliminar las porciones innecesarias al enviarlo a la App Store.fuente
${SRCROOT}/Frameworks/Active
carpeta. Se reemplazan por los marcos precompilados adecuados para la arquitectura activa en tiempo de compilación.lipo
enfoque de combinar y luego desgarrar .básicamente para esto encontré una muy buena solución. solo tienes que seguir estos sencillos pasos.
y eso es. Aquí fusionamos el simulador y la versión del dispositivo del binario MyFramework presente dentro de MyFramework.framework. Obtenemos un marco universal que se construye para todas las arquitecturas, incluidos el simulador y el dispositivo.
fuente
Solo quiero actualizar esta gran respuesta de @odm. Desde Xcode 10, la
CURRENT_ARCH
variable ya no refleja la arquitectura de compilación. Así que cambié el script para verificar la plataforma en su lugar:También agregué una línea para borrar el directorio de destino antes de copiar, porque noté que los archivos adicionales en los subdirectorios no se sobrescribirán de otra manera.
fuente
Mi respuesta cubre los siguientes puntos:
Hacer un marco que funcione tanto para el simulador como para el dispositivo
¿Cómo exportar Cocoa Touch Framework “gordo” (tanto para Simulador como para Dispositivo)?
Símbolos no definidos para la arquitectura x86_64
ld: símbolo (s) no encontrado para la arquitectura x86_64
Pasos 1: primero cree sus marcos con Simulator target
Pasos 2: después del éxito del proceso de construcción del simulador, ahora cree para su marco con la selección de destino del dispositivo o la selección de dispositivo iOS genérico
Paso 3: Ahora seleccione el objetivo de su marco y para eso, en "Fases de compilación", seleccione "Agregar secuencia de comandos de ejecución" y copie el siguiente código de secuencia de comandos)
Paso 4: Ahora, finalmente, compile de nuevo y su marco estará listo para la compatibilidad tanto con el simulador como con el dispositivo. ¡¡¡¡Viva!!!!
[Nota: Debemos tener ambos marcos compatibles listos antes del paso 4 final (el simulador y la arquitectura del dispositivo son compatibles, de lo contrario, siga los pasos 1 y 2 anteriores correctamente)
Ver la imagen de referencia:
Ponga el código debajo en el área de shell:
fuente