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

在静态库中支持多个版本的iOS,ios,objective-c,static-libraries,ios8,ios-frameworks,Ios,Objective C,Static Libraries,Ios8,Ios Frameworks,我们维护了许多针对iOS 7的静态库,作为即将发布的iOS 8的一部分,能够支持核心数据和核心位置等方面的一些新功能将是一件好事 是生成两个版本的库的唯一选项,一个针对iOS 7,一个针对iOS 8,或者是否有办法在同一个库中同时支持这两个版本 如果使用库的应用程序的目标是iOS 8,那么额外的功能就可以使用,如果你的目标是iOS 7,那么你就可以获得当前的功能 这里有一种方法。我没有在图书馆里使用过它,但我想不出为什么它在那里不起作用: SEL registerUserNotification

我们维护了许多针对iOS 7的静态库,作为即将发布的iOS 8的一部分,能够支持核心数据和核心位置等方面的一些新功能将是一件好事

是生成两个版本的库的唯一选项,一个针对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构建的。
响应选择器:
本质上是一个iOS 8+运行时检查。

我看不出您可以自动执行此操作,因为在链接时,您不知道映像将在什么硬件上运行

您可以使用门面模式。当您意识到某个特定方法的实现可能会因iOS的不同而有所不同时,请创建两个版本,并让facade将该方法转发到相应的版本

最干净的方法是使用Objective C运行时方法。您需要从Apple获得objective c运行时指南。你想看的东西是方法转换,例如setImplementation。每次实例化接口对象时,都可以运行os版本相关的方法并设置适当的实现