处理弃用 API 的正确方法
Correct way to handle deprecated API
有一个 Obj-C 文件包含在具有不同部署目标的多个项目中。此文件具有以下代码行:
[[UIApplication sharedApplication] openURL:url];
当我编译目标为 iOS 10 的项目时,我收到警告:
'openURL:' is deprecated: first deprecated in iOS 10.0 - Please use openURL:options:completionHandler: instead
我尝试用以下结构修复它:
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
}
所以我想知道我是否真的需要这样一个丑陋的代码,或者我是否遗漏了一些东西,并且这种情况可以用另一种(更优雅的)方式处理?
如果您的目标是 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:@{}
当代码构建在 Deployment Target 早于 iOS 10.0 的项目中时,编译后的代码将是:
if (@available(iOS 10.0, *)) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
[[UIApplication sharedApplication] openURL:url];
}
有一个 Obj-C 文件包含在具有不同部署目标的多个项目中。此文件具有以下代码行:
[[UIApplication sharedApplication] openURL:url];
当我编译目标为 iOS 10 的项目时,我收到警告:
'openURL:' is deprecated: first deprecated in iOS 10.0 - Please use openURL:options:completionHandler: instead
我尝试用以下结构修复它:
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
}
所以我想知道我是否真的需要这样一个丑陋的代码,或者我是否遗漏了一些东西,并且这种情况可以用另一种(更优雅的)方式处理?
如果您的目标是 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:@{}
当代码构建在 Deployment Target 早于 iOS 10.0 的项目中时,编译后的代码将是:
if (@available(iOS 10.0, *)) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
[[UIApplication sharedApplication] openURL:url];
}