为ios应用程序创建共享库(二进制文件和资源)

时间:2013-12-27 19:50:39

标签: ios xcode5

我想为ios应用创建一个共享的“库”。这将是一个私人图书馆,即不会分发给其他开发者/公司。我想创建这个库,以便能够在开发过程中清楚地分离责任/关注点。该库将与REST服务连接。它将负责与REST服务的通信并将响应转换为客观的c模型。

最初,该库将用于单个iPhone应用程序。但最终,它也可以用在iPad应用程序中。

会有代码和资源。

该库将依赖于其他框架(例如sqlite)。

我已经做了相当多的谷歌搜索,但我仍然不清楚前进的最佳方式是什么。我读过http://www.cocoanetics.com/2010/04/making-your-own-iphone-frameworks/但这看起来有些过分,因为我不需要通用的应用程序(尽管它不会受到伤害)。

我应该做一个静态库和资源包吗?

我正在使用xcode 5.

2 个答案:

答案 0 :(得分:1)

矿井如何运作..

我有两个主要目标(除了测试),第一个是常规构建目标,就像在任何其他Xcode项目中一样,除了它在构建阶段结束时有这个小脚本

set -e

mkdir -p "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers"

# Link the "Current" version to "A"
/bin/ln -sfh A "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/Current"
/bin/ln -sfh Versions/Current/Headers "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Headers"
/bin/ln -sfh "Versions/Current/${PRODUCT_NAME}" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/${PRODUCT_NAME}"

# The -a ensures that the headers maintain the source modification date so that we don't constantly
# cause propagating rebuilds of files that import these headers.
/bin/cp -a "${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers"

并且第二个目标是'聚合目标',这是我实际构建的目标,以及我在项目中创建符号链接'别名'的'产品'。这个聚合目标将另一个目标设置为依赖,换句话说,它在构建时强制构建另一个目标,然后它将4个不同的体系结构(i386用于模拟器,ARM7,ARM7和ARM64)组合到一起一个二进制。这是...的构建脚本。

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

SF_TARGET_NAME=${PROJECT_NAME}
SF_EXECUTABLE_PATH="lib${SF_TARGET_NAME}.a"
SF_WRAPPER_NAME="${SF_TARGET_NAME}.framework"

# The following conditionals come from
# https://github.com/kstenerud/iOS-Universal-Framework

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 [[ "$SDK_NAME" =~ ([0-9]+.*$) ]]
then
SF_SDK_VERSION=${BASH_REMATCH[1]}
else
echo "Could not find sdk version from SDK_NAME: $SDK_NAME"
exit 1
fi

if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]
then
SF_OTHER_PLATFORM=iphonesimulator
else
SF_OTHER_PLATFORM=iphoneos
fi

if [[ "$BUILT_PRODUCTS_DIR" =~ (.*)$SF_SDK_PLATFORM$ ]]
then
SF_OTHER_BUILT_PRODUCTS_DIR="${BASH_REMATCH[1]}${SF_OTHER_PLATFORM}"
else
echo "Could not find platform name from build products directory: $BUILT_PRODUCTS_DIR"
exit 1
fi

# Build the other platform.
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk ${SF_OTHER_PLATFORM}${SF_SDK_VERSION} BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}" $ACTION

# Smash the two static libraries into one fat binary and store it in the .framework
lipo -create "${BUILT_PRODUCTS_DIR}/${SF_EXECUTABLE_PATH}" "${SF_OTHER_BUILT_PRODUCTS_DIR}/${SF_EXECUTABLE_PATH}" -output "${BUILT_PRODUCTS_DIR}/${SF_WRAPPER_NAME}/Versions/A/${SF_TARGET_NAME}"

# Copy the binary to the other architecture folder to have a complete framework in both.
cp -a "${BUILT_PRODUCTS_DIR}/${SF_WRAPPER_NAME}/Versions/A/${SF_TARGET_NAME}" "${SF_OTHER_BUILT_PRODUCTS_DIR}/${SF_WRAPPER_NAME}/Versions/A/${SF_TARGET_NAME}"

答案 1 :(得分:0)

是的,你应该。它确实可以帮助您构建可重用的代码库,而不是总是打开旧项目来复制/粘贴代码块(非常不受欢迎)

无论是一个库还是一个你构建的框架都没有太大的区别,这个小家伙的差异在很大程度上是语义上的