Перехват телефонного звонка - 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
,
Является ли это возможным?
Да.
Сможет ли обычный средний человек, не имеющий опыта в области компьютерной инженерии или знаний о том, как работают вышки сотовой связи, сделать что-то подобное?
Нет.
Технически вы можете купить роутер, который выглядит недешево, незаконен, и компании сотовой связи могут фактически отследить их, поскольку они мешают работе сети. Так что, кроме правительственных агентств или международных шпионов, я не думаю, что вам есть о чем беспокоиться. Но если правительство — это именно то, о чем вы беспокоитесь, то мне жаль говорить вам, что они делают гораздо больше, чем просто перехватывают телефоны.