使用Xcode 8创建通用框架?

我公司的iOS框架适用于真正的iOS设备。 所述框架当前作为Xcode项目中的附加目标生成,该Xcode项目还生成应用程序。 (这使得调试框架变得相对容易。)

我们最近也收到了让它在模拟器中工作的请求。 我现在可以这样做,下一步是创建一个既可以在真实设备上也可以在模拟器中运行的编译版本。 遗憾的是,我无法找到任何材料,表明任何人都使用Xcode 8来完成此操作。有些材料解释了如何使用旧版本的Xcode,但在一个版本的Xcode中工作的可能不起作用或在以后建议版。 (我们已经有了一种在我们身上创建通用框架的方法。)我尝试使用一些pre-Xcode 8脚本,但它们都没有工作。

有没有人设法使用Xcode 8为iOS生成通用框架? 如果是这样,怎么办呢?

提前感谢任何人都可以提供的帮助。

亚伦阿德尔曼

这是可能的,因为我目前正在Xcode 8上开发iOS,watchOS和tvOS上的通用框架。

我这样做的方法是创建一个Aggregate目标(跨平台)并在其构建阶段添加一个运行脚本。 该脚本基本上编译了iphonesimulator和iphoneos的iOS目标

在此之后,它创建一个合并它们的新二进制文件(lipo -create -output)

您是否介意发布您当前的构建脚本以生成通用框架,以便我可以指导您做错了什么?

考虑到脚本可能不是您的问题,您的问题可能是设置有效的体系结构,架构甚至是如何签署目标。 我现在建议,不要选中目标常规设置中的自动管理签名选项,并手动设置配置文件和证书。

运行脚本:

#!/bin/sh UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal # make sure the output directory exists mkdir -p "${UNIVERSAL_OUTPUTFOLDER}/iOS" # Step 1. Build Device and Simulator versions on iOS xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' clean build xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" -sdk iphoneos clean build # Step 2. Copy the framework structure (from iphoneos build) to the universal folder cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/iOS" # Step 3. Create universal binary file using lipo and place the combined executable in the copied framework directory lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/iOS/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}" # Step 4. Convenience step to copy the framework to the project's directory mkdir -p "${TMPDIR}/${PROJECT_NAME}/Frameworks/iOS" cp -R "${UNIVERSAL_OUTPUTFOLDER}/iOS/${PROJECT_NAME}.framework" "${TMPDIR}/${PROJECT_NAME}/Frameworks/iOS" # Step 6. Create .tar.gz file for posting on the binary repository cd "${TMPDIR}" # We nest the framework inside a Frameworks folder so that it unarchives correctly tar -zcf "${PROJECT_NAME}.framework.tar.gz" "${PROJECT_NAME}/Frameworks/" mv "${PROJECT_NAME}.framework.tar.gz" "${PROJECT_DIR}/" # Step 7. Convenience step to open the project's directory in Finder #open "${PROJECT_DIR}" 

考虑到我在构建设置中将Build Active Architecture Only设置为NO,同样有效的架构设置为arm64,x86_64,i386,armv7,armv7s。 架构是$ {ARCHS_STANDARD} armv7s。

我还设置了用户定义的构建设置BITCODE_GENERATION_MODE bitcode。 使用此构建设置,我确保生成启用了bitcode的二进制文件。

构建iOS / tvOS通用/胖框架

https://github.com/unchartedworks/universalbuild

用法:

universalbuild(-p | –project name.xcodeproj)( – s | –scheme schemename)( – c | – configuration configurationname)

例:

 git clone https://github.com/cruisediary/Pastel.git cd Pastel universalbuild -p ./Pastel.xcodeproj -s Pastel -c Debug 

运行脚本来创建通用框架(没有递归问题)

 #!/bin/sh UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal # make sure the output directory exists mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" # Next, work out if we're in SIM or DEVICE if [ "false" == ${ALREADYINVOKED:-false} ] then export ALREADYINVOKED="true" if [ ${PLATFORM_NAME} = "iphonesimulator" ] then xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build else xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build fi # Step 2. Copy the framework structure (from iphoneos build) to the universal folder cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/" # Step 3. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule" fi # Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}" # Step 5. Convenience step to copy the framework to the project's directory cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}" # Step 6. Convenience step to open the project's directory in Finder open "${PROJECT_DIR}" fi 

我也在同样的问题上挣扎。 我有一系列用作源pod的cocoapods,但需要转换成二进制pod。 在大量的谷歌搜索,反复试验和黑客攻击之间,我想出了一个我已经取得巨大成功的剧本。 它基于您在此处看到的脚本,但在缺少某些内容时重构为函数和一些调试输出(进入/ tmp中的日志)。

这个脚本可以在这里找到github gist: https : //gist.github.com/intere/bc380fa45ccf23976d3fc297522d29a8

FWIW,我一直在使用Xcode 9(9.2,然后是9.3,现在是9.4)。