[CallKit]発信者名表示できない電話番号のはなし

本記事は、 [Sansan Advent Calendar 2018](https://adventar.org/calendars/3423)の21日目の記事となります。

私は普段 `法人向けクラウド名刺管理サービスSansan` のiOSアプリ(最近はAndroidアプリの方も)開発に従事していますが、本日は私が今年印象に残ったiOSに関するTipsを共有したいと思います。

テーマはズバリ `CallKitを使った着信時発信者名表示` です。

# iOSにおける着信時発信者名表示について

`着信時発信者名表示` 機能とは、予め登録した電話番号から着信があった場合に発信者の指名が表示されるという機能です。[^1]

<img src="https://qiita-image-store.s3.amazonaws.com/0/122081/55c2bd43-e49e-40b2-0e7f-4109f6c6d2aa.jpeg" width=25% />

iOSにおいて、着信時の発信者名表示機能を実装する場合はCallKitを使うことになります。

詳しい実装方法については、日本語だとクラスメソッドさんの下記記事が最も参考になると思います。初めて作る人から実装に詰まった人まで、まずは下記記事を一読することをオススメします。

[[CallKit] 思わぬハマリどころも！Call Directory Extensionを使って着信時に発信者名を表示する ｜ DevelopersIO](https://dev.classmethod.jp/smartphone/iphone/callkit-call-directory-extension-identification/)

# 発信者名表示できない番号

`090-xxxx-xxxx` や `03-xxxx-xxxx` のような、世の中で一般的に使われる電話番号については、0はじまりであることが多いです。0はじまりの電話番号の場合は、先程紹介したクラスメソッドさんの記事のように `電話番号の先頭の0を国番号に置き換えたものをCall Directory Extensionに登録する` ことで発信者名表示させることができます。[^2]

例えば `090-1111-2222` のような電話番号の場合 `819011112222` をCall Directory Extensionに登録する必要があります。

ところが、ある日サンプルアプリを使って色んな番号を試していくうちに、次の事実に気づきました。

```
0はじまりでない6桁の電話番号について、発信者名表示できない
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/122081/a7f505c8-319c-2c66-b8c5-afe757817544.jpeg" width=25% />

そもそも、0はじまりでない電話番号自体、内線番号やプレフィックス番号付き電話番号[^3]などの特殊なケースでしか来ない番号のため、調べても解説記事が全然なく、途方に暮れました。

色んな番号で試していくうちに、下記のようなことがわかりました。

1. 0はじまりでない2〜4桁の番号は発信者名表示できる
<img src="https://qiita-image-store.s3.amazonaws.com/0/122081/bc7db879-33e7-d7e1-615e-835c5ef193f7.jpeg" width=15% />

1. 0はじまりでない5〜9桁の番号は発信者名表示できない
<img src="https://qiita-image-store.s3.amazonaws.com/0/122081/d6216d86-b896-3640-87da-1c7fe5de062e.jpeg" width=15% />

1. 0はじまりの5〜9桁の番号は発信者名表示できる(先頭の0を国番号に置き換える必要あり)
<img src="https://qiita-image-store.s3.amazonaws.com/0/122081/d9b7feca-ea2b-11d1-9876-ab53c2fb55ed.jpeg" width=15% />

1. 0はじまりでない10桁以上の番号は発信者名表示できる
<img src="https://qiita-image-store.s3.amazonaws.com/0/122081/2aaaff5c-6218-af59-38e3-e7172502d95a.jpeg" width=15% />

従って、 `0はじまりでない5〜9桁の電話番号を何とかしないといけない`ということがわかりました。[^4]

# どう解決したのか？

表示できないと困るので、何とかして表示しようと色々と試行錯誤をした結果、ついに解決策にたどり着くことができました。

それは 

```
0はじまりでない5〜9桁の番号についてのみ、先頭に国番号を付加する
```

です。

例えば、先程例として挙げた `331111` のような番号の場合は国番号を付加した `81331111` を登録してあげれば良い、ということです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/122081/0486cc88-d8bb-1c6e-06cc-83e553377125.jpeg" width=25% />

CallKitの仕様なのかバグなのかは未だによくわかっていないですが、これで無事に0はじまりでない5〜9桁の電話番号でも発信者名表示できるようになりました :tada:

ちなみに、0はじまりでない2〜3桁の番号、および0はじまりでない10桁以上の番号に国番号を付与した場合は、逆に発信者名表示できなくなりました。

# まとめ

0はじまりでない電話番号については、桁数によって登録する際に国番号が必要かどうかが変わるので、もし仕様としてどうしても0はじまりでない電話番号まで対応しないといけない場合は注意して実装すると良いでしょう(テストを書くのをお忘れなく)。

最後にちょっとした宣伝を。毎年お世話になっている[別なAdvent Calendar](https://adventar.org/calendars/2915)で、今年は[Google Fuchsiaについての記事](https://kotetuco.hatenablog.com/entry/2018/12/14/073412)を書いたので、よかったらこちらもどうぞ。

# Sansan株式会社は積極採用中

Sansan株式会社は現在、モバイルアプリケーション開発を担っていただけるエンジニアを[絶賛積極採用中](https://hrmos.co/pages/sansan/jobs/1000207)です！

# 余談 : Speakerboxの代替サンプルコード `Speakerbox` について

クラスメソッドさんの記事でも取り上げられていますが、CallKitの実装サンプルとして、以前は `Speakerbox` というサンプルプロジェクトがApple Developerで配布されていました。

Speakerboxは実装サンプルという側面だけでなく、任意の電話番号からの着信時発信者名表示をシミュレートすることができるため、動作検証には大変重宝するサンプルでした。

しかし、今年のどこかのタイミングで突然削除されてしまいました。。

代わりになりそうなサンプルコードを探していたところ、Github上に、その名も `Speakerbox` という、本家と同じような名前でやってることもほとんど同じプロジェクトを発見してしまいました :thinking: 

気になった皆さんはGithub上で `Speakerbox` でリポジトリ検索してみてください。

上記リポジトリを使わずとも、勉強のために自分で Speakerbox 風のサンプルアプリを作ってみるのも良いかもしれませんね(私も時間ができたら作ってみたいです)。

[^1]: 着信時発信者名表示機能が使えるのはiOS10以降です。
[^2]: 日本の場合、国番号は `81` です。その他の国番号については [こちらのサイト](http://www.001.kddi.com/countrycode/index.html) が詳しいです。
[^3]: 主に中継電話(契約している事業者の中継電話の設備を経由させることで電話料金を安くできる仕組み)で使われる、電話番号の先頭に付加する番号のことです([参考](http://www.itmedia.co.jp/mobile/articles/1601/13/news146.html))。私は社会人になってから今まで、プレフィックス番号という存在を知りませんでしたし、これまでの職場でプレフィックス番号をつけてかけるように指示されたこともありませんでした。ある意味で幸せな人生を過ごせていたのかもしれません。
[^4]: 実はそれ以外でもうまくいかない番号のパターンがありましたが、そもそも電話番号としての有効性がかなり怪しいと思われる番号や桁数ばかりだったので、あまり考慮しなくて良いと思います。