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

为ios应用程序创建共享库(二进制和资源),ios,xcode5,Ios,Xcode5,我想为ios应用程序创建一个共享“库”。这将是一个私人图书馆,即不会分发给其他开发人员/公司。我想创建这个库,以便能够在开发过程中清晰地分离责任/关注点。此库将与REST服务接口。它将负责与REST服务的通信,并将响应转换为目标c模型 最初,该库将在单个iPhone应用程序中使用。但最终,它也可能用于iPad应用程序 将有代码和资源 此库将依赖于其他框架(例如sqlite) 关于这一点,我已经在谷歌上做了大量的搜索,但我仍然不清楚最好的方法是什么。我已经读过了,但这似乎有些过头了,因为我不需要一

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

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

将有代码和资源

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

关于这一点,我已经在谷歌上做了大量的搜索,但我仍然不清楚最好的方法是什么。我已经读过了,但这似乎有些过头了,因为我不需要一个通用的应用程序(尽管它不会有什么坏处)

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


我正在使用xcode 5。

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

无论你是构建一个库还是构建一个框架,这都没有多大区别,对于这个小家伙来说,区别主要在于我的工作方式的语义差异

mine有两个主要目标(除了测试),第一个是常规的构建目标,就像任何其他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、ARM7s和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}"

谢谢你的来电。我正在寻找一些关于如何真正做到这一点的指导。现在我正在编写一个构建阶段的运行脚本,它创建一个框架目录结构。我不确定是否有更简单的方法。据我所知,静态库不允许使用资源(其中资源是图像文件或plist)。我也没有找到一种使用框架来实现这一点的方法,我很抱歉地说:(…(尽管苹果当然可以)导入我的“JEFkit”框架的项目中唯一出现的东西是头文件设置为“public”的东西,即没有图像、没有声音文件,甚至连笔尖都没有。我仍然发现这是一种非常方便的方法来集中我的代码库,因为代码在项目中不断增长,如果我觉得它将可重用,那么它将进入我的框架d、 一切都是一样的,但当我在后续项目中需要它时,它已经存在了,当我在该项目中调整它时,早期项目也会在其下一个构建时受益。这非常有用,谢谢!这样做(弄清楚如何制作框架)会让我非常想念JVM和JAR:)你查过CocoaPods.org吗?但它不适用于二进制文件,它使用源代码。我发现这篇博文比许多博文都好,因为它是内部使用的