Swift中的#available和@available--iOS、macOS等向下兼容的解决方案

4,059 阅读2分钟

向下兼容的必要性:

由于iOS、macOS的API一年更新一次,每次都会带来很多好用的新功能,但很多用户因为各种原因并没有升级到最新版,导致用最新功能的API制作的App无法在这些iPhone或Mac上使用(若强行使用会导致程序闪退)。

开发者们又想使用最新功能提高效率和App体验,又不想流失未升级版本的用户怎么办呢?

解决方案:

1.App中仅使用少量新功能的情况:

可以直接使用新功能框架自带的API,来判定当前iPhone或Mac是否支持

2.App中大量使用新功能框架的情况:

如下图右下角,我想让我的App能够面向iOS12版本以上的用户,就可以先把Xcode这里调成‘iOS12’:

之后编译一下,Xcode会自动判定哪些API不能兼容,并给出几个解决方案:

点击圆点:

给出两种方案:

1.#available---局部判断,用于ifelse,guard等,相当于返回bool值

if #available(iOS 13, *) {
    // 使用iOS13的新API
} else {
    // 使用旧API
}

原理:

#available(iOS 13, *)会检测当前用户的iOS版本是否大于等于iOS13,若大于等于返回true;

*表示将来可能出现的一切新平台(比如假设Apple在2030年将推出苹果机器人什么的),这个*一定要写

ps: guard的话这样用:

guard #available(iOS 13, *) else { return }

2.@available--整体判断,用于整个方法或整个class

@available(iOS 13, *)
func togglePeopleOcclusion() {
    // 使用iOS13的新API
}
@available(iOS 13.0, *)
class ViewController: UIViewController {
    // 使用iOS13的新API
}

原理同上。


以上两种方案的混合使用:
@available(iOS 12, *)
func iOS12Work() {
    // ...
    if #available(iOS 13, *) {
        iOS13Work()
    }
}

@available(iOS 13, *)
func iOS13Work() {
    // ...
}
随着iOS和macOS的逐渐整合,很多API已经慢慢可以共用了,所以也可以这样用:
@available(iOS 13, macOS 10.15, *)
func newMethod() {
    // 使用iOS13和macOS10.15的新共用API
}

以上

 

小弟最近上新了iOS13的全新教程,欢迎大家来捧捧场:

m.cctalk.com/inst/s9vfhe…