在静态库中支持iOS的多个版本

问题描述:

作为即将发布的iOS 8版本的一部分,我们维护了许多针对iOS 7的静态库,因此能够支持Core等一些新功能数据和核心位置。在静态库中支持iOS的多个版本

是生成库的两个版本的唯一选择,一个针对iOS 7,另一个针对iOS 8,或者有一种方法可以在同一个库中支持这两个版本。

这将是很好的获得到一个地步,如果使用该库的应用定位的是iOS 8的则额外的功能变得可用,如果你的目标的iOS 7,那么你只得到当前的功能..

这里的一种方法。我没有用它一个库中,但我想不出为什么它会在那里工作:

SEL registerUserNotificationSettings = NSSelectorFromString(@"registerUserNotificationSettings:"); 

// iOS 8 requires explicit permission from the user for local notifications 
if ([application respondsToSelector:registerUserNotificationSettings]) { 

    //Extra hack for the bit settings since we're building with a SDK that doesn't have the symbols 
    #define REQUIRED_SETTINGS 7 

    Class settingsClass = NSClassFromString(@"UIUserNotificationSettings"); 
    if (settingsClass) { 
     id settings = objc_msgSend(settingsClass, @selector(settingsForTypes:categories:), REQUIRED_SETTINGS, nil); 
     objc_msgSend(application, registerUserNotificationSettings, settings); 
    } 
} 

这是假定是正在修建跟iOS 7 SDK代码段内实现。 respondsToSelector:本质上是iOS 8+运行时检查。

我没有看到您可以自动执行此操作,因为在链接时,您不知道图像将运行在哪个硬件上。

您可以使用立面图案。当你意识到一个特定的方法可以根据iOS实现不同的时候,创建你的两个版本并让Facade将该方法转发到适当的版本。

最简单的方法是使用Objective C运行时方法。您需要从Apple获取客户端c运行时指南。你想看的东西是方法搅拌,例如setImplementation。每次实例化一个接口对象时,都可以运行os版本相关的方法并设置适当的实现。