如何在另一个框架(Umbrella Framework)中添加一个框架
我使用下面的教程构build了一个框架。
我也有这个框架。
我试图在我的内部实现第二个框架,从我在Apple文档中读取的结果框架被称为“Umbrella Framework”。
我使用拖放添加了框架中的第二个框架,并validation它位于“Link Binary With Libraries”中。
当我尝试在我的框架的一个类中进行下一个导入之后:
#import <CrashReporter/CrashReporter.h>
由于导入的框架不可见,我收到一个错误。
我也看到了stackoverflow后: 如何在iOS SDK中创build一个伞框架?
更新
有没有人试图提取iOS的PLCrashReporter类,并将其整合到一个项目中?
你可以在这里find我的尝试。
分配另外一个框架的诱惑是可以理解的,但是非常沮丧。 我会试着解释为什么(有争议),并提供一些很好的select,这将有助于你的情况。
Umbrella框架仅供您使用,只有当您是这两个框架的分销商时,您才能完全控制它们,并将它们一起分发。
苹果有一个关于这个话题的热门话题,那就是他们不鼓励伞式框架。
不要创build伞框架
尽pipe可以使用Xcode创build伞架,但对于大多数开发人员来说,这样做是不必要的,不build议使用。 苹果公司使用伞架来掩盖操作系统中的库之间的一些相互依赖关系。 几乎在所有情况下,您都应该能够将代码包含在一个标准的框架包中。 另外,如果你的代码是足够模块化的,你可以创build多个框架,但是在这种情况下,模块之间的依赖关系是最小的或不存在的,不应该为它们创build一个保护伞。
首先,这是大多数开发人员在这种情况下所做的,因为有许多依赖于其他的框架。
通知用户您的框架需要使用另一个第三方框架。 这在大多数情况下是完全标准的和预期的。 然后在系统级连接到它。 就这么简单。 你的框架会像使用一个本地框架一样发现第三方和function。 以UIKit
为例。 要链接到第三方,请按照下一节中的步骤操作。 它当然可以通过标准的方式来完成,但是使用像CocoaPods这样的工具会使你的项目更容易维护。
要完全回答你的问题 ,而不是通常的方式添加第三方框架,因为你可能遇到问题和复杂性,使用CocoaPods为您添加它。 这样,您可以消除可能出现的问题,还可以获得CocoaPods的额外好处,让您获得所需的第三方的确切版本。
这里是一个名为“CrashTest”的应用程序的CocoaPods Podfile
target 'CrashTest' do pod 'PLCrashReporter', '~> 1.2.0' end
只是为了澄清,当你正在开发框架,它仍然会被添加到你的项目和可见。 这里最大的区别是它将与你的框架分开分发,最终用户将不得不添加到他们的项目,以使事情工作。
这就是为什么这样做的原因。
例如,你想在你的框架中包含PLCrashReporter
。 假设另一个框架供应商也希望将其纳入其中。 使用这两个框架的应用程序将包含PLCrashReporter
两次(作为每个伞架的一部分)。 甚至可能不同的版本。 这可能会导致用户应用程序中的严重问题。 如果两个伞架都链接到PLCrashReporter,如上一节所述,完全可以避免这个问题。
另一点,我上面提到的是版本控制。 在发布伞架时,您需要能够控制所有涉及到的框架的版本,并且您无法控制第三方框架。 这又会导致类似上面所述的问题。
我知道这种方法不能直接回答这个问题,而是试图阻止一个不好的做法,同时指出行业标准的做事方式。
苹果不鼓励你创build一个伞框架,但仍然表示可以对其结构等进行一些描述,所以我将重点关注如何真正做到这一点。
我必须提到,如果你控制一个或多个框架,把它们捆绑成一个并不是一个坏主意,可以帮助最终的开发者。
现在在最近的Xcode(7及以上版本)上创build一个伞架非常简单,
以下是如何做到这一点。
首先创build一个框架:
将CrashReporter.framework
Umbrella框架项目中:
示例代码来确保这两个框架是function性的:
Umbrella.h:
#import <UIKit/UIKit.h> #import <Foundation/Foundation.h> @interface Umbrella : NSObject +(void)sayHelloFromUmbrella; @end
Umbrella.m:
#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
构build,你会得到你的生成文件夹中的Umbrella.framework
(包含CrashReporter.framework
)。
拖动Umbrella.framework
并将其放置在要使用它的项目中的“embedded式二进制文件”中:
然后只需导入您的完成的框架。
ViewController.m来自我们刚把Umbrella.framework拖到的项目:
#import "ViewController.h" #import <Umbrella/Umbrella.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [Umbrella sayHelloFromUmbrella]; }
哪个会输出这个:
Hey from Umbrella crashObject: <PLCrashReporter: 0x7fb441d5c650>
这告诉我们这两个框架正在工作。
我试着做@Segevbuild议的,但是我一直收到embedded式框架文件丢失的错误。
但是,做一些额外的configuration,我设法使其工作!
以下是我所做的:
- 在伞框架项目中添加embedded式框架头文件。
- 在伞头添加: import“EmbeddedFramework.h”
- 然后导入伞框架到所需的项目,你不会得到更多的错误
你会看到,伞框架“Headers”文件夹将包含“EmbeddedFramework.h”文件
您可以在这里看到一个示例项目:
- 伞框架: https : //github.com/AdrianaPineda/FrameworkGOMobileSample
- 示例应用程序: https : //github.com/AdrianaPineda/iOSGOMobileSampleApp
希望这可以帮助