Правильный способ обработки устаревшего API - PullRequest
0 голосов
/ 14 января 2019

Существует файл Obj-C, который входит в несколько проектов с разными целями развертывания. Этот файл имеет следующую кодовую строку:

[[UIApplication sharedApplication] openURL:url];

Когда я компилирую проект для iOS 10, я получаю предупреждение:

'openURL:' устарел: первый устарел в iOS 10.0 - используйте openURL: параметры: завершениеHandler: вместо

Я пытался исправить это с помощью следующей конструкции:

if (@available(iOS 10.0, *)) {
    [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
    [[UIApplication sharedApplication] openURL:url];
}

но все равно выдает то же предупреждение!

Я не хочу отключать это предупреждение глобально, поэтому то, чем я закончил, чудовищно

if (@available(iOS 10.0, *)) {
    [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated-declarations"
    [[UIApplication sharedApplication] openURL:url];
    #pragma clang diagnostic pop
}

Так что мне интересно, действительно ли мне нужен такой уродливый код, или, может быть, я что-то упустил, и такую ​​ситуацию можно было бы обработать другим (более изящным) способом?

1 Ответ

0 голосов
/ 15 января 2019

Если вы ориентируетесь на iOS 10 и более поздние версии, вам не нужно поддерживать устаревший API. Просто используйте новый.

Нет необходимости в if/else. Просто сделай:

[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];

Вот и все. Этот обновленный API был добавлен в iOS 10.0. Поскольку вы поддерживаете только iOS 10 и более поздние версии, нет необходимости пытаться использовать устаревший API.

Если этот код используется некоторыми проектами, поддерживающими iOS 10 и более поздние версии, а также некоторыми проектами, которые должны поддерживать что-то более старое, чем iOS 10, то вам нужно что-то вроде следующего:

#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0
    if (@available(iOS 10.0, *)) {
#endif
        [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0
    } else {
        [[UIApplication sharedApplication] openURL:url];
    }
#endif

Эффект этой директивы компилятора заключается в том, что при сборке проекта с целью развертывания iOS 10.0 или более поздней скомпилированный код просто становится:

[[UIApplication sharedApplication] openURL:url options:@{} 

Когда код встроен в проект с целью развертывания более ранней, чем iOS 10.0, скомпилированный код будет иметь вид:

if (@available(iOS 10.0, *)) {
    [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
    [[UIApplication sharedApplication] openURL:url];
}
...