谈iphone电话短信增强工具kuaidail软件的实现
首先声明,本人不是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.
或者可以在滑动事件过程中,在左侧和右侧分别显示上一个和下一个视图,这样的话可以节省内存。
今天就写到这里吧,明天继续补充。
(未完待续)