首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Xcode8创建通用框架?

使用Xcode8创建通用框架?
EN

Stack Overflow用户
提问于 2016-10-06 15:32:39
回答 4查看 9.3K关注 0票数 8

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

我们最近也收到了让它在模拟器中工作的请求。我现在可以让它这样做了,下一步是创建一个编译后的版本,它既可以在真实设备上运行,也可以在模拟器中运行。遗憾的是,我找不到任何材料表明有人使用过Xcode 8。有一些材料解释了如何使用旧版本的Xcode,但在Xcode的一个版本中工作的东西可能在更高的版本中不起作用或不可取。(我们已经有了一种在我们身上创建通用框架中断的方法。)我试着使用了一些Xcode8之前的脚本,但都不起作用。

有没有人能用Xcode8为iOS生成一个通用的框架?如果是这样,怎么做呢?

提前感谢任何人能提供的任何帮助。

阿伦·阿德尔曼

EN

回答 4

Stack Overflow用户

发布于 2016-10-06 20:21:28

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

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

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

你介意发布你当前生成通用框架的构建脚本吗?这样我就可以指导你做错了什么?

考虑到脚本在这里不是你的问题,你的问题可能是设置你的有效架构,你的架构,甚至你如何对目标进行签名。目前,我建议保留目标常规设置中的Automatically signing选项为未选中状态,并手动设置配置配置文件和证书。

运行脚本:

代码语言:javascript
复制
    #!/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设置为NO,有效的架构也设置为arm64、x86_64、i386、armv7、armv7s。架构为${ARCHS_STANDARD} armv7s。

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

票数 17
EN

Stack Overflow用户

发布于 2017-05-28 21:35:12

构建iOS/tvOS通用/fat框架

https://github.com/unchartedworks/universalbuild

使用:

通用构建(-p|--项目方案名)(-s|--name.xcodeproj方案名)(-c|--配置配置名)

示例:

代码语言:javascript
复制
git clone https://github.com/cruisediary/Pastel.git
cd Pastel
universalbuild -p ./Pastel.xcodeproj -s Pastel -c Debug
票数 3
EN

Stack Overflow用户

发布于 2017-09-04 21:16:29

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

代码语言:javascript
复制
#!/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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39890114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档