使用CocoaPod依赖项构建Cocoa Touch框架,不要嵌入

时间:2019-08-09 07:49:23

标签: ios swift xcode

我有一个内置在 CocoaTouch框架中的SDK。 此SDK使用CocoaPods,因为它依赖于其他一些库。我使用以下构建脚本来构建框架:

# 1
# Set bash script to exit immediately if any commands fail.
set -e
# 2
# Setup some constants for use later on.
FRAMEWORK_NAME="MyFrameworkName"
OUTPUT_DIR="${SRCROOT}/framework/build"
# 3
# If remnants from a previous build exist, delete them.
if [ -d "${OUTPUT_DIR}" ]; then
rm -rf "${OUTPUT_DIR}"
fi
# 4
# Build the framework for device and for simulator (using
# all needed architectures).
xcodebuild -workspace "${FRAMEWORK_NAME}.xcworkspace" -scheme "${FRAMEWORK_NAME}" -configuration Release -arch arm64 -arch armv7 -arch armv7s only_active_arch=no defines_module=yes -sdk "iphoneos" -derivedDataPath "${OUTPUT_DIR}"
xcodebuild -workspace "${FRAMEWORK_NAME}.xcworkspace" -scheme "${FRAMEWORK_NAME}" -configuration Release -arch x86_64 -arch i386 only_active_arch=no defines_module=yes -sdk "iphonesimulator" -derivedDataPath "${OUTPUT_DIR}"
# 5
# Remove .framework file if exists from previous run.
if [ -d "${OUTPUT_DIR}/${FRAMEWORK_NAME}.framework" ]; then
rm -rf "${OUTPUT_DIR}/${FRAMEWORK_NAME}.framework"
fi
# 6
# Copy the device version of framework.
cp -r "${OUTPUT_DIR}/Build/Products/Release-iphoneos/${FRAMEWORK_NAME}.framework" "${OUTPUT_DIR}/${FRAMEWORK_NAME}.framework"
# 7
# Replace the framework executable within the framework with
# a new version created by merging the device and simulator
# frameworks' executables with lipo.
lipo -create -output "${OUTPUT_DIR}/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${OUTPUT_DIR}/Build/Products/Release-iphoneos/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${OUTPUT_DIR}/Build/Products/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}"
# 8
# Copy the Swift module mappings for the simulator into the
# framework. The device mappings already exist from step 6.
cp -r "${OUTPUT_DIR}/Build/Products/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule/" "${OUTPUT_DIR}/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule"

这一切都很好,使用框架也不是问题。但是由于此框架是使用其他依赖项(例如Alamofire和Firebase)构建的,因此MyFrameworkName.framework中有很多痕迹。

当我运行使用此框架的应用程序,并使用CocoaPods将所需的依赖项添加到项目中时,出现以下错误:

  

objc [7299]:类APMPBDynamicFilterResultTimestamp在/private/var/containers/Bundle/Application/9966CA12-11F5-42FE-91FF-BB7A91C07571/MyProject.app/Frameworks/MyFrameworkName.framework/MyFrameworkName(0x101b34158)和/var/containers/Bundle/Application/9966CA12-11F5-42FE-91FF-BB7A91C07571/MyProject.app/MyProject(0x1007416e8)。将使用两者之一。哪个未定义。

我将如何构建具有依赖项的框架(否则,它当然不会构建),但是没有在框架中包含任何依赖项?

谢谢

1 个答案:

答案 0 :(得分:1)

问题来自您在SDK中使用cocoapods依赖项这一事实。如您所述,一切正常,直到主机应用程序具有相同的依赖关系为止。不幸的是,由于具有相同依赖项的符号已链接到SDK和应用程序中,因此没有简单的方法可以解决此问题。但是,您可能会考虑几种方法。

  1. 如果您愿意通过cocoapods发行SDK,则可以在podspec中指定依赖项。但是,在那种情况下,SDK应该由cocoapods构建。例如podspec example
  2. 另一种方法是在SDK中添加一个抽象层。您应该使用Bridge pattern处理抽象。

我希望有帮助。