如何检测来电编程
我需要我的应用程序发送通知时,有一个电话(来电,连接,通话结束)我注册我的viewController与通知。
[[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];
我也做了一个方法来检查通话状态
-(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"); } }; }
但是这些都不起作用。 请帮帮我。
错误在哪里? 有没有说明如何使用核心电话的代码?
用这个
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"); } }; }
In Swift 3
使用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)") } } }
对于iOS 10和迅捷3:
a)在一个新的项目中复制并粘贴一个新的空控制器b)运行它,asyncAfter将触发一个呼叫…注:仅适用于设备。
// // ViewController.swift // CoreTelephonySample // // Created by ing.conti on 08/03/2017. // Copyright © 2017 com.ingconti. All rights reserved. // // only for iOS10 import UIKit import CoreTelephony import CallKit class ViewController: UIViewController, CXCallObserverDelegate { var callCenter : CTCallCenter? var observer : CXCallObserver? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. setup() let delay = 2.0 let when = DispatchTime.now() + delay DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in self.makeCall() }) } final func setup(){ let networkInfo = CTTelephonyNetworkInfo() let code = networkInfo.subscriberCellularProvider?.mobileCountryCode print("\(code)") self.observer = CXCallObserver() self.observer?.setDelegate(self, queue: nil) self.callCenter = CTCallCenter() } final func makeCall(){ { guard let url = URL(string: "telprompt://55555") else { print("illegal URL") return } guard UIApplication.shared.canOpenURL(url) else{ print("cannot open url") return } // iso9.. UIApplication.shared.openURL(url) UIApplication.shared.open(url, options: [:], completionHandler: { (Bool) in }) } public func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall){ print("isOutgoing = \(call.isOutgoing)") print("hasConnected = \(call.hasConnected)") print("hasEnded = \(call.hasEnded)") } }
这些是州名,而不是通知名称。 你需要设置callEventHandler并检查那里的状态。