ios - 使用 CocoaPod 依赖构建 Cocoa Touch 框架,不要嵌入
问题描述
我有一个内置到CocoaTouch Framework中的 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
.
当我运行一个使用我的framework和 CocoaPods 将所需的依赖项添加到项目中的应用程序时,我收到以下错误:
objc[7299]:APPMBDynamicFilterResultTimestamp 类在 /private/var/containers/Bundle/Application/9966CA12-11F5-42FE-91FF-BB7A91C07571/MyProject.app/Frameworks/MyFrameworkName.framework/MyFrameworkName (0x101b34158) 和 /var/ 中实现容器/捆绑/应用程序/9966CA12-11F5-42FE-91FF-BB7A91C07571/MyProject.app/MyProject (0x1007416e8)。将使用两者之一。哪一个是未定义的。
我将如何构建具有依赖项的框架(否则它当然不会构建),但不将任何依赖项包含在框架中?
谢谢
解决方案
问题来自您在 SDK 中使用 cocoapods 依赖项的事实。正如您所提到的,一切正常,直到主机应用程序具有相同的依赖项。不幸的是,没有简单的方法来解决这个问题,因为相同依赖项的符号被链接到 SDK 和应用程序中。但是,您可以考虑几种方法。
- 如果您愿意通过 cocoapods 发布您的 SDK,那么您可以在您的 podspec 中指定依赖项。但是,在这种情况下,SDK 应该由 cocoapods 构建。例如podspec 示例
- 另一种方法是向您的 SDK 添加一个抽象层。您应该使用桥接模式来处理您的抽象。
我希望这会有所帮助。
推荐阅读
- java - Flutter 升级 SDK 问题
- c# - Unity firestore - 如何在 CheckAndFixDependenciesAsync() 之后立即运行 GetSnapshotAsync()?
- reactjs - 如何在 ToDo App 中渲染本地存储中的每个项目
- python - 在使用利用夏令时的 Python 时区时,应该传递什么 tzinfo?
- c - 使用 OpenMP 进行并行化
- javascript - React 中同时设置状态和调用补丁
- javascript - 使用 React Native 的平面列表
- c++ - 为什么我的代码没有被读取为 0 是有效响应?
- python - 如何在Python中生成长度为n的随机字节串
- javascript - 表单提交后反应js显示成功和错误消息