Ios 如何在另一个框架内添加框架(伞形框架)
我已经使用构建了一个框架 我还得到了框架 我试图在我的内部实现第二个框架,根据我在苹果文档中读到的内容,生成的框架被称为“伞形框架” 我使用拖放功能在框架中添加了第二个框架,并验证它是否位于“链接二进制库”中 在我尝试在我的框架的一个类中进行下一次导入之后:Ios 如何在另一个框架内添加框架(伞形框架),ios,frameworks,Ios,Frameworks,我已经使用构建了一个框架 我还得到了框架 我试图在我的内部实现第二个框架,根据我在苹果文档中读到的内容,生成的框架被称为“伞形框架” 我使用拖放功能在框架中添加了第二个框架,并验证它是否位于“链接二进制库”中 在我尝试在我的框架的一个类中进行下一次导入之后: #import <CrashReporter/CrashReporter.h> #导入 我收到一个错误,因为导入的框架不可见 我还看到了stackoverflow post: 更新 是否有人试图提取iOS的PLCrashR
#import <CrashReporter/CrashReporter.h>
#导入
我收到一个错误,因为导入的框架不可见
我还看到了stackoverflow post:
更新
是否有人试图提取iOS的PLCrashReporter类并将其集成到项目中
您可以找到我的尝试。分发另一个框架的诱惑是可以理解的,但非常不鼓励。我将尝试解释为什么会这样(用论点),并提供一些对您的案例有帮助的很好的替代方案 伞形框架是供使用的,只有当您是这两个框架的分发者时,您才能完全控制它们,并且它们将一起分发 关于这个话题,苹果公司有一句流行的话,他们说他们不鼓励伞形框架 不要创建伞式框架 虽然可以使用Xcode创建伞形框架,但是 因此,对于大多数开发人员来说,这是不必要的,不推荐使用。苹果 使用伞形框架来掩盖 操作系统中的库。在几乎所有情况下,你都应该 能够将代码包含在单个标准框架包中。 或者,如果您的代码足够模块化,您可以创建 多个框架,但在这种情况下 模块将是最小的或不存在的,并且不应保证 为他们创造一把伞 首先,这里是大多数开发人员在这种情况下所做的,因为有许多框架依赖于其他框架 通知用户您的框架需要使用另一个第三方框架。这是完全标准的,在大多数情况下是预期的。然后在系统级链接到它。就这么简单。您的框架将找到第三方并正常运行,就像使用本机框架一样。以
UIKit
为例。要链接到第三方,请遵循下一节中的步骤。这当然可以用标准的方式完成,但是使用CocoaPods这样的工具会使项目更容易维护
要完全回答您的问题,请使用为您添加第三方框架,而不是以通常的方式添加第三方框架,因为您可能会遇到问题和复杂情况。通过这种方式,您消除了可能出现的问题,并且还获得了CocoaPods为您提供所需第三方的确切版本的额外好处
这是一个名为“CrashTest”的应用程序的CocoaPods播客文件
只是澄清一下,当您开发框架时,它仍然会添加到您的项目中并可见。这里最大的区别是,它将与您的框架分开分发,最终用户必须将这两个组件都添加到他们的项目中,才能使它们正常工作
以下是这样做的原因
例如,您希望在框架中包括PLCrashReporter
。假设另一个框架供应商也希望将其包括在他们的框架中。使用这两个框架的应用程序将包含两次PLCrashReporter
(作为每个伞形框架的一部分)。甚至可能是它的不同版本。这可能导致用户应用程序内部出现严重问题。如前一节所述,如果两个伞形框架都链接到PLCrashReporter,则完全可以避免此问题
我在上面提到的另一点是版本控制。分发伞式框架时,您需要能够控制所有相关框架的版本,并且您无法控制第三方框架。这将再次导致与上述问题类似的问题
我知道这种方法并不能直接回答这个问题,但它试图阻止一种不好的做法,同时指出了行业标准的做法。苹果公司不鼓励你创建一个伞形框架,但仍然说它是可能的,所以我将重点关注如何实际做到这一点 我必须提到,如果您控制一个或多个框架,那么将它们捆绑到一个框架中并不是一个坏主意,可以帮助最终开发人员 现在在最新的Xcode(7及以上)上创建伞式框架非常简单 下面是如何做到这一点 首先创建一个框架:
#import <CrashReporter/CrashReporter.h>
将CrashReporter.framework
拖动到伞形框架项目:
确保两个框架都正常工作的示例代码:
雨伞。h:
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@interface Umbrella : NSObject
+(void)sayHelloFromUmbrella;
@end
#import "Umbrella.h"
#import <CrashReporter/CrashReporter.h>
@implementation Umbrella
+(void)sayHelloFromUmbrella
{
NSLog(@"Hey from Umbrella");
PLCrashReporter *crashObject = [[PLCrashReporter alloc]initWithConfiguration:nil];
NSLog(@"crashObject: %@",crashObject);
}
@end
将输出以下内容:
Hey from Umbrella
crashObject: <PLCrashReporter: 0x7fb441d5c650>
嘿,雨伞
crashObject:
这告诉我们两个框架都在工作。我试着按照@Segev的建议去做,但我一直收到一个错误,即嵌入的框架文件丢失了 然而,做一些额外的配置,我设法使它工作 以下是我所做的:
- 总括框架:
- 示例应用程序:
希望这有帮助这里有一个演示项目: 所有答案都在这一行下
Hey from Umbrella
crashObject: <PLCrashReporter: 0x7fb441d5c650>
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
BUNDLE_IN_ROOT="$APP_PATH/${FRAMEWORK_EXECUTABLE_NAME}.bundle"
if [[ -e "$FRAMEWORK_EXECUTABLE_PATH" ]]; then
FRAMEWORK_MACH_O="$(otool -a "$FRAMEWORK_EXECUTABLE_PATH" | head -n 1)"
FRAMEWORK_FAT_ARCH="$(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")"
else
FRAMEWORK_MACH_O="NO EXIST"
FRAMEWORK_FAT_ARCH="NO EXIST"
fi
echo "FRAMEWORK_EXECUTABLE_NAME is $FRAMEWORK_EXECUTABLE_NAME"
echo "FRAMEWORK_EXECUTABLE_PATH is $FRAMEWORK_EXECUTABLE_PATH"
echo "FRAMEWORK_MACH_O is $FRAMEWORK_MACH_O"
echo "FRAMEWORK_FAT_ARCH is $FRAMEWORK_FAT_ARCH"
echo "BUNDLE_IN_ROOT is $BUNDLE_IN_ROOT"
if [[ "$FRAMEWORK_MACH_O" =~ "Archive :" ]]; then
echo "Rmove Static-Mach-O is $FRAMEWORK_EXECUTABLE_PATH"
rm "$FRAMEWORK_EXECUTABLE_PATH"
defaults write "$FRAMEWORK/Info.plist" CFBundlePackageType "BNDL"
defaults delete "$FRAMEWORK/Info.plist" CFBundleExecutable
if [[ -d "$BUNDLE_IN_ROOT" ]]; then
rm -rf "$BUNDLE_IN_ROOT"
fi
mv -f "$FRAMEWORK" "$BUNDLE_IN_ROOT"
elif [[ "$FRAMEWORK_FAT_ARCH" =~ "Architectures in the fat file" ]]; then
#statements
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
fi
done