#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.- чтобы избежать генерации двух статических библиотек.