我有一个我创建的
xcode框架项目,我可以编译成一个myframework.framework文件.编译之后,我将这个框架拖到我应用程序的Frameworks项目文件夹中,然后利用框架中的类,将适当的import语句添加到需要它的任何类;这允许我的应用程序成功编译与在框架中定义的类的引用.要使应用程序成功部署到我的设备,我还将我的自定义框架添加到我的目标的“嵌入式二进制文件”部分.有了这一切,我可以从xcode构建我的应用程序,并在我的设备上运行它.
当我尝试存档我的应用程序商店的应用程序时,我的问题出现.当我尝试这样做时,我会收到大量编译器错误,其中xcode表示它无法找到我自定义框架中定义的任何类的声明.
如何在xcode中设置存档,以便正确引用和嵌入我的自定义框架?
解决方法
您实际上不需要将其放在“嵌入式二进制文件”部分中.您只需要在“链接的框架和库”部分中.确保您的框架是通用框架(意味着可以为所有体系结构编译),并确保您具有正确的编译器标志集(-ObjC,如果您的框架有任何类别等)如果您的框架包含任何c代码,并且要在客户端应用程序中启用位代码,那么您可能还需要设置其他一些“Other C Flags”,您应该将“-fembed-bitcode”放在框架其他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
一旦你的框架在桌面上,如果你进入它的内部,就会有一个与你的框架名称相同的文本文档.如果您导航到它,并在终端上运行命令“lipo -info”,您应该得到以下输出:
Architectures in the fat file: MyFramework are: armv7 armv7s i386 x86_64 arm64