是否有可能使用位码创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 Bitcode
为Yes
-
添加构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(模拟器)。