创建通用iOS框架

时间:2016-03-02 19:27:57

标签: ios ios-frameworks

我有一个工作区,它有两个项目:一个是Cocoa触摸框架,另一个是使用框架的应用程序。我在嵌入式二进制文件部分添加了框架。当我运行应用程序时,它编译框架和应用程序,事情很好。但是,我需要框架来编译所有体系结构,而不仅仅是它当前正在构建的体系结构。我搜索过这个,最常见的解决方案是添加一个运行脚本来启用此功能。但是,我遇到的每个运行脚本都是彼此不同的,所以我很困惑什么是适合这种情况的脚本?另外,为此目的创建一个胖二进制文件是个好主意吗?

我目前正在使用以下脚本,我已添加到框架的构建阶段(取自http:// www.insert.io/frameworkios8xcode6/):

set -e
set +u
# Avoid recursively calling this script.
if [[ $SF_MASTER_SCRIPT_RUNNING ]]
then
exit 0
fi
set -u
export SF_MASTER_SCRIPT_RUNNING=1


# Constants
SF_TARGET_NAME=${PROJECT_NAME}
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

# Take build target
if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]
then
SF_SDK_PLATFORM=${BASH_REMATCH[1]}
else
echo "Could not find platform name from SDK_NAME: $SDK_NAME"
exit 1
fi

if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]
then
echo "Please choose iPhone simulator as the build target."
exit 1
fi

IPHONE_DEVICE_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos

# Build the other (non-simulator) platform
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/arm64" SYMROOT="${SYMROOT}" ARCHS='arm64' VALID_ARCHS='arm64' $ACTION

xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}"  CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/armv7" SYMROOT="${SYMROOT}" ARCHS='armv7 armv7s' VALID_ARCHS='armv7 armv7s' $ACTION

# Copy the framework structure to the universal folder (clean it first)
rm -rf "${UNIVERSAL_OUTPUTFOLDER}"
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework"

# Smash them together to combine all architectures
lipo -create  "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/arm64/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/armv7/${PROJECT_NAME}.framework/${PROJECT_NAME}" -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}"

此脚本要求为iOS Simulator构建框架。在我的工作区的Products文件夹中构建.framework后,显示该框架位于iphoneos文件夹而不是Universal文件夹中。我应该将.framework从Universal文件夹拖到工作表中的Products部分吗?

2 个答案:

答案 0 :(得分:0)

我不知道在同一个工作区中有框架项目和app项目,但是你可以看到我的回答here我是如何做到的。我没有必要将框架放在嵌入式二进制文件中。我只需要放入Linked Frameworks和Libraries。我只是设置了一个构建脚本,当我为通用iOS设备构建时,它会为我的桌面构建一个Fat Framework。然后我可以运行-lipo info命令来确认这实际上是一个胖框架。从那里我将框架放在我的应用程序中的链接框架和库中。

答案 1 :(得分:0)

它对我有用的是以下完整的教程:

https://github.com/jverkoey/iOS-Framework

在那里,你可以看到benefits静态iOS框架上使用基于Cocoa Touch静态库的框架。这真的是一个公开讨论,但我只是告诉你我在生产环境中对它的积极体验。

您必须关注的重要命令是lipo。它是那个将二进制文件粉碎成胖子的人。使用该命令,您可以轻松检查结果是否包含您想要的体系结构。如果没有,请先检查this,然后确保按照上述指南的说明进行操作。

创建静态库后,可以运行以下命令来检查体系结构:

lipo -info YourLibrary.framework/YourLibrary

此解决方案还允许您将框架作为项目的依赖目标包含在内,使您的Framework开发变得更加容易。为此,请检查指南的this chapter