Использование нового iOS 10 API в скомпилированном фреймворке под XCode 7

#ios #xcode #compilation #compatibility

#iOS #xcode #Сборник #совместимость

Вопрос:

Моя компания разрабатывает iOS SDK, который использует новые API CallKit. 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
  

Есть ли у вас способ использовать SDK, скомпилированный с iOS 10 API , работающий под управлением XCode 7 ?

Редактировать

Найдите способ справиться с этим. Идея состоит в том, чтобы лениво загрузить 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
    }
  

Ответ №1:

CallKit доступен с iOS 10 и более поздних версий. Xcode 7 поддерживает только iOS 9. Если вам нужно использовать этот фреймворк, вам необходимо обновить до последней версии Xcode (очевидно, Xcode8), который поддерживает iOS 10.

Таким образом, пользователи, у которых установлена только iOS 10, могут использовать эту функцию, а не iOS 9.

Комментарии:

1. Я знаю это, возможно, я плохо объяснил проблему. Фреймворк уже скомпилирован под XCode 8 (статическая библиотека .a). Но наши клиенты, которые интегрируют наш SDK (все еще скомпилированный под XCode 8), используют XCode 7. Первым решением было бы скомпилировать 2 фреймворка, один для iOS 10 и один для iOS 9. Но это не идеально, я хотел бы знать, могу ли я добавить некоторые макросы перед сборкой нашего SDK.- чтобы избежать генерации двух статических библиотек.