处理不推荐使用的API的正确方法

时间:2019-01-14 20:36:11

标签: ios objective-c deprecated

有一个Obj-C文件,该文件包含在具有不同部署目标的多个项目中。该文件具有以下代码行:

[[UIApplication sharedApplication] openURL:url];

当我编译针对iOS 10的项目时,出现警告:

  

'openURL:'已被弃用:iOS 10.0中首次弃用-请改用openURL:options:completionHandler:

我尝试通过以下结构对其进行修复:

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 :(得分:4)

如果您的目标是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或更高版本的Deployment Target的项目中构建时,编译后的代码将变成:

[[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];
}