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];

любая помощь приветствуется. Благодарность!


person Aramik Gharachehdaghi    schedule 26.06.2012    source источник


Ответы (2)


Проблема в том, что iOS, по-видимому, не доставляет уведомления UIApplications в фоновом режиме. Из документации 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);
    }];
}

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

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

person Nate    schedule 28.06.2012
comment
Означает ли это, что если я хочу разработать приложение, которое каждый раз, когда пользователь получает вызов, будет отправлять смс - это не сработает? Есть ли другой способ сделать это? - person Dejell; 07.03.2013
comment
@Odelya, вы создаете для App Store, для телефонов с джейлбрейком или для телефонов без джейлбрейка, но вы не будете отправлять в App Store? - person Nate; 08.03.2013
comment
Я строю для AppStore. - person Dejell; 10.03.2013
comment
Тогда это вам не подойдет. Приложение App Store не может работать в фоновом режиме все время, что необходимо для всегда прослушивания входящих вызовов. Этот вопрос касался jailbreak разработки. В приложениях для джейлбрейка вы можете сделать ваше приложение демоном запуска, что позволит ему прослушивать звонки или делать что-либо еще, как только телефон загрузится. Время работы Launch Daemon не ограничено, но вы не можете создавать Launch Daemon для App Store. - person Nate; 10.03.2013
comment
@Nate: я хочу программно отключить вызов в ios для взломанного iphone. Ваш комментарий вселил в меня надежду, что мы сможем это сделать. Можете ли вы дать мне ответ с подробным описанием того, как это можно сделать и какие шаги я должен выполнить для реализации этих вещей? - person Bhavin; 09.10.2013

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

person Luan Nguyen    schedule 26.05.2013