我公司的iOS框架适用于真正的iOS设备。所述框架当前作为Xcode项目中的附加目标生成,该Xcode项目还生成应用程序。 (这使得调试框架变得相对容易。)
我们最近也收到了让它在模拟器中工作的请求。我现在可以这样做,下一步是创建一个既可以在真实设备上也可以在模拟器中运行的编译版本。遗憾的是,我无法找到任何材料,表明任何人都使用Xcode 8来完成此操作。有些材料解释了如何使用旧版本的Xcode,但在一个版本的Xcode中工作的可能不起作用或在以后建议版。 (我们已经有一种方法可以在我们身上创建一个通用框架。)我尝试使用一些pre-Xcode 8脚本,但没有一个工作。
有没有人设法使用Xcode 8为iOS生成通用框架?如果是这样,怎么办呢?
提前感谢任何人提供的任何帮助。
Aaron Adelman
答案 0 :(得分:16)
因为我目前正在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的二进制文件。
答案 1 :(得分:3)
构建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
答案 2 :(得分:1)
运行脚本以创建通用框架(无递归问题)
#!/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
答案 3 :(得分:0)
我也在同样的问题上挣扎。我有一系列用作源pod的cocoapods,但需要转换成二进制pod。在大量的谷歌搜索,反复试验和黑客攻击之间,我想出了一个我已经取得巨大成功的剧本。它基于您在此处看到的脚本,但在缺少某些内容时重构为函数和一些调试输出(进入/ tmp中的日志)。
这个脚本可以在这里找到github要点:https://gist.github.com/intere/bc380fa45ccf23976d3fc297522d29a8
FWIW,我一直在使用Xcode 9(9.2,然后是9.3,现在是9.4)。