【问题标题】:Using new iOS 10 API in compiled framework under XCode 7在 XCode 7 下的编译框架中使用新的 iOS 10 API
【发布时间】:2016-10-20 12:05:56
【问题描述】:

我的公司正在开发一个 iOS SDK,它使用新的 CallKit API。 SDK (.framework) 使用 XCode 8 / SDK 10.0 编译。 但是,有些客户仍在使用 XCode 7 - 当我尝试将我们的 SDK 集成到 XCode 7 项目下时,出现以下错误:

ld: framework not found CallKit for architecture arm64

但是,我在 SDK 代码中添加了一些宏指令,以提供 CoreTelephony 回退,但是使用此技巧的事件,项目的目标无法使用上述消息进行编译。

这是指令示例:

#ifdef __IPHONE_10_0
@import CallKit;
#endif

在 XCode 7 下使用通过 iOS 10 API 编译的 SDK 有技巧吗?

编辑

找到一种方法来管理它。这个想法是延迟加载 CallKit(运行时)。我不得不调用 performSelector 而不是直接调用方法。

这是一些代码:

    // Lazy load CallKit framework to keep compatibility for XCode 7 SDK integration
    if ([[AppKit sharedInstance] systemVersion] >= kIosSystemVersion10) {
        NSBundle *b = [NSBundle bundleWithPath:@"/System/Library/Frameworks/CallKit.framework"];
        _isCallKitFrameworkLoaded = [b load];
    }

    if (_isCallKitFrameworkLoaded) {
        SEL callObserverDelegate = NSSelectorFromString(@"setDelegate:queue:");
        if ([_callObserver respondsToSelector:callObserverDelegate]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
            [_callObserver performSelector:callObserverDelegate withObject:self withObject:(__bridge id)(_callObserverQueue)];
#pragma clang diagnostic pop
        }
    } else {
        // CoreTelephony fallback
    }

【问题讨论】:

    标签: ios xcode compilation compatibility


    【解决方案1】:

    CallKit 适用于 iOS 10 及更高版本。 Xcode 7 仅支持 iOS 9。如果你需要使用这个框架,你需要更新到支持 iOS 10 的最新 Xcode(显然是 Xcode8)。

    所以iOS 10的用户只能使用这个功能,iOS 9不能使用。

    【讨论】:

    • 我知道,也许我没有很好地解释这个问题。该框架已经在 XCode 8(静态库 .a)下编译。但是我们集成了我们的 SDK(仍然在 XCode 8 下编译)的客户正在使用 XCode 7。第一个解决方案是编译 2 个框架,一个用于 iOS 10,一个用于 iOS 9。但这并不理想,我想知道我是否可以在构建我们的 SDK 之前放置一些宏。避免生成两个静态库。
    猜你喜欢
    • 2014-04-12
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2016-10-23
    相关资源
    最近更新 更多