4

Is it possible to be notified or detect when a GSM/CDMA call is taking place on an iOS handset?

I have an application that uses audio in the background and I want to be able to detect when a call is taking place so that my app can react accordingly so as not to intrude on the cellular call in anyway.

Essentially I want to be able to detect when a call is taking place so that if the user enters my application while on a call I can disable some functionality.

So I was wondering how I can detect that a cellular call is taking place on a device?

Donal Rafferty
  • 19,707
  • 39
  • 114
  • 191

4 Answers4

9

As of iOS 4, you can use the CTCallCenter class in the Core Telephony framework to register an event handler so your app gets notified when a call starts or ends. The CTCall it gives you has a callState property, which can be CTCallStateDialing, CTCallStateIncoming, CTCallStateConnected, or—when it ends—CTCallStateDisconnected.

Noah Witherspoon
  • 57,021
  • 16
  • 130
  • 131
  • Is there a way to get the phone number of an incoming call? – Mark Nov 04 '11 at 22:41
  • not working, do I need to update the plist also? like register for a background process .... – shebelaw Mar 09 '14 at 19:12
  • Not sure if this helps anyone but I just didn't want to animate a UIView if a call was taking place and this check worked perfect: if (callCenter.currentCalls == nil).....with callCenter being an instance of CTCallCenter. – Jason Renaldo Apr 15 '14 at 01:57
  • Will it be approved by Apple Review team? – PGU Jul 04 '14 at 06:20
2

As of iOS 6, you should:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAudioInterruption:) name:AVAudioSessionInterruptionNotification object:session

and then:

- (void)onAudioInterruption:(NSNotification*)notification
{
    NSDictionary *info = notification.userInfo;
    NSUInteger type = [[info valueForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];

    if (type == AVAudioSessionInterruptionTypeBegan) {
        // stop audio (or whatever)
    } else if (type == AVAudioSessionInterruptionTypeEnded) {
        // restart audio (or whatever)
    }
}
prewett
  • 1,587
  • 14
  • 19
1

Look at AVAudioSessionDelegate protocol.

MarrLiss
  • 808
  • 5
  • 10
  • Thanks, I already have implemented that but it only appears to work if the user is using my app and then I get an incoming call, if my app is not in use, the user makes a call and then goes to my app during the call I want to disable some options at that stage. – Donal Rafferty Sep 23 '11 at 15:10
0

You can use CoreTelephony framework.But you must user some private api.And I have some demo code for this. https://github.com/edison0951/AppNotifyBySMSDemo. And the finally solution is MAP.this is the same with SMS notifications in iOS6

Community
  • 1
  • 1
riven
  • 1,476
  • 2
  • 12
  • 15