首先声明,本人不是kuaidail软件的实现作者,是在做相关的项目过程中,想到了也实现了类似的功能,kuaidail软件本身并

没有公布相关实现细节,所以在此分享一下。

  在这里,可以了解kuaidail软件的一些安装效果:http://bbs.app43.com/thread-15553-1-1.html

 

一、总述

  kuaidail运行于越狱平台的ios系统上,与其说它是一个软件,说其是插件更合适不过,因为用户看到的仅仅是它的设置界面

和优化了电话、短信等功能的一些形式。它很方便地把iphone用户对于联系人的归属地,联系人的图片,编辑通话记录,

截获短信,显示陌生人归属地,截获电话并可以列入黑名单白名单,在拨打电话界面快速搜索联系人等用户特别需要的功能

很好地和系统的电话、短信、通讯录软件结合在一起,效率很好,像是系统自带的,可谓精品。

 

二、软件实现总述

  kuaidail的实现应该并不是很复杂,对于平台来说,越狱是必要的前提。为了和系统的界面很好地集成,并修改系统界面信息,

依赖mobilesubstrate也是必要的前提。获取号码的归属地可以采用读取号码归属地数据库的方式实现。实现中最为复杂的地方,

应该就是如何hook恰当的方法或函数,实现正确地改变系统的一些行为,包括界面的显示,程序运行的步骤等。在这里面,最为

复杂的无非就是对于短信和电话的截取,系统界面附加功能对应于系统库的函数是什么,这个过程并非易事。

 

三、具体实现

   下面将此软件分数个模块,分别介绍各个模块的实现细节。

   1、设置程序:

       kuaidail在系统的设置界面有设置项,它的实现可以参考iphone应用程序设置项创建的方式,当然它依然需要一些其它的支持,

   那就是系统Preferences目录中配置文件的支持。

  2、程序主体:

      程序主体应该需要动态库来实现,也就是像输入法、SBSetting这种软件一样,在系统/Library/MobileSubstrate/DynamicLibraries

  目录里需要保存kuaidail主体实现程序,例如kuaidail.dylib, 同时会有kuaidail.plist,里面会有加载的配置项,例如com.apple.mobilephone,

  com.apple.sms等。

  3、通话记录可编辑

     在iphone的电话程序中,通话记录是以UITableView的控件来展示的,它是通过设定UITableView可编辑来完成通话记录可编辑的。

  电话程序左上角的"编辑"按钮,可以按照UIBarButtonItem的添加形式添加到UINavigationBar的左侧即可实现。删除通话记录可能需要

  更新系统通话记录数据库,它就是在/Library里面的通话记录里。通话记录数据库是sqlite数据库。

  4、联系人图片的展示

    联系人图片的获取不复杂,可以通过ABPersonCopyImageData函数实现,然后在UITableView的cell上根据大小设置下就行了。

  5、联系人归属地显示

    利用归属地数据库是个好办法,而且效率也能跟上;appstore上的软件 快速短信+ 就是一个例子。不过,最有效率的方式是自定义归属地

  数据格式,将归属地数据库中归属地信息采用顺序或逆序排序的方式生成bin文件,用fopen读取其中的信息,采用二分查找的方式获取号码

  的归属地信息,kuaidail就是采用这种方式。

  6、通话记录中归属地显示在不同位置

     kuaidail软件在电话程序的最近通话中,根据设置,归属地信息可以显示在号码或者联系人下面,也可以显示在通话时间的下面,

  显示 的位置,可以采用hook相关视图的setFrame方法来实现。相关view的获取可以通过递归获取view所有子view信息来得到。

  (2012-1-13 19:14:16 补充)

  7、系统电话程序的拨号键盘界面#符号的改变以及右上角帮助的i图标的增加

       这个主要需要获取此界面对应的viewController和view是什么,可以在MobilePhone库中classdump获取头文件来寻找,比较容易找到;

  也可以hook如下方法来获取: UIViewController的viewWillAppear、viewDidAppear和viewDidLoad事件来得到具体viewController的字符串

  名称和界面中所有view的名称,然后将图标添加上面。#符号支持长按来改变图标,可以采用通用的UILongPressGestrureRecognizer来实现。

   i帮助图标按下产生数个帮助信息的小视图,可以采用UICalloutView或者UIMenuController来实现。

  8、系统电话程序拨号键盘界面上方显示多个号码,可以循环滚动显示

      可以使用UIScrollView来实现,为了达到可循环滚动,可以在UIScrollView的左侧和右侧各创建一个相同的UIScrollView.

   或者可以在滑动事件过程中,在左侧和右侧分别显示上一个和下一个视图,这样的话可以节省内存。

 

  今天就写到这里吧,明天继续补充。

  (未完待续)