【问题标题】:iOS: How to add different frameworks for device and simulator in the same code xcode swift?iOS:如何在同一代码xcode swift中为设备和模拟器添加不同的框架?
【发布时间】:2018-07-24 22:51:11
【问题描述】:

我有一个用于模拟器和真实设备的不同版本的第三方框架。

我在做什么: 现在我分别为模拟器和设备维护两个不同的目标。 我需要将框架添加到目标以及嵌入式二进制文件部分。我还必须在桥接头部分中导入标头,因为这些是 objc 框架(我为每个目标添加了 swift 编译器标志,并在桥接头部分中导入了必要的标头)。如果我在同一个目标中添加两个框架,则会出现重复符号错误。

注意:我没有这些框架的源代码。所以我不能建立一个通用的框架和使用。

问题: 我如何使用这些框架,以便在不更改任何代码或设置的情况下,我应该能够在模拟器和真机?

【问题讨论】:

  • 第三方不提供有关如何以最佳方式执行此操作的文档吗?一个用于模拟器和一个用于设备似乎有点奇怪
  • 您可以只使用两个目标(一个用于模拟器,另一个用于设备)。
  • @rock88 这就是我现在正在做的事情。
  • @Scriptable 这是google提供的用于视频加解密的框架。他们不提供任何文件。他们提供了一个示例应用程序,该应用程序使用两个不同的目标设备和 sim。
  • @abhi1992 这很可能是您最好的解决方案。我想不出任何其他方式,如果谷歌知道他们会在示例项目中使用它

标签: ios iphone swift xcode simulator


【解决方案1】:

我使用运行 shell 脚本的框架的聚合构建目标来执行此操作。该脚本使用 xcodebuild 为 sim 和设备创建一个框架,然后使用 lipo 将它们组合成一个框架,该框架可以包含在任何项目中,并且可以在两个平台上工作。这是一个简化版:

#!/bin/sh

BASE_BUILD_DIR=${BUILD_DIR}
FRAMEWORK_NAME="FrameworkName"
PROJECT_NAME="Framework"
CONFIG=$CONFIGURATION
UNIVERSAL_OUTPUTFOLDER="Build/${CONFIG}-universal"


# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"

# Step 1. Build Device and Simulator versions
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIG} -sdk iphoneos ONLY_ACTIVE_ARCH=NO  BUILD_DIR="${BASE_BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIG} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BASE_BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

# Step 2. Copy the framework structure (from iphoneos build) to the universal folder
echo "copying device framework"
cp -R "${BASE_BUILD_DIR}/${CONFIG}-iphoneos/${FRAMEWORK_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"

# Step 3. Copy Swift modules (from iphonesimulator build) to the copied framework directory
echo "integrating sim framework"
cp -R "${BASE_BUILD_DIR}/${CONFIG}-iphonesimulator/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule/" "${UNIVERSAL_OUTPUTFOLDER}/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule/"

# Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory
echo "lipo'ing files"
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${BASE_BUILD_DIR}/${CONFIG}-iphonesimulator/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${BASE_BUILD_DIR}/${CONFIG}-iphoneos/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}"

# Step 5. Convenience step to copy the framework to the project's directory
mkdir -p "${PROJECT_DIR}/iOS Framework/"
rm -rf "${PROJECT_DIR}/iOS Framework/${FRAMEWORK_NAME}.framework"
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${FRAMEWORK_NAME}.framework" "${PROJECT_DIR}/iOS Framework"

【讨论】:

  • 这是google提供的用于视频加解密的框架。我没有这个框架的源代码。你的脚本只有在你有框架的源代码的情况下才能工作吗?
  • 对于这个特定的解决方案,是的。但是,您可以直接使用 lipo 将 sim 和 device 框架组合到一个文件中,然后使用它(参见上面的步骤 4)
猜你喜欢
  • 2018-07-01
  • 2020-02-27
  • 2012-01-10
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多