Reputation: 124
I want to get phone call states in my app.
After some search I found CoreTelephony
framework. But that is deprecated in iOS 10. SO is there any other alternative available?
I also found CallKit
. A new framework in iOS 10. But didn't getting call states from same as I searched.
Upvotes: 6
Views: 7545
Reputation: 1698
You can try this code:
Create the instance of call observer
@property ( nonatomic ) CXCallObserver *callObserver;
Initiate the instance and set the delegate
_callObserver = [CXCallObserver new];
[_callObserver setDelegate:self queue:dispatch_get_main_queue()];
Add the call observer delegate
- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call{
if (call == nil || call.hasEnded == YES) {
NSLog(@"CXCallState : Disconnected");
}
if (call.isOutgoing == YES && call.hasConnected == NO) {
NSLog(@"CXCallState : Dialing");
}
if (call.isOutgoing == NO && call.hasConnected == NO && call.hasEnded == NO && call != nil) {
NSLog(@"CXCallState : Incoming");
}
if (call.hasConnected == YES && call.hasEnded == NO) {
NSLog(@"CXCallState : Connected");
}
}
In Swift 4.2:
var callObserver: CXCallObserver()
callObserver.setDelegate(self, queue: DispatchQueue.main)
func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
if call == nil || call.hasEnded == true {
print("CXCallState : Disconnected")
}
if call.isOutgoing == true && call.hasConnected == false {
print("CXCallState : Dialing")
}
if call.isOutgoing == false && call.hasConnected == false && call.hasEnded == false && call != nil {
print("CXCallState : Incoming")
}
if call.hasConnected == true && call.hasEnded == false {
print("CXCallState : Connected")
}
}
Upvotes: 7
Reputation: 8279
import CallKit
into your AppDelegate
and add the following code:
// AppDelegate
var callObserver: CXCallObserver! // add property
// in applicationDidFinishLaunching...
callObserver = CXCallObserver()
callObserver.setDelegate(self, queue: nil) // nil queue means main thread
extension AppDelegate: CXCallObserverDelegate {
func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
if call.hasEnded == true {
print("Disconnected")
}
if call.isOutgoing == true && call.hasConnected == false {
print("Dialing")
}
if call.isOutgoing == false && call.hasConnected == false && call.hasEnded == false {
print("Incoming")
}
if call.hasConnected == true && call.hasEnded == false {
print("Connected")
}
}
}
Upvotes: 12
Reputation: 2972
To be notified about phone call states, starting from iOS 10, you should use CXCallObserver
class and implement its CXCallObserverDelegate
protocol method, that is suggested in this answer:
- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {
if (call.hasConnected) {
// perform necessary actions
}
}
Upvotes: 2
Reputation: 673
There is some delegate method available that indicate incoming and outgoing call status.
See : https://developer.apple.com/reference/callkit
Upvotes: 1
Reputation: 382
Apple does not allow you to access these informations though you can do so by using third party libraries but your app would be rejected at the time of submittion to App Store because apple does not allow to gain access to sensitive user information .
Upvotes: -3