1

我的手机: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];

任何帮助表示赞赏。谢谢!

4

2 回答 2

5

问题是 iOS 显然不会在后台将通知传递给 UIApplications。来自CTCallCenter 的 iOS 文档

如果您的应用程序在调用事件发生时处于活动状态,则系统会立即将该事件分派给您的处理程序。但是,调用事件也可能在您的应用程序暂停时发生。当它被挂起时,您的应用程序不会收到呼叫事件。

既然你已经越狱了,为什么不让你的“应用程序”成为一个启动守护进程呢?然后,它可以一直作为服务运行。如果您这样做,那么以下代码应该会收到您的通知(我在越狱的 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);
    }];
}

这是一个关于如何创建 Launch Daemons 的好教程,如果您以前没有这样做过的话。

如果您的应用程序还具有图形组件,那么您可以构建两个部分:始终运行的启动守护程序,以及在用户启动它时运行的 UI 应用程序。如果需要,他们可以通过通知相互通信。

于 2012-06-28T00:11:19.313 回答
0

If you want your app always run in the background, then you have to make your app Voip app. You can also do a little trick, which makes your app play a infinite silent music when it goes background.

于 2013-05-26T01:08:11.463 回答