2016-03-15 46 views
5

アプリで着信を検出しようとしたかったのですが、私はちょうどいくつかのコードを試して、最初から新しいSwiftプロジェクトを作成しました。私は迅速に新しいですので、私はまた、[弱い自己]なしにしようとしたCTCallCenter(Swift)を使用してiOSで電話を検出する

super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    let callCenter = CTCallCenter() 
    NSLog("start") 

    callCenter.callEventHandler = {[weak self] (call: CTCall) ->() in 

     self?.label.text = call.callState 
     NSLog("Call state") 
     NSLog(call.callState) 

    } 

:に)(私がやった唯一の事は、すべての新しいプロジェクトで作成されたのViewControllerにCoreTelephonyをインポートして、私はまたのviewDidLoadを変更しましたそれが何を伴うのか分かりません。

私の電話でXCode経由で新しい小さなアプリを実行すると、電話がかかってきたり、切断されたり、何かが起こっても何も起こりません。それほど誤りはない。 CoreTelephonyフレームワークとCTCallCenterを使用するために何か他のことをしなくてはなりませんか?

よろしく ヨハン

+1

'viewDidLoad'の変数ではなく、' callCenter'をビューコントローラのプロパティにするようにしてください。 –

+0

ありがとうございました! –

+0

変数ではなくプロパティとしてcallCenterを使用した理由を説明できますか? –

答えて

1

これは、上記の私のコメントに拡張したものです。

callCenterを変数viewDidLoadの代わりにビューコントローラのプロパティにしてみてください。

メソッドに変数を定義すると、変数とその値はそのメソッド内にのみ存在します。メソッドの実行が終了すると、貴重な値とその値はクリーンアップされ、メモリが使用されないようになります(値が別の場所で使用されていない限り)。

callCenterを定義し、それに新しいCTCallCenterインスタンスを割り当てます。しかし、viewDidLoadの最後では、CTCallCenterインスタンスはもう使用されないため、メモリからクリーンアップされます。それはもはや存在しないので、コールイベントを処理することはできません。

callCenterをビューコントローラのプロパティとして追加すると、CTCallCenterインスタンスの有効期間がビューコントローラの寿命に結びつきます。したがって、CTCallCenterは、メモリからビューコントローラがクリーンアップされたときにのみメモリから消去されます。詳細については

Automatic Reference Counting in Swift

11

callEventHandlerを読んでは、iOS 10は今、あなたがやろうとしているものを達成するための新たな枠組み、CallKitを採用してiOSの10

を開始廃止されました。これは、すべての電話の中断を処理する必要があるAppleの新しいフレームワークです。着信コールと発信コールを検出するには、CXCallObserverを使用します。このクラスは、プロトコルCXCallObserverDelegateを使用して、登録された代理人に呼び出しの変更を通知します。私はそれがよく代理人としてAppDelegateを設定して動作することがわかった。

// AppDelegate 
var callObserver: CXCallObserver! 

// 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") 
     } 
    } 
} 
関連する問題