时隔两年CoreTelephony库又坑了
时隔两年苹果又坑了,还是那个熟悉的CoreTelephony库,还是那个熟悉的CTTelephonyNetworkInfo.h
,还是那个熟悉的available标错导致的崩溃。
两年前
因为我在公司是负责基础模块的,所以网络相关的蜂窝网络类型判断是我来处理的。
两年前,苹果第一次做双卡手机,经验不成熟,所以出了不少问题。我们当然是只能选择原谅他,然后自己背锅啦。不然呢?我们还能硬刚苹果或者逼用户升级不成?
当初和双卡相关的API,都被标记成了API_AVAILABLE(ios(12.0)
,但是其实这些函数都是在iOS 12.1才实现的。在iOS 12.0里要么就是函数直接没有实现,要么是函数返回nil
。好在只是导致一些功能逻辑上的问题,并不会导致用户用不了app。在后来版本的app里我们只能对这些函数又做了一层保护,以防调用出什么奇怪的逻辑。
但是有一个常量就坑了:
1 | CORETELEPHONY_EXTERN NSString * const CTServiceRadioAccessTechnologyDidChangeNotification API_AVAILABLE(ios(12.0), watchos(5.0)) API_UNAVAILABLE(macos, tvos); |
毕竟常量可没有办法用respondsToSelector:
包一层,在iOS 12.0只要使用这个常量,就会导致iOS 12.0的用户崩成🐴 ……
被苹果教育过的我们,给使用这个常量的地方都包上了if (@available(iOS 12.1, *)) {}
,并且加上的长长的注释说明这个常量在iOS 12.1才能调用😭 。
iPhone 12 & 5G
iPhone 12终于支持5G了,用户反馈app没有正确的识别5G,当然是要尽快处理用户的问题啦。
扫了眼CTTelephonyNetworkInfo.h
果然发现有新的网络制式(下图为Xcode 12.1):
果断给加上对应判断,拿台iPhone 12配合5G测试一下,完美无瑕!
然后,然后研发和灰度用户们就崩成🐴 了……看了眼崩溃的人都是iOS 14.0用户,这时我才想起两年前被苹果支配的恐惧😂 。
赶紧去官网看了一眼,官网文档里甚至都还没有出现对应的网络制式枚举的说明:
然后又拿了份Xcode 12.0,看了看里面的CTTelephonyNetworkInfo.h
:
我了个去,坑爹呢这是,果然是Xcode 12.0还没有的枚举,肯定又是一样的问题。
拿实机验证了下,果然iOS 14.0其实并不存在对应的常量,调用了就会直接崩溃,和当初一模一样,熟悉的配方熟悉的味道。
叹着气流着泪,我们又多了一行if (@available(iOS 14.1, *)) {}
和一串长长的注释,希望大家看着这篇文章引以为戒,不要相信苹果的沙雕available标记。
补充
2年前的文档错误苹果看来是不打算修了,这一次的API标记错误我们也向苹果反馈了,看看苹果会不会处理下,避免广大开发者踩坑吧。
愿苹果开发者和用户能有一个美好的未来~
2天后
又想起来一个事情要补充一下,因为今年的iOS 14.2 beta和iOS 14.0发布时间是有重叠的,所以貌似iOS 14.2的前几个beta是没有对应常量的。
从官方文档来看,iOS 14.2 beta 3才开始有对应的常量:
但是我们的兼容代码只能写if (@available(iOS 14.1, *)) {}
,所以想必还停留在iOS 14.2 beta 2的用户也炸了吧……
苹果的beta是真的不能用,还望大家珍重,早日升级系统新版本~