有一个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
}
所以我想知道我是否真的需要一个如此丑陋的代码,或者我错过了一些东西,而这种情况本可以用另一种(更优美的方式)处理?
答案 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];
}