Определение доступности WebKit

На OS X v10.2, платформа WebKit и Загрузочная система URL только доступно в системах, установивших Safari 1.0. Эта статья объясняет, как Мужественное приложение, которые используют платформу WebKit или Загрузочную систему URL, может работать эффективно на версиях OS X, которым не устанавливали Safari 1.0.

Если пользователь запустит Ваше приложение в системе, которой не устанавливали надлежащие платформы, то оно не запустится, или откажет в некоторый момент во время выполнения. Для предотвращения этого, необходимо принять некоторые меры предосторожности в проекте.

Тестирование на доступность загрузочной системы URL

Загрузочная система URL доступна с версии 462.6 платформы Основы. Чтобы определить, доступны ли классы, можно протестировать NSFoundationVersionNumber из установленной платформы Основы.

Пример кода в Перечислении 1 возвратится YES если Загрузочная система URL доступна.

Перечисление 1  , Определяющее, доступна ли Загрузочная система URL.

+ (BOOL)isURLLoadingAvailable
{
    return (NSFoundationVersionNumber >= 462.6);
}

Тестирование на доступность WebKit

Приложение может протестировать на доступность WebKit путем попытки создать пакет для платформы с помощью NSBundle. Если платформа существует, приложение может использовать load метод для динамичной загрузки платформы.

Пример кода в Перечислении 2 возвратится YES если платформа установлена и загружается успешно.

Перечисление 2  , Определяющее, доступна ли платформа WebKit

+ (BOOL)isWebKitAvailable
{
    static BOOL _webkitAvailable=NO;
    static BOOL _initialized=NO;
 
    if (_initialized)
        return _webkitAvailable;
 
    NSBundle* webKitBundle;
    webKitBundle = [NSBundle bundleWithPath:@"/System/Library/Frameworks/WebKit.framework"];
    if (webKitBundle) {
        _webkitAvailable = [webKitBundle load];
    }
    _initialized=YES;
 
    return _webkitAvailable;
}

Изоляция WebKit и символов загрузочной системы URL

Просто тестирование версии платформы Основы или если платформа WebKit установлена, не достаточно. Если приложение содержит WebKit или символы Загрузочной системы URL, это может перестать работать, прежде чем это будет в состоянии выполнить тестовый код и сообщить пользователю проблемы.

Приложение должно гарантировать, что основной пакет не включает символов, которые могут не быть доступными в запуске.

Условно загружающийся код

Одно решение состоит в том, чтобы разделить Ваш зависимый код WebKit на пакет и загрузить его только после определения, что платформа доступна.

Вы запускаете путем создания новой цели Пакета в проекте XCode приложения. Эта цель должна содержать весь Ваш код, который непосредственно ссылки, которые классы WebKit, глобальные переменные и типы и должны быть установлены соединить против WebKit.framework.

Ваша цель главного приложения в Разработчике Проекта должна указать, что это зависит от пакета, и скопируйте его в каталог приложения во время компиляции. Ваше приложение тогда проверяет наличие платформы WebKit и если есть использование NSBundle или CFBundle динамично загрузить код.

Слабое соединение символов

OS X v10.2 представил поддержку слабого соединения в Мужественных приложениях. Это работает подобным образом к слабому, или мягкому импорту менеджера Фрагмента Кода традиционного Mac OS.

Техническое примечание, “Гарантирующее Назад Совместимость на уровне двоичных кодов - Слабые Макросы Соединения и Доступности на OS X”, описывает текущую поддержку слабого соединения символов Углерода. В настоящее время тот же уровень поддержки не доступен для классов Objective C.

Вследствие динамического характера Objective C возможно избегать использования соединенных символов для имен классов путем создания экземпляра класса с помощью NSClassFromString() функция.

Class webDownloadClass=NSClassFromString(@"WebDownload");
WebDownload *download=[[webDownloadClass alloc] initWithRequest:theRequest
                                                delegate:self];

Это эквивалентно следующему коду, явно использующему WebDownload класс.

WebDownload *download=[[WebDownload alloc] initWithRequest:theRequest
                                                     delegate:self];

В зависимости от Вашего использования может также быть необходимо динамично загрузить константы WebKit с помощью CFBundle после определения, что платформа доступна. Пример кода в Перечислении 3 демонстрирует тестирование на платформу и загрузку WebKit постоянное использование CFBundle.

Перечисление 3  , Загружающееся константы WebKit динамично с помощью CFBundle

 CFURLRef url = CFURLCreateWithFileSystemPath(NULL,
                          CFSTR("/System/Library/Frameworks/WebKit.framework"),
                          kCFURLPOSIXPathStyle, TRUE);
    CFBundleRef bundle = CFBundleCreate(NULL, url);
    if (bundle != NULL) {
        NSString **WebHistoryItemsAddedNotificationPointer =
              (NSString **)CFBundleGetDataPointerForName(bundle,
                                 CFSTR("WebHistoryItemsAddedNotification"));
        if (WebHistoryItemsAddedNotificationPointer != NULL) {
            NSLog(@"looked up WebHistoryItemsAddedNotification");
            NSLog(@"location is %x, value is %@", *WebHistoryItemsAddedNotificationPointer, *WebHistoryItemsAddedNotificationPointer);
        } else {
            NSLog(@"found WebKit, but couldn't get the pointer");
        }
    } else {
        NSLog(@"no WebKit installed");
    }

См. Также: Техническое примечание TN2064 - Гарантирующий назад совместимость - Слабые Макросы Соединения и Доступности в OS X v10.2