Поддержка нескольких версий iOS в статической библиотеке

Мы поддерживаем ряд статических библиотек, ориентированных на iOS 7, и в рамках предстоящего выпуска iOS 8 было бы хорошо иметь возможность поддерживать некоторые из новых функций в таких вещах, как Core Data и Core Location.

Является единственным вариантом для создания двух версий библиотеки, одной для iOS 7 и другой для iOS 8, или есть способ поддержки обеих в одной и той же библиотеке.

Было бы хорошо добраться до точки, где, если приложение, использующее библиотеку, нацелено на iOS 8, тогда становятся доступны дополнительные функции, а если вы нацеливаетесь на iOS 7, то вы просто получаете текущие функции.

2 ответа

Я не вижу, что вы можете сделать это автоматически, поскольку во время компоновки вы не знаете, на каком оборудовании будет работать образ.

Вы можете использовать рисунок фасада. Когда вы поймете, что конкретный метод может быть реализован по-разному в зависимости от iOS, создайте две версии и позвольте фасаду перевести метод к соответствующей версии.

Самый чистый способ сделать это с помощью методов выполнения Objective C. Вам нужно получить руководство по выполнению задач c от Apple. То, на что вы хотите посмотреть, это метод swizzling, например, setImplementation. Каждый раз, когда вы создаете экземпляр объекта интерфейса, вы можете запускать методы, зависящие от версии os, и устанавливать соответствующие реализации.

Вот один из подходов. Я не использовал его внутри библиотеки, но не могу понять, почему он там не работает:

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+.

Другие вопросы по тегам