谈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.

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

(2012-1-18 10:55:46 补充)

9、截获系统短信事件

系统未公开的类SMSCTServer包含关于SMS处理的方法,其中_ingestIncomingCTMessage方法是接收短信的方法,可以hook它来处理。

10、截获系统电话事件

系统电话事件有很多种方法,但是截获后同时避免系统的相关处理不是易事。ios4.0后,apple开放了获取电话来临消息的事件;

但是此事件并很好地这样的需求,对于加入黑名单的号码,当此号码拨过来,系统没有任何界面展示是最好的效果。hook CTCallCenter类

的handleNotificationFromConnection方法也不能很好地解决这个问题,用CTTelephonyCenterAddObserver方法貌似效果要好点,但是没能

达到kuaidail实现的效果。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值