【问题标题】:Supporting multiple versions of iOS in a static library在静态库中支持多个版本的 iOS
【发布时间】:2014-09-12 11:59:03
【问题描述】:
我们维护了一些针对 iOS 7 的静态库,作为即将发布的 iOS 8 的一部分,如果能够支持 Core Data 和 Core Location 等一些新功能,那就太好了。
是生成两个版本库的唯一选项,一个针对 iOS 7,一个针对 iOS 8,或者是否有办法在同一个库中同时支持这两个版本。
如果使用该库的应用程序以 iOS 8 为目标,则可以使用额外的功能,如果您以 iOS 7 为目标,那么您只需获得当前功能。
【问题讨论】:
标签:
ios
objective-c
static-libraries
ios8
ios-frameworks
【解决方案1】:
这是一种方法。我没有在图书馆中使用过它,但我想不出它为什么在那里不起作用:
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+ 运行时检查。
【解决方案2】:
我看不到您可以自动执行此操作,因为在链接时,您不知道图像将在什么硬件上运行。
您可以使用外观模式。当你意识到一个特定的方法可以根据 iOS 以不同的方式实现时,创建你的两个版本并让外观将方法转发到适当的版本。
最简洁的方法是使用 Objective C 运行时方法。您需要从 Apple 获取 Objective C 运行时指南。你想看的东西是方法调配,例如集实施。每次实例化接口对象时,都可以通过操作系统版本依赖的方法运行,并设置相应的实现。