CallKit 是意思苹果在 iOS 10 里塞进系统的一个框架,全称叫 CallKit Framework。意思说白了,意思它让第三方 App 的意思电话功能,看起来、意思用起来都跟系统自带的意思电话一模一样。你用过微信语音通话吧?意思锁屏状态下弹出全屏来电界面,接听按钮、意思挂断按钮、意思静音键一应俱全,意思甚至能在系统通话记录里看到这通电话——这背后就是意思 CallKit 在干活。
没有 CallKit 之前,意思微信来个语音通话是意思什么体验?屏幕顶部弹个横幅通知,你得先解锁,意思再点进微信,意思再点接听。对方已经等了五六秒。更麻烦的是,如果你正在打游戏或者看视频,那个横幅一闪就没了,错过就是错过。CallKit 把这一切拉到了系统层级:来电直接走系统的通话 UI,锁屏也能接,开车时 CarPlay 也能接,蓝牙耳机上的接听键也能用。体验上,微信语音和运营商电话的差别被抹平了。
具体来说,CallKit 提供几个核心能力。一是来电界面接管,第三方 App 可以调用系统全屏来电模板,显示来电者姓名、App 名称,接听/拒接按钮和系统电话一致。二是通话记录写入,通过 CallKit 拨出或接听的电话,会出现在系统电话 App 的最近通话里,点一下就能回拨——当然回拨是跳回原 App。三是通话中控制,静音、免提、切换音频路由这些操作,都能在系统通话界面完成,不用切回 App。四是与 Siri 和通讯录的整合,比如你可以直接对 Siri 说“用微信打给张三”。
但 CallKit 有个关键限制:它只管“呼叫界面”和“通话控制”,不管语音数据本身。音频流还是走 App 自己的网络通道,苹果不碰。所以微信语音的音质好坏,跟 CallKit 没关系,那是微信服务器和你的网络决定的。CallKit 只是把“接电话”这个动作,从 App 内部搬到了系统层面。
国内用户对 CallKit 的感情比较复杂。2018 年苹果应工信部要求,在国行 iPhone 上关闭了 CallKit 功能。微信、QQ 这些 App 的语音通话,一夜之间退回横幅通知时代。当时网上骂声一片,但政策就是政策。后来有些 App 尝试用 PushKit + VoIP 推送来绕,但苹果封了这条路——VoIP 推送必须走 CallKit,不走就断连。所以国行 iPhone 至今没有原生的 CallKit 体验。安卓那边倒是有类似方案,比如华为的畅连、小米的 MiPush 通话,但各家实现不一,没有统一标准。
海外用户没这个烦恼。WhatsApp、Skype、Facebook Messenger 都深度集成了 CallKit,体验跟接运营商电话没差。我有个在澳洲的朋友,手机常年静音,但 WhatsApp 来电照样全屏弹,他说“根本分不清是电话还是网络电话,反正都能接到”。这种无感切换,才是 CallKit 的真正价值。
还有个细节值得说:CallKit 支持“通话目录扩展”。比如你装了某个快递 App,它可以把快递员的号码标记成“顺丰快递”,来电时直接显示,不用你猜。这个功能叫 Call Directory Extension,很多国产 App 在国外版本里都用上了,国内版本因为 CallKit 被禁,反而用不了。
总结一下,CallKit 就是苹果给第三方通话 App 开的一扇后门,让它们能借用系统电话的壳。壳借到了,体验就上去了;壳被收走了,体验就掉回解放前。国行 iPhone 用户至今还在等这扇门重新打开,但什么时候开,没人知道。