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网盘结果不能共享,其他网盘公司登陆不了```,留言给个邮箱 我发给需要的人把。

posted @ 2012-08-20 12:27  iOS小熊  阅读(5199)  评论(150编辑  收藏  举报