Перехват телефонного звонка - iPhone (правильный способ подключения в CoreTelephony)

Я новичок в сцене разработки джейлбрейк твик. Я пытаюсь выяснить подходящий метод для "перехвата", чтобы я мог перехватить входящий вызов (а затем выполнить некоторый код).

Я сбросил заголовочные файлы платформы CoreTelephony, однако ни один из методов не кажется очевидным для перехвата. Я пытался:

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

но ни один не работал. Под работающим я имею в виду - мне звонят, когда iPhone получает звонок.

Какие-нибудь указатели относительно подходящего метода, чтобы зацепить? Спасибо:)

Примечание. Это будет джейлбрейк-твик с использованием частных API, поэтому он не будет отправлен в App Store.

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

Я предлагаю другую технику в этом подобном вопросе здесь. Также обратите внимание на мой комментарий в этом вопросе о том, чтобы не получать уведомления в UIApplication это было помещено в фон.

Обновление: см. Комментарий cud_programmer ниже об использовании kCTCallStatus на iOS 6 вместо kCTCall,

Является ли это возможным?

Да.

Сможет ли обычный средний человек, не имеющий опыта в области компьютерной инженерии или знаний о том, как работают вышки сотовой связи, сделать что-то подобное?

Нет.

Технически вы можете купить роутер, который выглядит недешево, незаконен, и компании сотовой связи могут фактически отследить их, поскольку они мешают работе сети. Так что, кроме правительственных агентств или международных шпионов, я не думаю, что вам есть о чем беспокоиться. Но если правительство — это именно то, о чем вы беспокоитесь, то мне жаль говорить вам, что они делают гораздо больше, чем просто перехватывают телефоны.

Другие вопросы по тегам