TheOS關於來電,短信的一些功能攔截


    本來打算接着一篇寫一下iOSOpenDev,由於TheOS對makeFile需要比較熟悉,而iOSOpenDev基本不需要用戶處理makeFile,但有網友給我短信希望給一個關於來電短信的demo講解,在此稍帶說明一下,由於現在是上班時間(呵呵,偷個懶),所以寫文章的時間有限,可能會粗略一些,請見諒。

    先傳demo一份。如果對TheOS環境還不熟悉的,可以看我之前的2篇博文,如果環境搭建好了,這個demo是可以直接運行的,有幾個警告我沒有去處理,這個純屬測試功能函數用的demo。

    首先,開機啟動springBoard時候截獲SpringBoard的初始化函數,在初始化函數里面注冊到TelephontCenter中去代碼片段如下:

 

#import <SpringBoard/SpringBoard.h>

 

%hook SpringBoard

typedef  CFNotificationCenterRef (*p1)(void); // 獲得 TelephonyCenter (電話消息中心) 的引用

 

typedef  void (*q)(CFNotificationCenterRef center, const void *observer, CFNotificationCallback callBack, CFStringRef name, const void *object, CFNotificationSuspensionBehavior suspensionBehavior);

//開機初始化SpringBoard時候調用

-(void)applicationDidFinishLaunching:(id)application {

    %orig;

    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包。安裝什么的另外一篇博文上有說方法。由於時間比較倉促,還請見諒。

 

額,這個不能傳附件 有點蛋疼。剛申請個115網盤結果不能共享,其他網盤公司登陸不了```,留言給個郵箱 我發給需要的人把。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM