Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何以编程方式检测来电_Ios_Iphone_Cocoa_Core Telephony - Fatal编程技术网

Ios 如何以编程方式检测来电

Ios 如何以编程方式检测来电,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

我需要我的应用程序在有呼叫时发送通知(来电、已连接、呼叫已结束) 我用通知注册了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;

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)")
    }
}