如何创建只在编译时出现的链接和使用的库/框架

时间:2015-03-03 11:36:45

标签: ios ios6

我有兴趣复制您在Apple框架中看到的那种功能:应用程序可以在更新版本的iOS上利用新框架,但在它们丢失时不会失败

当然,如果有另一种解决问题的方法,我很乐意看到它。


我所处的位置如下:

Company-A向第三方提供了一个iOS框架(以下称为FrameA),可以链接到他们的应用程序。

我的任务是创建一个可以"用螺栓连接的可选模块。到FrameA,但实际上并不是它的一部分(这是由于FrameA经常针对不同的客户和其他业务限制进行更新和定制)。

第三方可以选择使用bolt-on库(或框架,或任何可行的)。如果存在,FrameA必须链接它并且代码执行它的功能。如果它不存在,那么FrameA就像现在一样继续。它必须适用于接收新版本FrameA而不是bolt-on库的第三方。 我应该尽可能少地对FrameA进行更改,因为这些更改必须由另一个团队继续进行。

我还需要在Apples提交规则中执行此操作,解决方案必须至少支持iOS6,7和8.因此不允许动态链接。 Company-A直接向第三方提供FrameA,因此Apple必须批准的唯一部分是最终应用程序。

1 个答案:

答案 0 :(得分:1)

我已经做过小规模的这种事情,而且还不错。

在FrameA中,使用工厂实例化所有螺栓固定对象。工厂使用NSClassFromString()来动态获取类。避免使用类方法:这会使事情变得更难。只要有可能,使用协议而不是类:这会使事情变得更容易。

- (id<FABoltOnProtocol>)createBoltOnClass
{
    return [[NSClassFromString(@"BOBoltOnClass") alloc] init];
}

即使BOBoltOnClass未链接到最终应用,此代码也会运行。 NSClassFromString(@"BOBoltOnClass")将返回Nil[Nil alloc]返回nil[nil init]返回nil

你可以用同样的方法测试螺栓固定的存在。

BOOL MyHasBoltOn
{
    return NSClassFromString(@"BOBoltOnClass") != Nil;
}

缺点是FrameA必须使用bolt-on的头文件进行编译。这就是我推荐的协议。这些协议可以由FrameA拥有,并且bolt-on将符合它(注意:我通过使用FrameA&#39的前缀FA和具有bolt-on的前缀BO的类命名协议来暗示这一点。) / p>

最后,作为一个字符串,你可以阅读@&#34; BOBoltOnClass&#34;从配置文件中,您可以根据需要交换不同的螺栓。

请注意必须设置构建标志-ObjC,否则编译器将不会为bolt-on类加载符号,因为它们不会按常规调用。