【问题标题】: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 运行时指南。你想看的东西是方法调配,例如集实施。每次实例化接口对象时,都可以通过操作系统版本依赖的方法运行,并设置相应的实现。

      【讨论】:

        猜你喜欢
        • 2015-05-26
        • 2017-02-01
        • 2019-05-19
        • 2012-12-02
        • 1970-01-01
        • 2015-01-22
        • 1970-01-01
        • 1970-01-01
        • 2019-07-19
        相关资源
        最近更新 更多