知乎日报

每日提供高质量新闻资讯

头图

听上去很有用的 iOS 10 来电自动识别,目前还很简陋

Yanki01 / CC BY

iOS 10 如何实现来电号码识别?

banyue,吃喝。运动。看闲书。

作为在中国的通讯安全行业奋战了多年的一名程序猿,我觉得我是很有资格来回答这个问题的,相信关注这个问题的大家都知道,在本届 WWDC 上苹果推出了 Call Kit ,Call Kit 是 iOS 10 十大新特性之一,其带来的一项重要的功能就是开放了来电识别功能。(根据苹果官方的说法是专门为了照顾中国用户而开放的,也由此可见苹果对中国市场的高度关注以及对中国骚扰电话的忧虑。)

但事实上我想说的是 iOS 10 来电识别的原理实际上非常简单(简陋)。

为什么说他简陋呢,让我来“言简意赅”的给大家说明一下,如下图中右侧所示,为 iOS 提供识别功能的第三方 App(例如搜狗号码通)只需(仅能)通过系统提供的接口,预先将号码和对应的识别结果写入系统内部的数据库中。来电时,系统会根据预设的号码进行识别,而第三方 App 则完全无法参与识别过程。根据苹果官方的说法,不直接把号码交给第三方 App 进行查询可以保护用户隐私,但此举也极大的限制了来电识别的效果。这种方式导致第三方 App 仅能通过预先内置少量(相对于云端数据)号码的方式进行识别,而无法利用云端数据提供强大的服务,导致识别率直接损失一半。

熟悉来电识别功能的同学应该已经注意到,iOS 10 的识别逻辑其实和两年前搜狗号码通 Lite 版完全相同。当时搜狗号码通为了绕开系统限制,创造性(脑洞大开)的通过把高频号码写入通讯录的方式,迂回实现了来电识别功能。但这种实现方式除了由于号码数量的限制导致的识别率降低,还带来了诸如通讯录卡顿等副作用,使得用户和业内人士的评价褒贬不一。但为了帮助那些对来电识别强烈需求的 iOS 用户,我们最终决定牺牲一些口碑发布了 Lite 版。而现在 iOS 10 提供的方式是把号码库从通讯录转移到了一个独立的系统数据库,虽然可以避免之前的诸多问题,但并没有太多本质上的改进。

iOS 10 来电识别的预期效果如何?

关于识别率,我个人还是对目前 iOS 10 的做法表示担忧。如前所述,iOS 与之前搜狗号码通的 Lite 版一样,仅由系统依赖本地数据库离线识别,这与安卓系统中第三方 App 完全参与的在线识别方式有较大差距。

首先,本地号码数量十分有限(本地的数万相对云端的数亿)。如前图所示,目前安卓系统中无论是搜狗号码通还是其他第三方 App 都对整个识别过程有完整的控制权,既可以通过预先同步的本地号码库进行离线识别,也可以联网请求云端强大的识别服务。本地库覆盖高频号码,而云服务则包含了所有的长尾数据。离开了云端服务,就失去了大量相对低频来电号码的识别能力。

其次,本地号码无法随时更新。当时安卓版本地号码库仅仅从每周更新提升至每天,就为识别率带来了超过 10% 的相对提升。可见及时更新的显著效果。然而本地号码库很难做到时刻更新,也必然会因此降低识别质量。

所以,云端服务在来电识别中依然会发挥巨大作用,而离开了云端服务的本地识别效果势必大打折扣。

如何提高本地号码库的识别率?

既然 iOS 不允许第三方应用参与来电识别过程,那么预先写入系统的本地号码库就对实际识别效果起到了决定性的作用。由于系统本地号码库的容量十分有限,如何优化这个本地库就成为了能否最大限度识别来电的关键性问题。

如果我们能够把某个用户可能接到的所有电话,按来电的可能性从大到小排列好,那么我们在号码库容量有限的前提下,一定是优先存入排在前面最有可能来电的号码,才能够达到最高的识别率。正如下图所示,随着数据库中号码量的增加,识别率会逐渐提高,但越往后增长的速度越慢。

然而理想状况总是美好的,现实却很骨感。我们并没有所有号码的身份信息,也无法知道每个用户来电的概率。所以如何在现有的号码身份数据中为每位用户量身预测来电数据,就成为了提高本地号码库识别率的最关键问题。从最初搜狗号码通安卓版发布时起,我们就已经非常重视本地号码库的研究和改进,并为此投入了大量精力。在多年的优化过程中,我们通过从多个维度、针对各个用户筛选出电概率最大的号码,加上之后 iOS Lite 版小容量号码库的优化经验,最终在号码数量不变的情况下,使识别率提高了一倍。(虽然这已经是业内的领先水平,但依然和搜狗号码通 Android 版的云端识别率有非常大的差距。输入法都有完全访问,来电识别为什么不给在线查!

安装多个识别 App 能否提高识别率?

从目前看,iOS 10 的确支持多个 App 提供多份数据供系统进行号码识别。听上去是不是之前的问题都解决了?一个 App 的本地数据量有限,我多装 7 个、8 个就可以了。然而事实并没有这么简单,关于使用多个来电识别 App 能否有效提高识别率,我认为并不乐观。

因为在系统的限制下,各个 App 都会努力把各自认为的高频号码集成进来。虽然现在大家对本地号码库的理解和实现还有所差距,但随着数据质量的提升,势必导致各个 App 数据的重合度非常高,从而很难通过多个 App 得到号码绝对数量的提升。但是如果能够出现协作(拜托怎么可能),或是一个厂商发布多个 App (或多个数据库,尚不知是否可行)以覆盖不同维度的号码的话,也许还是有帮助的。

结论

iOS 10 虽然无法最大程度的实现号码识别服务,但毕竟让号码识别服务成为了可能。我们依然期待 iOS 后续能像对输入法一样,在号码识别服务上为用户提供更多的选择,使开发者能为用户提供更完美的服务。

当然,目前 iOS 10 还处于 beta 阶段,现有功能随时可能改动,任何结论性的观点都还为时过早,一切都还需要等到正式版发布才有定论,让我们拭目以待。

利益相关方:搜狗号码通