Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
690 views
in Technique[技术] by (71.8m points)

iphone - iOS 5 - CTCallCenter not working for me

My phone: iOS 5.1.1 Jailbroken using Absynth2

What I'm trying to do: detect an incoming call or when a call is being dialed...

Okay here is my code that i placed inside the AppDelegate under didEnterBackground, also tried in didResignActive - i don't get any errors but i also don't get any results..

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

any help is appreciated. thanks!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The problem is that iOS apparently doesn't deliver the notifications to UIApplications in the background. From the iOS documentation for CTCallCenter:

If your application is active when a call event takes place, the system dispatches the event to your handler immediately. However, call events can also take place while your application is suspended. While it is suspended, your application does not receive call events.

Since you are jailbroken, why not make your "app" a launch daemon? Then, it can run all the time as a service. If you do this, then the following code should get your notifications (I tested this on a jailbroken iOS 5.0.1 iPhone 4):

@property (nonatomic, strong) CTCallCenter* callCenter;

and register for notifications with:

- (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(@"

 callEventHandler: %@ 

", call.callState);
    }];
}

Here's a good tutorial on how to create Launch Daemons, if you haven't done that before.

If you also have a graphical component to your app, then you can build two parts: the launch daemon to run all the time, and the UI app that runs when the user launches it. They can communicate with each other with notifications, if need be.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...