360 iOS程序员首次爆料:开发iPhone防骚扰的3年不归路_最新动态_新闻资讯_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 新闻资讯 > 最新动态 > 360 iOS程序员首次爆料:开发iPhone防骚扰的3年不归路

360 iOS程序员首次爆料:开发iPhone防骚扰的3年不归路

 2014/12/16 4:41:31    程序员俱乐部  我要评论(0)
  • 摘要:本文作者:360手机卫士程序员/闫占龙我是一名普通的iOS程序员,入职360以后一直在手机卫士部门从事开发工作,最近我们上线了AppStore版防骚扰电话的功能,引起了网友的议论,也勾起了自己对这三年来iPhone软件开发工作的一些感想,既然这篇文章题目叫不归路,请允许我倒一倒自己的苦水。老婆当初觉得我是一名iOS开发很高大上,那逼格啊,莫名比Android开发高几个level,但咱偏偏是做iOS开发中最奇葩的安全那一块的开发,心中的苦逼只有战友和同行知道
  • 标签:程序 程序员 iphone iOS 不归路 开发 360
class="topic_img" alt=""/>

  本文作者:360 手机卫士程序员/闫占龙

  我是一名普通的 iOS 程序员,入职 360 以后一直在手机卫士部门从事开发工作,最近我们上线了 AppStore 版防骚扰电话的功能,引起了网友的议论,也勾起了自己对这三年来 iPhone 软件开发工作的一些感想,既然这篇文章题目叫不归路,请允许我倒一倒自己的苦水。

  老婆当初觉得我是一名 iOS 开发很高大上,那逼格啊,莫名比 Android 开发高几个 level,但咱偏偏是做 iOS 开发中最奇葩的安全那一块的开发,心中的苦逼只有战友和同行知道。

  随着 360 卫士新版推出骚扰号码识别功能,广大 iPhone 用户又重拾了往日对骚扰电话拦截的心愿,虽然现在的实现方案只是“向通讯录中添加骚扰号码库,能识别来电骚扰号码、不能拦截来电”这样一种无奈的方案,但是,对受限制较多的 iOS 系统的而言,安全类 app 的一点点功能提升,就意味着花费在这个功能上大量的失败尝试。

  试错不是互联网公司的专利,但是互联网公司不试错,就不能生存。当初刚进入 360 其实我也不懂上面这句话的意思,第一次听 team 里的产品老大这么讲,我心里还想:试个毛啊,验证一下而已,非得整这么洋气的词?后来的经历告诉我,试错真不像看上去验证一段代码那么轻松…

  2012 年初,我刚进入团队 3 个月,运营的同学反映每个月都能收到数千的用户强烈要求增加来电归属地显示、骚扰电话和垃圾短信拦截,然后技术 leader 就把我们拉到经常讨论到通宵,例举数十种技术方案。我也研究过很多国外 iOS 大神的分析,结论仍然是除了企业版用私有接口可以实现别无他法,那就先做企业版吧,经过一个多月的封闭开发,手机卫士企业版正式推出了上面两个功能,识别方法轻松有效:拦截来电/短信,把主叫号码传到云端与骚扰号码库进行比对,最后把结果返回 App 端,App 端予以展现。

图:2012 年初用户反馈情况

  iPhone 用户可以拦截骚扰电话和短信了,这解决了一小部分企业用户的需求,也算圆了一个工程师小小的梦想。这段时间是我印象里少有的能够让人兴奋起来的时光,因为作为一名程序员,可以使用自己认为最好的代码完美的实现想要的功能,没有什么比这个更有成就感了。事实也证明,企业用户对这个功能的喜爱完全符合我们预期,这给了我们很大的鼓舞,但我很清楚,走到这一步,不是码农指间的神作,而是如履薄冰的探险。

  按照苹果的企业版证书开发许可协议,利用这样的接口开发的应用是不允许提供给普通用户使用的,但是当时面对普通用户汹涌的而来的需求,我们确实没有更完美的解决方案(其实直到现在也是),我们在企业用户的反馈和建议中验证着每一个细节,并穿插测试向普通用户开放这个功能的可行性。结果,一不留神,还真就踩到地雷上了…

  2013 年 1 月 25 日,卫士被正式下架 AppStore,并且连累到公司的所有 iOS 端产品。

  说真的,那天早上被产品总监的电话叫醒,整个人都懵了,不是做梦吧?

  我的 iOS 程序猿生涯 TM 刚开始 1 年就进入了完全不可预期的状态。

  接下来的时间里,我转战越狱版、WindowsPhone 版,甚至差一点去做服务端工程师,总之就是随波逐流,但是在心底里始终有种欠债的感觉,而且下架初期用户的不理解、竞争对手的抹黑与我们什么也做不了只能每天憧憬重新上架却一次次失望的情绪像噩梦一样挥之不去,最重要的是,作为直接参与这一“越轨”功能的实现并面对下架结果的我,和我们 PM 一样仅剩下的一点盼头,也就是祈祷自己的产品不会被用户遗忘,那一段时间真实的感觉到了产品就像自己的孩子一样。

  这一等就是一年,我难得可以不用通宵,难得 9 点以前回家,难得有了更多时间陪陪老婆,在这如梦如幻、魂不守舍的一年,我还真的成了一个孩子的爸。

  当屌丝成大叔,当大叔已成爹。2014 年初,苹果对 360 的开发者账号解封,主产品手机卫士的市场份额流失惨重,说真的,听到重新组织团队恢复 AppStore 版开发的消息时,我第一反应不是高兴,而是困惑,我们能做什么?      

  一边是 iPhone 用户呼声不断的拦截骚扰的需求,一边是苹果对我们更加严格的审核(据说专门安排了两组审核人员)和无法跨越的红线。当然,困惑归困惑,产品该上还是要上的,不过是阉割了诸多功能之后的版本,包括拦截骚扰来电、来电归属地显示、清理加速,呵呵,都砍掉了。

  我们能做的除了适配 iOS7 扁平化,就是优化代码、美化界面和增加其它无关痛痒的功能,结果上线后用户骂声一片,我们既觉得委屈又觉得无奈,好想在更新日志说这个版本是美工开发的。

  这种状况一直持续到今年7、8 月份,苹果 iOS8 透露出一些新的接口,包括通知中心、输入法等扩展功能,作为一款安全软件,通知中心接口的作用最大,于是我们在经历了两次被拒的小插曲后赶在苹果正式推送 iOS8 下载的第二天,国内首家推出了完美适配 iOS8 和 Arm64 架构并支持通知中心插件的版本更新,但是这仍然没有解决用户反馈最多需求最强烈的骚扰电话拦截问题,直到一个偶然的机会…说起来,这个机会也跟公司的一条原则有关系,也是老周的 3 个凡是的一条——“凡是用户提的问题,一定要追根述源,找到问题的原因,从用户的角度想解决的方案。”无论用户向我们建议、抱怨、还是怒目相向,团队里所有人都必须积极倾听,理解用户背后的需求,从而改善产品。

  正因为此,我们在一次内部吐槽会议上,幸运的借一个 360 论坛用户对来电归属地显示的建议联想到了一个办法:利用 iPhone 系统一个联系人可以附带若干电话号码的机制,我们可以在用户手机中新建一个联系人,名称为空,然后在下面带上我们从云端拉取的1、2000 个骚扰号码,并给这些号码的标签都命名为“骚扰号码”,这样在用户接到这些号码的来电时,因为没有姓名,iPhone 系统就会显示其标签名称“骚扰号码”,就等于是提醒了用户!然后就开始研究吧,貌似简单的功能,细节一大堆,尤其是要测试的工作很多:

  1、把骚扰类型分别放在名字上、放在标签上、放在其它字段,写入通讯录,看通讯录中的显示、来电时的显示、外拨时的显示;

  2、每个联系人添加不同的号码数量,对比测试:通讯录启动响应速度、正常来电响应速度、骚扰号码来电响应速度、正常外拨响应速度、外拨骚扰号码显示速度、双击 home 显示速度、最近联系人打开和关闭时响应速度;

  3、号码和标签的对应关系、编码方式,对比测试上面的各种响应速度;

  4、在不同的 iPhone 机型、iOS 版本上测试,确定每款机型的最优配置;

  5、上面这些都搞定后,似乎不错了,打开手机上的常用软件,怎么推荐了这么多陌生手机号码?尤其是一款可以推荐朋友的朋友的社交产品,对比一下:A产品只推荐朋友也就是你通讯录中的人给你,那你发现推荐了一堆乱七八糟的人之后首先会想到把骚扰号码库删除掉,这样直接就可以解决问题,B产品是推荐朋友的朋友,你发现问题后删除骚扰号码库根本没用!因为你通讯录好友中只要有一个人他的通讯录中有骚扰号码库,那骚扰号码就依然会成为你“朋友的朋友”,如果这个骚扰号码库是上万个号码,结果简直不敢想!于是我们寻找解决办法:在手机号码中尝试增加各种无效的字符、国家码的排列组合,在保证号码能够在来电时被苹果系统识别出来的前提下测试能不能避开社交软件的好友推荐,不能避免的,将我们的骚扰号码联系人特征发给产品的开发者或公司,请对方做规避处理,只有这样,才能避免给用户造成困惑;

  6、对通讯录备份软件及相关的开发者也要重新走一遍第 5 条的流程;

  7、删除这个特殊联系人后,通讯录中会多出很多标签,永远保存在用户手机中,iOS 通讯录不能批量清理掉这些标签,让用户一个个手工删除又太繁琐,能不能通过代码批量删除?能不能通过 iTunes 同步通讯录删除?能不能通过 iCloud 同步通讯录删除?能不能通过恢复手机设置删除?能不能通过恢复手机所有内容和设置删除?能不能通过 iTunes 备份和恢复删除?每一个方法都要试!

  8、还有识别率问题,骚扰号码库的大小(通讯录中这个特殊联系人的号码数量),和骚扰识别率之间的权衡,如何才能在通讯录不受影响的情况下,尽可能提高识别率?这里真得感谢卫士 Android 版的广大用户这几年来标记产生的庞大的骚扰号码库(比某狗的多出两个数量级好吗!),量级够大,才能做到按照用户号码归属地分别下发 Top1000 的数据就能保证不错的识别率,后来看到有人说这是 2014 年最佳大数据实践案例,其实和我们 team 一点关系没有,都是人家安卓用户的贡献;

  9、最后还有个终极问题,这次除了骚扰识别的主要实现机制必须严格遵守苹果的开发者协议外,任何解决卡慢、社交产品兼容等副作用的方法都必须要确保不逾越这条红线!(这一点,与广大 iOS 开发者共勉)

  分析工作做完,经过近两周如履薄冰又绞尽脑汁的紧张加班,新版产品终于在 11 月 23 日再次以试错的心态提交苹果审核,结果,两天后我们看到另一个大体思路相同的竞品正式上线了!而且因为作法比较粗暴导致用户手机卡的一逼、骂声一片,我和团队里的产品普遍都开始担心,难道这次又要翻船?要不要低调点放量?甚至取消上架?继续上吧,一来不理解的用户会说你抄袭,二来用户对于这种实现方法不知道能不能接受,不上吧,我们处心积虑考虑的那么多因素、做的那么多测试眼睁睁无用武之地。最后,产品总监还是一句话拍板:刀山火海都过来了,不试个结果死不瞑目!

  结果是:这一次,我们可能试对了!至少到目前为止,用户对我们这次骚扰识别功能的反馈是正面的,虽然有一些说我们抄袭的声音,但也很快被淹没在大家的好评中。作为一名程序员,我想这就够了。

  当然,我们也没闲着,接下里随着服务端数据算法的改进,和我们对苹果 iOS 系统的了解深入,我们将尝试解决骚扰号码库打开速度和识别率之间的矛盾,譬如先把号码库从 1000 个提高到 2500 个,提高骚扰号码识别率的同时提高用户打开这个特殊联系人的速度,通过试错一步步把这个功能达到我们认可、用户也认可的理想状态!

  之前听过一个说法:程序员天生就是理想主义者,代码要写的很整洁、执行效率要很高、容错要很好、适应性要很强,想想和自己的编程习惯还真是蛮符合的,但是自己这几年在 360 的开发经历却让我完全体会不到这种理想主义带来的任何好处,反而是处处碰壁,直到现在才终于明白:人世间没有一次满足所有用户需求的程序,只有一步步试错、越来越贴近用户需求的程序!

  过去 3 年,头发白了一茬,在为解决 iPhone 骚扰电话的问题从未止步,我,一个小小码农,已习惯了红线内戴着脚镣舞蹈。

  用老婆的话来说,这 3 年,我还是有收获的,收获了一个娃。

  自从当爹以后,心态也好了很多,每一天都苦逼并努力着,抬头看看帝都雾霾散去的晴空,期待着 iOS 未来的开放。

发表评论
用户名: 匿名