在静态库中支持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版本相关的方法并设置适当的实现。