web-dev-qa-db-ja.com

プログラムで着信を検出する方法

通話(着信、接続、通話終了)が発生したときにアプリが通知を送信する必要があります。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");
        }
    };
}

しかし、これはどれも機能しません。私を助けてください。

間違いはどこにありますか?コアテレフォニーの使用方法を説明するコードはありますか?

12
user3535353

これを使って

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");
       }
     };
  }
22
Yogendra
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)")
      }
  }
}
6
Dipang

iOS10の場合AND 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)")
    }
}
2
ingconti

これらは州名であり、通知名ではありません。 callEventHandler を設定し、そこで状態を確認する必要があります。

0
A-Live