¿Es posible crear un marco universal para iOS usando bitcode?

Por lo que entendí, bitcode permite generar binarys con un formatting binary intermedio. Por lo tanto, es el paso antes de comstackr en una architecture ARM o x64.

Es posible crear un file .framework "real" para iOS desde iOS 8. Sin embargo, los files de estructura se comstackn para una sola architecture por defecto (emulador, iPhone). Cuando se quiere distribuir un file .framework , es mejor proporcionar un file compatible con el emulador de iOS y también se puede desplegar en un iPhone. Se pueden encontrar diferentes ejemplos de scripts para crear un file tan gordo usando lipo .

Sin embargo, ¿sería posible distribuir solo un .framework comstackdo como código de bits sin tener que crear un file gordo con diferentes architectures?

Desafortunadamente, incluso con el bitcode habilitado para mi .framework :

  • diferentes files se crean de forma pnetworkingeterminada de acuerdo con la architecture específica
  • incluso si el menu "file" parece estar habilitado para un objective de marco, no puedo encontrar el resultado, incluso en la vista de mi Organizador

¿ Malinterpreto algo en el concepto de bitcode o extraño algo?

Necesita proporcionar un marco plano universal. Que es creado por lipo .

  • Habilitar código de bits, Targets->Build Setting->Enable Bitcode de Targets->Build Setting->Enable Bitcode a Yes
  • Agregar objective de compilation para crear un marco universal

    Cree un destino Aggregate y copie el siguiente script en Build Phrase -> Run Script :


     ######################
     # Opciones
     ######################

     #verboso
     establecer -x

     REVEAL_ARCHIVE_IN_FINDER = false

     FRAMEWORK_NAME = "$ {PROJECT_NAME}"

     SIMULATOR_LIBRARY_PATH = "$ {BUILD_DIR} / $ {CONFIGURATION} -iphonesimulator / $ {FRAMEWORK_NAME} .framework"

     DEVICE_LIBRARY_PATH = "$ {BUILD_DIR} / $ {CONFIGURATION} -iphoneos / $ {FRAMEWORK_NAME} .framework"

     UNIVERSAL_LIBRARY_DIR = "$ {BUILD_DIR} / $ {CONFIGURATION} -iphoneuniversal"

     FRAMEWORK = "$ {UNIVERSAL_LIBRARY_DIR} / $ {FRAMEWORK_NAME} .framework"


     ######################
     # Build Frameworks
     ######################
     # Build para el simulador
     xcodebuild -target $ {PROJECT_NAME} -sdk iphonesimulator -configuration $ {CONFIGURATION} ARCHS = "i386 x86_64" ONLY_ACTIVE_ARCH = NO compilation limpia CONFIGURATION_BUILD_DIR = $ {BUILD_DIR} / $ {CONFIGURATION} -iphonesimulator
     # Build para dispositivo
     xcodebuild -scheme $ {PROJECT_NAME} -sdk iphoneos -configuration $ {CONFIGURATION} ARCHS = "armv7 armv7s arm64" ONLY_ACTIVE_ARCH = NO file limpio CONFIGURATION_BUILD_DIR = $ {BUILD_DIR} / $ {CONFIGURATION} -iphoneos

     ######################
     # Crear directory para universal
     ######################

     rm -rf "$ {UNIVERSAL_LIBRARY_DIR}"

     mkdir "$ {UNIVERSAL_LIBRARY_DIR}"

     mkdir "$ {FRAMEWORK}"


     ######################
     # Copiar files de Framework
     ######################

     cp -r "$ {DEVICE_LIBRARY_PATH} /."  "$ {FRAMEWORK}"


     ######################
     # Hacer un binary universal
     ######################

     lipo "$ {SIMULATOR_LIBRARY_PATH} / $ {FRAMEWORK_NAME}" "$ {DEVICE_LIBRARY_PATH} / $ {FRAMEWORK_NAME}" -create -output "$ {FRAMEWORK} / $ {FRAMEWORK_NAME}" |  eco

     # Para el marco Swift, Swiftmodule debe copyrse en el marco universal
     si [-d "$ {SIMULATOR_LIBRARY_PATH} / Modules / $ {FRAMEWORK_NAME} .swiftmodule /"];  entonces
     cp -f $ {SIMULATOR_LIBRARY_PATH} / Módulos / $ {FRAMEWORK_NAME} .swiftmodule / * "$ {FRAMEWORK} / Módulos / $ {FRAMEWORK_NAME} .swiftmodule /" |  eco
     fi

     si [-d "$ {DEVICE_LIBRARY_PATH} / Modules / $ {FRAMEWORK_NAME} .swiftmodule /"];  entonces
     cp -f $ {DEVICE_LIBRARY_PATH} / Modules / $ {FRAMEWORK_NAME} .swiftmodule / * "$ {FRAMEWORK} / Modules / $ {FRAMEWORK_NAME} .swiftmodule /" |  eco
     fi

     ######################
     # En la versión, copy el resultado al directory de publicación.
     ######################
     OUTPUT_DIR = "$ {PROJECT_DIR} / build / $ {FRAMEWORK_NAME} - $ {CONFIGURATION} -iphoneuniversal /"

     rm -rf "$ OUTPUT_DIR"
     mkdir -p "$ OUTPUT_DIR"

     cp -r "$ {FRAMEWORK}" "$ OUTPUT_DIR"

     si [$ {REVEAL_ARCHIVE_IN_FINDER} = true];  entonces
     abrir "$ {OUTPUT_DIR} /"
     fi

Nota

  • bitcode solo se incluye en la compilation de archive para iphoneos sdk

  • otool -l -arch arm64 <yourframework_binary>|grep __LLVM para verificar si se incluye el código de bit, si no especifica el parámetro de arch , no habrá __LLVM , ya que otool solo imprime un arco de host (simulador).