向下兼容的必要性:
由于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的全新教程,欢迎大家来捧捧场: