Ios 如何以编程方式检测来电
我需要我的应用程序在有呼叫时发送通知(来电、已连接、呼叫已结束) 我用通知注册了viewControllerIos 如何以编程方式检测来电,ios,iphone,cocoa,core-telephony,Ios,Iphone,Cocoa,Core Telephony,我需要我的应用程序在有呼叫时发送通知(来电、已连接、呼叫已结束) 我用通知注册了viewController [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callReceived:) name:CTCallStateIncoming object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector
[[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;
在
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和swift 3: a) 在新项目中复制并粘贴新的空控制器 b) 运行它,asyncAfter将触发调用。。。 注意:仅适用于设备
// only for iOS10
import UIKit
import CoreTelephony
import CallKit
class ViewController: UIViewController, CXCallObserverDelegate {
var callCenter : CTCallCenter?
var observer : CXCallObserver?
override func viewDidLoad() {
super.viewDidLoad()
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)")
}
}
谢谢@A-Live有任何教程或参考资料如何做到这一点吗?你可以检查并查看这个我希望这可能会对你有所帮助。这是背景工作?谢谢!警告:iOS 10+。来电怎么办?@JD。传入呼叫没有选项。@NecipAllef只有在应用程序处于运行模式时才能工作。
// only for iOS10
import UIKit
import CoreTelephony
import CallKit
class ViewController: UIViewController, CXCallObserverDelegate {
var callCenter : CTCallCenter?
var observer : CXCallObserver?
override func viewDidLoad() {
super.viewDidLoad()
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)")
}
}