[CallKit] 迷惑電話をシャットアウト!Call Directory Extensionを使って特定の電話番号の着信を拒否する

2018.02.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Call Directory Extensionを使えば着信拒否もできる

前回はCall Directory Extensionを使って着信時に発信者名を表示してみましたが、 今回はCall Directory Extensionを使って特定の電話番号の着信を拒否する方法をご紹介します。 Call Directory Extensionを使う点やハマりどころなどは発信者名表示と変わらないので、前回の記事に目を通していただければと思います。

[CallKit] 思わぬハマリどころも!Call Directory Extensionを使って着信時に発信者名を表示する

検証環境

本エントリは以下の環境で検証を行っています。

  • macOS Sierra バージョン 10.12.6
  • Xcode Version 9.2 (9C40b)
  • Swift 4

着信拒否のためのデータベースを提供する

以下は実装例です。

class CallDirectoryHandler: CXCallDirectoryProvider {
    override func beginRequest(with context: CXCallDirectoryExtensionContext) {
        // コンテキストのデリテートを設定することでリクエスト失敗時のエラーが拾えるようになる。
        context.delegate = self

        // コンテキストにブロックしたい電話番号を登録する。
        let phoneNumbers: [CXCallDirectoryPhoneNumber] = [ 81_8011111111, 81_8011111112 ]
        for phoneNumber in phoneNumbers {
            context.addBlockingEntry(withNextSequentialPhoneNumber: phoneNumber)
        }

        // コンテキストへのリクエストを完了する。
        context.completeRequest()
    }
}

// MARK: - CXCallDirectoryExtensionContextDelegate
extension CallDirectoryHandler: CXCallDirectoryExtensionContextDelegate {
    func requestFailed(for extensionContext: CXCallDirectoryExtensionContext, withError error: Error) {
        // 必要に応じてエラーハンドリング
    }
}

CXCallDirectoryExtensionContextのデリゲートの設定や最後にコンテキストへのリクエストを完了する点は発信者名表示と同じです。

CXCallDirectoryExtensionContext のaddBlockingEntry(withNextSequentialPhoneNumber:)メソッドを使って拒否したい電話番号を登録します。 電話がかかってきたときに着信拒否リストに当該番号が登録されていれば、着信画面は表示されなくなります。

iOS 11から差分データの提供が可能になった

iOS 11から差分データの提供が可能になりました。CXCallDirectoryExtensionContextに追加された着信拒否関連のメソッドは以下です。

removeBlockingEntry(withPhoneNumber:)removeAllBlockingEntries()isIncrementalがtrueの時しか使えないのでご注意ください。

おわりに

今回はCall Directory Extensionを使って特定の電話番号の着信を拒否する方法をご紹介しました。 発信者名表示とほとんど同じようなAPIで実装できるので簡単ですね。