拦截电话 - iPhone(在CoreTelephony中挂钩的正确方法)

时间:2013-02-07 18:32:56

标签: ios objective-c hook jailbreak core-telephony

我是越狱调整开发场景的新手。我试图弄清楚'钩'的适当方法,这样我就可以拦截来电(然后运行一些代码)。

我已经转储了CoreTelephony框架的头文件,但没有任何方法可以显示钩子。我试过了:

- (void)broadcastCallStateChangesIfNeededWithFailureLogMessage:(id)arg1;
- (BOOL)setUpServerConnection;

但两项都没有奏效。通过工作我的意思是 - 当iPhone接到电话时被叫。

关于挂钩的适当方法的任何指针?谢谢:))

注意: 这将是一个使用私有API的越狱调整,因此它不会被提交到App Store。

1 个答案:

答案 0 :(得分:2)

我没有测试您的代码,但我认为您的问题可能是您需要使用Core Telephony通知中心注册该事件(而不是您在评论中的代码中所拥有的内容)。像这样:

// register for all Core Telephony notifications
id ct = CTTelephonyCenterGetDefault();
CTTelephonyCenterAddObserver(ct,   // center
                             NULL, // observer
                             telephonyEventCallback,  // callback
                             NULL,                    // event name (or all)
                             NULL,                    // object
                             CFNotificationSuspensionBehaviorDeliverImmediately);

并且您的回调函数是

static void telephonyEventCallback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
    NSString *notifyname = (NSString*)name;
    if ([notifyname isEqualToString:@"kCTCallIdentificationChangeNotification"])
    {
        NSDictionary* info = (NSDictionary*)userInfo;
        CTCall* call = (CTCall*)[info objectForKey:@"kCTCall"];
        NSString* caller = CTCallCopyAddress(NULL, call);

        if (call.callState == CTCallStateDisconnected)
        {
            NSLog(@"Call has been disconnected");
        }
        else if (call.callState == CTCallStateConnected)
        {
            NSLog(@"Call has just been connected");
        }
        else if (call.callState == CTCallStateIncoming)
        {
            NSLog(@"Call is incoming");
        }
        else if (call.callState == CTCallStateDialing)
        {
            NSLog(@"Call is Dialing");
        }
        else
        {
            NSLog(@"None of the conditions");
        }
    }
}

我提供了另一种技术in this similar question here。另外,请注意我在该问题中的评论,该问题是关于未将UIApplication中的通知置于后台。

更新:请参阅下面的cud_programmer关于在iOS 6而不是kCTCallStatus上使用kCTCall的评论。