iOS 5 - CTCallCenter не работает для меня

Мой телефон: iOS 5.1.1 взломан с помощью Absynth2

Что я пытаюсь сделать:обнаружить входящий звонок или когда звонок набирается...

Хорошо, вот мой код, который я поместил внутри AppDelegate под didEnterBackgroundтоже попробовал в didResignActive - Я не получаю никаких ошибок, но я также не получаю никаких результатов..

callCenter = [[CTCallCenter alloc] init];   
[callCenter setCallEventHandler:^(CTCall *call) {
    NSDictionary *dict = [NSDictionary dictionaryWithObject:call.callState forKey:@"callState"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"CTCallStateDidChange" object:nil userInfo:dict];
    NSLog(@"state changed on call: %@", call);
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callReceived:) name:CTCallStateIncoming object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callEnded:) name:CTCallStateDisconnected object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callConnected:) name:CTCallStateConnected object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callDial:) name:CTCallStateDialing object:nil];

любая помощь приветствуется. Спасибо!

2 ответа

Решение

Проблема в том, что iOS явно не доставляет уведомления приложениям UIA в фоновом режиме. Из документации iOS для CTCallCenter:

Если ваше приложение активно, когда происходит событие вызова, система немедленно отправляет событие вашему обработчику. Однако события вызова также могут иметь место, пока ваше приложение приостановлено. Пока оно приостановлено, ваше приложение не получает события вызова.

Так как вы взломаны, почему бы не сделать свое "приложение" демоном запуска? Затем он может работать все время как сервис. Если вы сделаете это, то следующий код должен получить ваши уведомления (я проверял это на взломанном iOS 5.0.1 iPhone 4):

@property (nonatomic, strong) CTCallCenter* callCenter;

и зарегистрируйтесь для уведомлений с:

- (void) registerForCalls {

    self.callCenter = [[CTCallCenter alloc] init];
    NSLog(@"registering for call center events");
    [callCenter setCallEventHandler: ^(CTCall* call) {
        if ([call.callState isEqualToString: CTCallStateConnected]) {

        } else if ([call.callState isEqualToString: CTCallStateDialing]) {

        } else if ([call.callState isEqualToString: CTCallStateDisconnected]) {

        } else if ([call.callState isEqualToString: CTCallStateIncoming]) {

        }
        NSLog(@"\n\n callEventHandler: %@ \n\n", call.callState);
    }];
}

Вот хороший учебник о том, как создавать демоны запуска, если вы еще этого не делали.

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

Если вы хотите, чтобы ваше приложение всегда работало в фоновом режиме, тогда вам нужно сделать приложение VoIP-приложением. Вы также можете сделать небольшой трюк, который заставит ваше приложение играть бесконечную беззвучную музыку, когда оно становится фоновым.

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