Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to detect call incoming programmatically

I need my app to send a notification when there is a call (incoming call, connected, call ended) I registered my viewController with notification.

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

I also made a method to check call state

-(IBAction)checkForCall:(id)sender{
    NSLog(@"call state %@ id %@",call.callState,call.callID);
    CTCallCenter *callCenter = [[CTCallCenter alloc] init];
    callCenter.callEventHandler = ^(CTCall* call){
        if (call.callState == CTCallStateDisconnected)
        {
            NSLog(@"Call has been disconnected");

        }
        else if (call.callState == CTCallStateConnected)
        {
            NSLog(@"Call has just been connected");

        }
        else if(call.callState == CTCallStateIncoming)
        {
            NSLog(@"Call is incoming");

        }
        else
        {
            NSLog(@"None of the conditions");
        }
    };
}

But none of this works. Please help me.

Where is the mistake? Is there any code which tells how to use core telephony?

like image 972
user3535353 Avatar asked May 08 '14 07:05

user3535353


2 Answers

use this

Appdelegate.h

#import <CoreTelephony/CTCallCenter.h>
#import <CoreTelephony/CTCall.h>
...
@property (nonatomic, strong) CTCallCenter* callCenter;

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{  
   .... 
  self.callCenter = [[CTCallCenter alloc] init];
  [self handleCall];
   .... 
}

-(void)handleCall
{
    self.callCenter.callEventHandler = ^(CTCall *call){

       if ([call.callState isEqualToString: CTCallStateConnected])
       {
          //NSLog(@"call stopped");
       }
       else if ([call.callState isEqualToString: CTCallStateDialing])
       {
        }
       else if ([call.callState isEqualToString: CTCallStateDisconnected])
       {
          //NSLog(@"call played");
        }
       else if ([call.callState isEqualToString: CTCallStateIncoming])
       {
           //NSLog(@"call stopped");
       }
     };
  }
like image 162
Yogendra Avatar answered Oct 14 '22 03:10

Yogendra


In Swift 3 Use CXCallObserver

import CallKit

var callObserver = CXCallObserver()

class AppDelegate: UIResponder, UIApplicationDelegate, CXCallObserverDelegate {

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

callObserver.setDelegate(self, queue: nil) //Set delegate to self to call delegate method. 

return true 

}

 func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {

    if call.hasConnected {
        print("Call Connect -> \(call.uuid)")
    }

    if call.isOutgoing {
        print("Call outGoing \(call.uuid)")
    }

    if call.hasEnded {
        print("Call hasEnded \(call.uuid)")
    }

    if call.isOnHold {
        print("Call onHold \(call.uuid)")
      }
  }
}
like image 24
Dipang Avatar answered Oct 14 '22 01:10

Dipang