首先聲明,本人不是kuaidail軟體的實現作者,是在做相關的項目過程中,想到了也實現了類似的功能,kuaidail軟體本身並
沒有公布相關實現細節,所以在此分享一下。
在這裡,可以瞭解kuaidail軟體的一些安裝效果:http://bbs.app43.com/thread-15553-1-1.html
一、總述
kuaidail運行于越獄平台的ios系統上,與其說它是一個軟體,說其是外掛程式更合適不過,因為使用者看到的僅僅是它的設定介面
和最佳化了電話、簡訊等功能的一些形式。它很方便地把iphone使用者對於連絡人的歸屬地,連絡人的圖片,編輯通話記錄,
截獲簡訊,顯示陌生人歸屬地,截獲電話並可以列入黑名單白名單,在撥打到電話介面快速搜尋連絡人等使用者特別需要的功能
很好地和系統的電話、簡訊、通訊錄軟體結合在一起,效率很好,像是系統內建的,可謂精品。
二、軟體實現總述
kuaidail的實現應該並不是很複雜,對於平台來說,越獄是必要的前提。為了和系統的介面很好地整合,並修改系統介面資訊,
依賴mobilesubstrate也是必要的前提。擷取號碼的歸屬地可以採用讀取號碼歸屬地資料庫的方式實現。實現中最為複雜的地方,
應該就是如何hook恰當的方法或函數,實現正確地改變系統的一些行為,包括介面的顯示,程式啟動並執行步驟等。在這裡面,最為
複雜的無非就是對於簡訊和電話的截取,系統介面附加功能對應於系統庫的函數是什麼,這個過程並非易事。
三、具體實現
下面將此軟體分數個模組,分別介紹各個模組的實現細節。
1、設定程式:
kuaidail在系統的設定介面有設定項,它的實現可以參考iphone應用程式設定項建立的方式,當然它依然需要一些其它的支援,
那就是系統Preferences目錄中設定檔的支援。
2、程式主體:
程式主體應該需要動態庫來實現,也就是像IME、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實現的效果。