Intercepting phone call - iPhone (correct method to hook in CoreTelephony)

前端 未结 1 1267
太阳男子
太阳男子 2020-12-03 09:40

I am new to the jailbreak tweak development scene. I am trying to figure out the appropriate method to \'hook\' so I can intercept an incoming call (and then run some code).

相关标签:
1条回答
  • 2020-12-03 10:05

    I didn't test your code, but I think your problem might be that you need to use the Core Telephony notification center to register for that event (not what you had in the code in your comment). Something like this:

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

    and your callback function is

    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");
            }
        }
    }
    

    I offer another technique in this similar question here. Also, note my comment in that question about not getting the notifications in a UIApplication that has been put into the background.

    Update: see cud_programmer's comment below about using kCTCallStatus on iOS 6 instead of kCTCall.

    0 讨论(0)
提交回复
热议问题