如何在另一个框架(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,我设法使其工作!

以下是我所做的:

  1. 在伞框架项目中添加embedded式框架头文件。
  2. 在伞头添加: import“EmbeddedFramework.h”
  3. 然后导入伞框架到所需的项目,你不会得到更多的错误

你会看到,伞框架“Headers”文件夹将包含“EmbeddedFramework.h”文件

您可以在这里看到一个示例项目:

  • 伞框架: https : //github.com/AdrianaPineda/FrameworkGOMobileSample
  • 示例应用程序: https : //github.com/AdrianaPineda/iOSGOMobileSampleApp

希望这可以帮助