12

时隔两年CoreTelephony库又坑了

 3 years ago
source link: http://blog.harrisonxi.com/2020/10/%E6%97%B6%E9%9A%94%E4%B8%A4%E5%B9%B4CoreTelephony%E5%BA%93%E5%8F%88%E5%9D%91%E4%BA%86.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

时隔两年CoreTelephony库又坑了

那些标错了available版本的系统API
2020-10-30iOS

时隔两年苹果又坑了,还是那个熟悉的CoreTelephony库,还是那个熟悉的CTTelephonyNetworkInfo.h,还是那个熟悉的available标错导致的崩溃。

因为我在公司是负责基础模块的,所以网络相关的蜂窝网络类型判断是我来处理的。

两年前,苹果第一次做双卡手机,经验不成熟,所以出了不少问题。我们当然是只能选择原谅他,然后自己背锅啦。不然呢?我们还能硬刚苹果或者逼用户升级不成?

当初和双卡相关的API,都被标记成了API_AVAILABLE(ios(12.0),但是其实这些函数都是在iOS 12.1才实现的。在iOS 12.0里要么就是函数直接没有实现,要么是函数返回nil。好在只是导致一些功能逻辑上的问题,并不会导致用户用不了app。在后来版本的app里我们只能对这些函数又做了一层保护,以防调用出什么奇怪的逻辑。

但是有一个常量就坑了:

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标记错误我们也向苹果反馈了,看看苹果会不会处理下,避免广大开发者踩坑吧。

愿苹果开发者和用户能有一个美好的未来~

又想起来一个事情要补充一下,因为今年的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是真的不能用,还望大家珍重,早日升级系统新版本~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK