Handling Phone Call Events on iOS using Swift 4
西山 勇毅
iOS
Swift
CallKit
CXCallObserver

iOS 10から、サードパーティアプリから電話関係の操作を可能にするCallKitが追加された。今までは、CoreTelephonyを使ってイベントを検知できていたが、iOS10からはCallKitが推奨されているので、せっかくなのでSwift4でコードを書き直し。
実装手順¶
import CallKitで、CallKitをクラスに追加CXCallObserverをインスタンス化CXCallObserverDelegateを実装し、CXCallObserverにdelegateを設定CXCallObserverDelegateは、callObserver(callObserver:call:)メソッドを実装する必要がある- 電話イベントが発生すると、
callObserver(callObserver:call:)メソッドが呼ばれる - call変数(CXCallクラス)の
hasEndedhasConnectedisOnHoldisOutgoingの4つの真偽値を使ってイベントの内容を判定できる - 例えば、以下のコードで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イベント」が上手く検知できていなかったので、そこを修正。
参考¶
- CallKit - Apple Developer Documentation
- Get phone call states in iOS 10 - Stack Overflow
- Xcode|iOS10から新しく加わったCallkitを使って通話の状態を取得してみた