見出し画像

Now in REALITY Tech #63 RealityでE.164番号を扱ってみた

はじめに

REALITYのAndroidエンジニアのhosicoです。
2022年の10月からREALITYのAndroid開発チームにjoinしまして、あっという間に半年近く経ってしまいました。REALITYでは、気さくで親切な方が多いので、楽しく日々開発しております。あと、花粉症がつらいです。

そんな自分ですが、最近は、電話番号を扱った機能のAndroid開発をしております。電話番号は、センシティブな個人情報であるため、開発する機会があまりないのでは?と思っており、折角のいいタイミングなので、今週の「Now in REALITY Tech」では、以下をざっくり簡単に紹介しようかなと思います。

  • 電話番号を扱う上で重要な概念だったE.164番号

  • E.164番号を扱う上で便利だったライブラリ

  • 現在、開発中の機能について


E.164番号とは

ITU-T(国際電気通信連合 電気通信標準化部門)によって定められた国際電話番号のフォーマットであり、国際的に一意な電話番号となります。

例えば、日本のケースで考えると、「080 □□□□ ○○○○」というローカル形式の電話番号の場合、それをE.164番号で表現すると、日本の国番号が81になるので、「+81 80 □□□□ ○○○○」という並びになります。海外から日本に向けて電話をかける場合は、このE.164番号を使う必要があります。

E.164番号は、1〜3桁の国番号が先頭に配置され、その後ろにローカル形式の電話番号が並び(先頭が0の場合、それを除く)、全体として15桁以下になるように構成されています。

現在、REALITYで電話番号を扱う機能を開発してるのですが、Realityアプリは、日本以外の62カ国に配信されているため、このE.164番号を扱う必要が出てきました。

電話番号を扱う機能について

REALITYでは、FacebookやTwitterなどの外部SNSアカウントとREALITYのアカウントを連携させて、SNSアカウントの情報でREALITYにログインできたり、SNSで繋がっている友だちや知り合いとREALITY上で繋がることができます。

今回、新しくREALITYアカウントと電話番号を連携させることで、
連絡帳アプリに登録している友だちや知り合いとREALITY上で繋がることができるような機能を開発しております。
(このBlogが公開される頃には、ひょっとしたら、リリースされているかもしれません)

電話番号との連携において、その電話番号が本人のものであるかどうかを確認するため、グローバルでのSMS認証を行う必要があります。
SMS認証機能は、REALITYになかったため、今回Twilioを使って実現するのですが、Twilioでは、E.164番号のフォーマットを採用しているため、REALITYでも、E.164番号を扱う必要が出てきました。

https://support.twilio.com/hc/en-us/articles/1260803420489

E.164番号を扱う上で便利だったライブラリ

Twilioに電話番号の情報を渡す際に、国ごとのローカル形式の
電話番号を、E.164形式に変換するという処理が必要でした。

変換処理は、クライアント側で行うことになったのですが、国によって、ローカルの電話番号やE.164番号のフォーマットは異なっているので、自前で変換処理を書くことは、実装コストが高いです。

そこで、何かこの辺りの処理をよしなにやってくれるライブラリなどないかなーと探していたのですが….
libphoneumberという国際電話番号を扱うGoogle製ライブラリがありました。Javaだけではなく、SwiftやPythonなど様々な言語に対応しているみたいです。

libphonenumberを使った E.164番号への変換

ローカル形式の電話番号から、E.164番号への変換処理は、以下のコードで簡単に実現できてしまいます。
(変換する際に、CountryCodeを指定する必要あるので、その部分だけ国別に定義する必要はあります)

try {
    val parsedNumber = PhoneNumberUtil.getInstance().parse(localPhoneNumber, countryCode)
    val e164Number = PhoneNumberUtil.getInstance().format(parsedNumber, PhoneNumberUtil.PhoneNumberFormat.E164)
} catch (e: NumberParseException) {
    // 変換に失敗した際は、NumberParseExceptionが投げられる
}

今回、アカウントに連携してもらう電話番号は、ユーザに入力してもらう想定でいたので、下記のように、同じ電話番号でもユーザによって表記揺れが発生するケースがありました。

  • 080□□□□○○○○

  • 080-□□□□-○○○○

  • 080(□□□□)○○○○

  • +8180□□□□○○○○

しかし、libphonenumberのformatメソッドを使えば、表記揺れも吸収して
同一の結果を返してくれるので、非常に便利でした。

最後に

今回は、電話番号を扱った機能を自分が実装しているということで、いくつかポイントを絞って、紹介させていただきましたが、他にも苦労した点など色々あるので、別の機会にまた紹介できればなと思ってます!

REALITYでは現在一緒に働く仲間を積極的に募集しています!
少しでも興味が湧いたら下記フォームから気軽にカジュアル面談をお待ちしています。

REALITYエンジニアカジュアル面談お申し込みフォーム