ブログ一覧に戻る

Handling Phone Call Events on iOS using Swift 4

西山 勇毅
iOS Swift CallKit CXCallObserver

Swift

iOS 10から、サードパーティアプリから電話関係の操作を可能にするCallKitが追加された。今までは、CoreTelephonyを使ってイベントを検知できていたが、iOS10からはCallKitが推奨されているので、せっかくなのでSwift4でコードを書き直し。

サンプルコードはこちら。

実装手順

  1. import CallKitで、CallKitをクラスに追加
  2. CXCallObserver をインスタンス化
  3. CXCallObserverDelegateを実装し、CXCallObserverにdelegateを設定
  4. CXCallObserverDelegateは、callObserver(callObserver:call:) メソッドを実装する必要がある
  5. 電話イベントが発生すると、callObserver(callObserver:call:) メソッドが呼ばれる
  6. call変数(CXCallクラス)の hasEnded hasConnected isOnHold isOutgoing の4つの真偽値を使ってイベントの内容を判定できる
  7. 例えば、以下のコードで4つの状態(Dialing, Incoming, Connected, Disconnected)を判定できる
import CallKit

class CallObserver: NSObject, CXCallObserverDelegate {

    let callObserver = CXCallObserver()

    override init() {
        super.init()
        callObserver.setDelegate(self, queue: nil)
    }

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

isOutgoingを見れば「着信」か「発信」が一発で分かったりと、慣れると真偽値を使った判定も便利かも。参考にしたサイト上のコードだと、「受信時のDisconnectedイベント」が上手く検知できていなかったので、そこを修正。

参考

この記事をシェア