原本打算接着一篇寫一下iOSOpenDev,因爲TheOS對makeFile須要比較熟悉,而iOSOpenDev基本不須要用戶處理makeFile,但有網友給我短信但願給一個關於來電短信的demo講解,在此稍帶說明一下,因爲如今是上班時間(呵呵,偷個懶),因此寫文章的時間有限,可能會粗略一些,請見諒。 spring
先傳demo一份。若是對TheOS環境還不熟悉的,能夠看我以前的2篇博文,若是環境搭建好了,這個demo是能夠直接運行的,有幾個警告我沒有去處理,這個純屬測試功能函數用的demo。 數據庫
首先,開機啓動springBoard時候截獲SpringBoard的初始化函數,在初始化函數裏面註冊到TelephontCenter中去代碼片斷以下: app
#import <SpringBoard/SpringBoard.h> 函數
%hook SpringBoard oop
typedef CFNotificationCenterRef (*p1)(void); // 得到 TelephonyCenter (電話消息中心) 的引用 測試
typedef void (*q)(CFNotificationCenterRef center, const void *observer, CFNotificationCallback callBack, CFStringRef name, const void *object, CFNotificationSuspensionBehavior suspensionBehavior); spa
//開機初始化SpringBoard時候調用 指針
-(void)applicationDidFinishLaunching:(id)application { server
%orig; blog
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Welcome"
message:@"HelloWorld!"
delegate:nil
cancelButtonTitle:@"Thanks"
otherButtonTitles:nil];
[alert show];
[alert release];
void *framework = dlopen(CTPATH, RTLD_LAZY);//返回打開動態連接庫以後的指針
p1 CTTelephonyCenterGetDefault = (p1)dlsym(framework, "CTTelephonyCenterGetDefault");//返回函數名字爲CTTelephonyCenterGetDefault的函數
id ct = (id)CTTelephonyCenterGetDefault();
dlclose(framework);
// id ct = (id)CTTelephonyCenterGetDefault();
void *framework1 = dlopen(CTPATH, RTLD_LAZY);//返回打開動態連接庫以後的指針
q CTTelephonyCenterAddObserver = (q)dlsym(framework1, "CTTelephonyCenterAddObserver");//返回函數名字爲CTTelephonyCenterAddObserver的函數
dlclose(framework1);
//註冊到通知中心回調函數callback
CTTelephonyCenterAddObserver((CFNotificationCenterRef)ct, NULL, callback, NULL, NULL, CFNotificationSuspensionBehaviorHold);
// Handle Interrupts
sig_t oldHandler = signal(SIGINT, signalHandler);
if (oldHandler == SIG_ERR)
{
printf("Could not establish new signal handler");
exit(1);
}
// Run loop lets me catch notifications
printf("Starting run loop and watching for notification.\n");
}
%end
CTTelephonyCenterAddObserver((CFNotificationCenterRef)ct, NULL, callback, NULL, NULL, CFNotificationSuspensionBehaviorHold);這個註冊以後,只要有消息就會調用回調函數call
首先說下來電,- (id)initWithAlertController:(id)arg1 是來電提示框彈出時候調用的函數,只要來電了 彈出來電框時就會調用這個函數。
%hook SBUIFullscreenAlertAdapter
//來電提示框彈出調用
- (id)initWithAlertController:(id)arg1{
%orig;
nCallState = 4;
/* {
NSLog(@"ws_initSpringBoardHooks");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"攔截電話"
message:@"攔截"
delegate:nil
cancelButtonTitle:@"ok"
otherButtonTitles:nil, nil];
[alert show];
[alert release];
}*/
return self;
}
%end
回調函數用於接收系統通知,說重點,這裏只說來電。
static void callback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
if ([notifyname isEqualToString:@"kCTCallStatusChangeNotification"])//電話
{
//有電話狀態改變就會進來
//得到電話狀態 撥出電話時爲3,有呼入電話時爲4,掛斷電話時爲5
NSDictionary *info = (NSDictionary*)userInfo;
//CTCall *call = (CTCall *)[info objectForKey:@"kCTCall"];
NSString *state=[[info objectForKey:@"kCTCallStatus"] stringValue];
nCallState = [[info objectForKey:@"kCTCallStatus"] intValue];
if ([state isEqualToString:@"5"])//disconnect
{
NSLog(@"no call phone:%@",state);
}
else if([state isEqualToString:@"4"])
{
//有接聽狀態
````
}
}
}
一下是網上找到的一些關於電話短信的函數的方法,CTCallAddressBlocked和CTCallGetGetRowIDOfLastInsert函數沒有試用。其餘的沒有問題。
extern "C" CFNotificationCenterRef CTTelephonyCenterGetDefault(void); // 得到 TelephonyCenter (電話消息中心) 的引用
extern "C" void CTTelephonyCenterAddObserver(CFNotificationCenterRef center, const void *observer, CFNotificationCallback callBack, CFStringRef name, const void *object, CFNotificationSuspensionBehavior suspensionBehavior);
extern "C" void CTTelephonyCenterRemoveObserver(CFNotificationCenterRef center, const void *observer, CFStringRef name, const void *object);
extern "C" NSString *CTCallCopyAddress(void *, CTCall *call); //得到來電號碼
extern "C" void CTCallDisconnect(CTCall *call); // 掛斷電話
extern "C" void CTCallAnswer(CTCall *call); // 接電話
extern "C" void CTCallAddressBlocked(CTCall *call);
extern "C" int CTCallGetStatus(CTCall *call); // 得到電話狀態 撥出電話時爲3,有呼入電話時爲4,掛斷電話時爲5
extern "C" int CTCallGetGetRowIDOfLastInsert(void); // 得到最近一條電話記錄在電話記錄數據庫中的位置
demo中有短信攔截 短信內容獲取 和電話掛斷 電話號碼獲取等功能。
這裏插一句,咱們的一個產品friendIn已經上線了,FriendIn幫你整和全部社交平臺的好友最新動態,你能夠經過FriendIn隨時隨地關注你關心的朋友的最新動態。嘿嘿。
/*2012/10/13*/
鑑於不少人同窗問我怎麼攔截髮送出去的短信內容,我也花了一天時間研究了一下,這裏作個補充
else if([notifyname isEqualToString:@"CKServiceMessageSentNotification"])//發送短信
{
NSLog(@"~~~~~~~~~~CKServiceMessageSentNotification Start");
NSLog(@"name:%@ ```````````````````````````````````````` infomation:%@",notifyname,userInfo);
CKSMSMessage *message = [(NSDictionary *)userInfo objectForKey:@"CKMessageKey"];
id phonenumber = [message sender];
//發送去的那我的的名字(若是通信錄中有則爲姓名,通信錄中沒有則爲號碼。text爲發送出去的文本內容);
NSLog(@"phonenumber class = %@ name = %@ text = %@",[phonenumber class],[ [message sender] name],[message text]);
NSLog(@"Address: %@ ", [message address]); //發送去的那我的的號碼
}
好吧時間有限,很差意思,代碼中也有粗略的註釋,若有不明白的請留言。使用make編譯,編譯過了以後 把生成的obj文件中的dylib文件放在package/Library/MobileSubstrate/DynamicLibraries 下
而後dpkg -b package所在的文件夾全路徑
會生成一個deb包。安裝什麼的另一篇博文上有說方法。因爲時間比較倉促,還請見諒。