时隔两年苹果又坑了,还是那个熟悉的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):

30-154955

果断给加上对应判断,拿台iPhone 12配合5G测试一下,完美无瑕!

然后,然后研发和灰度用户们就崩成🐴 了……看了眼崩溃的人都是iOS 14.0用户,这时我才想起两年前被苹果支配的恐惧😂 。

赶紧去官网看了一眼,官网文档里甚至都还没有出现对应的网络制式枚举的说明:

30-180036

然后又拿了份Xcode 12.0,看了看里面的CTTelephonyNetworkInfo.h

30-154144

我了个去,坑爹呢这是,果然是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才开始有对应的常量:

31-113519

但是我们的兼容代码只能写if (@available(iOS 14.1, *)) {},所以想必还停留在iOS 14.2 beta 2的用户也炸了吧……

苹果的beta是真的不能用,还望大家珍重,早日升级系统新版本~