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

时间:2014-09-12 11:59:04

标签: ios objective-c static-libraries ios8 ios-frameworks

我们维护了许多针对iOS 7的静态库,作为即将发布的iOS 8版本的一部分,能够支持核心数据和核心位置等部分新功能将会很有用。

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

如果使用该库的应用程序定位到iOS 8,那么可以使用额外的功能,如果您的目标是iOS 7,那么您只需获得当前的功能就可以了。

2 个答案:

答案 0 :(得分:0)

这是一种方法。我没有在图书馆内使用它,但我想不出为什么它不会在那里工作:

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+运行时检查。

答案 1 :(得分:0)

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

您可以使用立面图案。当您意识到某个特定方法可以根据iOS进行不同的实现时,请创建两个版本,然后让该方法将该方法转发到适当的版本。

最简洁的方法是使用Objective C运行时方法。您需要从Apple获得目标c运行时指南。你想看的东西是方法调整,例如setImplementation。每次实例化一个接口对象时,都可以运行与os版本相关的方法并设置相应的实现。