我有一个我创建的xcode框架项目,我可以编译成一个myframework.framework文件.编译之后,我将这个框架拖到我的应用程序的Frameworks项目文件夹中,然后利用框架中的类我将适当的import语句添加到需要它的任何类中; 这允许我的应用程序成功编译,引用框架中定义的类.为了让应用程序成功部署到我的设备,我还将我的自定义框架添加到我的目标的"嵌入式二进制文件"部分.有了这一切,我可以从xcode构建我的应用程序并在我的设备上运行它.
当我尝试存档应用程序商店的应用程序时出现问题.当我尝试这样做时,我得到了大量的编译器错误,其中xcode表示无法找到我的自定义框架中定义的任何类的声明.
如何在xcode中设置Archive以便正确引用和嵌入我的自定义框架?
arc*_*all 24
实际上,您不需要将其放在"嵌入式二进制文件"部分中.您只需要在"链接的框架和库"部分中.确保您的框架是一个通用框架(意味着它可以为所有体系结构编译),并确保您设置了正确的编译器标志(-ObjC,如果您的框架有任何框架)类别等)如果你的框架包含任何c代码并且你想在你的客户端应用程序中启用bitcode然后你应该在你的"-fembed-bitcode"中放置你可能需要设置其他一些内容,例如"Other C Flags"框架其他C标志.这些是我需要做的事情才能将我的框架应用程序带到商店.我认为这只是一个误解,你需要把它放在嵌入式二进制文件中,以便将它存档到商店.
这是我用来生成通用框架的构建脚本.它构建在我的桌面上.如果你的框架在Swift中,你可以取消注释第8节.您希望创建聚合目标,并在构建阶段将其添加为运行脚本.
# Merge Script
# 1
# Set bash script to exit immediately if any commands fail.
set -e
# 2
# Setup some constants for use later on.
FRAMEWORK_NAME="MyFramework"
# 3
# If remnants from a previous build exist, delete them.
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi
# 4
# Build the framework for device and for simulator (using
# all needed architectures).
xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch arm64 -arch armv7 -arch armv7s only_active_arch=no defines_module=yes -sdk "iphoneos"
xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch x86_64 -arch i386 only_active_arch=no defines_module=yes -sdk "iphonesimulator"
# 5
# Remove .framework file if exists on Desktop from previous run.
if [ -d "${HOME}/Desktop/${FRAMEWORK_NAME}.framework" ]; then
rm -rf "${HOME}/Desktop/${FRAMEWORK_NAME}.framework"
fi
# 6
# Copy the device version of framework to Desktop.
cp -r "${SRCROOT}/build/Release-iphoneos/${FRAMEWORK_NAME}.framework" "${HOME}/Desktop/${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 "${HOME}/Desktop/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${SRCROOT}/build/Release-iphoneos/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${SRCROOT}/build/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 "${SRCROOT}/build/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule/" "${HOME}/Desktop/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule"
# 9
# Delete the most recent build.
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi
Run Code Online (Sandbox Code Playgroud)
一旦您的框架在桌面上,如果您进入其中,将会有一个与您的框架同名的文本文档.如果你导航到那个并在终端上运行命令"lipo -info",你应该得到以下输出:
Architectures in the fat file: MyFramework are: armv7 armv7s i386 x86_64 arm64
Run Code Online (Sandbox Code Playgroud)
J.W*_*ang 10
不确定现有的答案是否对您有所帮助.我只是给出我的解决方案.首先,我想解释几个重要的构建阶段.
如果要在每次构建主机应用程序时重建自己的框架(链接到同一工作区).您需要在此处添加框架目标.
如果您想在代码中使用您的库(比如说您想这样做import MyFramework),那么您需要在此阶段将其链接起来.
这是棘手的部分.嵌入意味着在分发时将框架与您的应用程序捆绑在一起.对于系统框架,例如AVFoundation,您不需要将其嵌入到您的应用中,因为它已经存在于iOS操作系统中.但是,对于自定义框架或第三方框架,您必须将它们嵌入到应用程序包中,以便在设备上部署应用程序时,应用程序实际上可以找到它.这就是为什么如果你使用Cocoapods或者Carthage,他们都有一个额外的构建阶段来将框架复制到应用程序包.(因为Cocoapods,它被称为Embed Pods Framework,因为Carthage它是一个运行copy-frameworks脚本的动作)因此,对于您的自定义框架,您将使用现有的Embed Frameworks构建阶段或创建一个新的运行脚本阶段将框架复制到您的应用程序包.
- 关于2017-05-17的更新 -
对于嵌入框架的东西,我最近发现了另一个重要的事实:
您可以file PATH/TO/Framework用来检查框架是静态的还是动态的.请查看此stackoverflow问题以获取详细信息.
只需要将动态框架嵌入到应用程序中.这些包括由Carthage和创建的Cocoapods.如果在构建项目后打开应用程序包,则会有一个Frameworks包含所有嵌入式框架的文件夹,您将找到由Carthage和Cocoapods创建的文件夹以及您在Embed Framework阶段中指定的文件夹.
所以现在您可能想知道那些静态框架在哪里?如果应用程序包中缺少它,我们如何仍然使用它?你是对的.它们在捆绑中但不在Frameworks文件夹中.它们已合并到您的应用程序的可执行文件中.如果检查可执行文件的大小,每次向目标添加静态框架时都会意识到,它会增加.
静态框架不必嵌入(只是链接它们),它就像一个.swift或.xib将被编译到您的可执行文件中的文件.
然后,在使用任何框架之前还有一个步骤.该Framework Search Paths内部目标构建设置.同样,如果您查看Carthage或者Cocoapods,它们都会在此设置中添加额外的路径.这告诉Xcode(或底层编译器)在哪里找到这些链接或嵌入式框架.
因此,每当您想要使用框架时,请确保考虑上述设置,并且您已完成所有设置.我一直在使用这种方法,当遇到任何链接问题时我会感到更自信.
最后,Apple有一篇非常重要的文章你应该阅读https://developer.apple.com/library/content/technotes/tn2435/_index.html
| 归档时间: |
|
| 查看次数: |
5658 次 |
| 最近记录: |