是否有可能使用位码创build一个通用的iOS框架?

根据我的理解, bitcode允许以中间二进制格式生成二进制文件。 所以这是编译到ARM或x64架构之前的一步。

iOS 8以后,可以为iOS创build“真正的” .framework文件。但是,默认情况下(模拟器,iPhone)仅为一个体系结构编译框架文件。 当需要分发.framework文件时,最好提供一个兼容iOS模拟器的文件,并且可以部署到iPhone。 脚本的不同例子可以被发现使用lipo来创build这样的胖文件。

然而,是否有可能只发布一个编译为位码的.framework ,而不必创build具有不同体系结构的胖文件?

不幸的是,即使为我的.framework启用了bitcode:

  • 根据目标架构默认创build不同的文件
  • 即使“存档”菜单似乎为框架目标启用,即使在我的Organizer视图中,我也找不到结果

我是否误解了位码概念中的某些东西,还是错过了某些东西?

你需要提供一个通用的扁平框架。 这是由lipo创build的。

  • 启用位码,目标Targets->Build Setting->Enable BitcodeYes
  • 添加构build目标以创build通用框架

    创build一个Aggregate目标并将以下脚本复制到Build Phrase -> Run Script


     ######################
     #选项
     ######################

     #verbose
    设置-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”

    框架= “$ {UNIVERSAL_LIBRARY_DIR} / $ {} FRAMEWORK_NAME .framework”


     ######################
     #build立框架
     ######################
     #build立模拟器
     xcodebuild -target $ {PROJECT_NAME} -sdk iphonesimulator -configuration $ {CONFIGURATION} ARCHS =“i386 x86_64”ONLY_ACTIVE_ARCH = NO clean build CONFIGURATION_BUILD_DIR = $ {BUILD_DIR} / $ {CONFIGURATION} -iphonesimulator
     #build立设备
     xcodebuild -scheme $ {PROJECT_NAME} -sdk iphoneos -configuration $ {CONFIGURATION} ARCHS =“armv7 armv7s arm64”ONLY_ACTIVE_ARCH = NO clean archive CONFIGURATION_BUILD_DIR = $ {BUILD_DIR} / $ {CONFIGURATION} -iphoneos

     ######################
     #创build通用目录
     ######################

     rm -rf“$ {UNIVERSAL_LIBRARY_DIR}”

     mkdir“$ {UNIVERSAL_LIBRARY_DIR}”

     mkdir“$ {FRAMEWORK}”


     ######################
     #复制文件框架
     ######################

     cp -r“$ {DEVICE_LIBRARY_PATH} /”。  “$ {框架}”


     ######################
     #build立一个通用的二进制
     ######################

     lipo“$ {SIMULATOR_LIBRARY_PATH} / $ {FRAMEWORK_NAME}”“$ {DEVICE_LIBRARY_PATH} / $ {FRAMEWORK_NAME}”-create -output“$ {FRAMEWORK} / $ {FRAMEWORK_NAME}”| 回声

     #对于Swift框架,需要在通用框架中复制Swiftmodule
     if [-d“$ {SIMULATOR_LIBRARY_PATH} / Modules / $ {FRAMEWORK_NAME} .swiftmodule /”]; 然后
     cp -f $ {SIMULATOR_LIBRARY_PATH} / Modules / $ {FRAMEWORK_NAME} .swiftmodule / *“$ {FRAMEWORK} / Modules / $ {FRAMEWORK_NAME} .swiftmodule /”| 回声
    科幻

     if [-d“$ {DEVICE_LIBRARY_PATH} / Modules / $ {FRAMEWORK_NAME} .swiftmodule /”]; 然后
     cp -f $ {DEVICE_LIBRARY_PATH} / Modules / $ {FRAMEWORK_NAME} .swiftmodule / *“$ {FRAMEWORK} / Modules / $ {FRAMEWORK_NAME} .swiftmodule /”| 回声
    科幻

     ######################
     #在Release中,将结果复制到发布目录
     ######################
     OUTPUT_DIR = “$ {} PROJECT_DIR /build筑/ $ {FRAMEWORK_NAME}  -  $ {}configuration-iphoneuniversal /”

     rm -rf“$ OUTPUT_DIR”
     mkdir -p“$ OUTPUT_DIR”

     cp -r“$ {FRAMEWORK}”“$ OUTPUT_DIR”

    如果[$ {REVEAL_ARCHIVE_IN_FINDER} = true]; 然后
    打开“$ {OUTPUT_DIR} /”
    科幻

注意

  • bitcode只打包在为iphoneOS sdk archive构build

  • otool -l -arch arm64 <yourframework_binary>|grep __LLVM检查是否包含bitcode,如果不指定arch参数,将不会有__LLVM ,因为otool只是打印一个主机arch(模拟器)。