【Xcode14.3】FirebaseUI-iOSでデフォルト国コードがアメリカ合衆国になる🇺🇸

こんにちは。
withでiOSアプリの開発を行っている @zrn-ns です。

Xcode 14.3環境での FirebaseUI-iOS を利用した電話番号認証のデフォルト国コード表示の問題に関して調査を行ったので、その結果を知見として共有いたします。

:::note info
最後に追記してありますが、2023/09/20にこちらの問題の修正を含む FirebaseUI-iOS　v13.1.0 がリリースされています。
:::

# TL;DR

[FirebaseUI for iOS](https://github.com/firebase/FirebaseUI-iOS) 標準の電話番号認証画面を利用している場合、 **Xcode 14.3 以降でビルドすると、認証画面を表示したときに表示されるデフォルトの国コードが「アメリカ合衆国(+1)」になります**。

現時点の対応策は、 **Xcode14.3未満でビルドする** か、 **認証画面を独自で実装する** ことです。

# 検証環境

- firebase-ios-sdk: 10.14.0
- FirebaseUI-iOS: 13.0.0
- macOS: 13.0(Ventura)
- 検証端末: iPhone XR, iOS 16.5.1
- Xcode：
    - 問題が発生するバージョン: 14.3.1
    - 問題が発生しないバージョン: 14.2

# 問題の内容

先日、Xcodeのバージョンを `14.2.X` から `14.3.X` にアップデートしたのですが、その際 FirebaseAuth を利用した電話番号認証で、とある問題が発生しました。

それは **電話番号認証画面の電話番号のデフォルト国コードがアメリカ合衆国（`+1`）になる** というものです。

検証端末(iPhone等)のバージョンを上げたときにアプリの挙動が変わることは割とよくありますが、Xcodeのマイナーアップデートでアプリの挙動が変化するのは稀なので驚きました。

今回はこの問題について、原因の調査を行いました。

Xcode 14.2 ←||→ Xcode 14.3.1

<img width="200pt" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95499/6f1cf357-39c9-1cd9-f35f-65329e2b1302.gif" />

<img width="200pt" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95499/3836ea5e-92d7-b39b-8834-b9ac0e4d20e0.gif" />


# 原因

Apple Developer Forumで以下のスレッドを見つけました。

https://developer.apple.com/forums/thread/714876

> iOS 16 CTCarrier deprecation
 Core Telephony Deprecations CTCarrier, a deprecated API, returns static values for apps that are built with the iOS 16.4 SDK or later. (76283818)

iOS 16.4 SDK は Xcode 14.3と同義です。
Xcode14.3未満では、Core Telephonyの `CTCarrier.isoCountryCode` にアクセスすることで`+81` のような国コードを取得できたようなのですが、このAPIは現在非推奨となっており、Xcode 14.3からは固定値が返るようになっているとのことです。

**FirebaseUI-iOSではこのAPIを使用してデフォルト国コードを表示していたため、国コードが自動判定されなくなり、結果常にアメリカ合衆国の国コードが表示されるようになってしまった、ということのようです。**

FirebaseUI-iOSのコードを見に行ったところ、実際デフォルト国コードを取得する処理（`FUICountryCodes.m` の127行目）で `CTCarrier.isoCountryCode` にアクセスしていたため、ここが原因と考えられます。

https://github.com/firebase/firebase-ios-sdk/pull/11144/files#diff-3a934413225106a28df9b7ab30dc0173a1bb28eeffecf98691ca41c0765250fb

よって **Firebase UI側で対応が行われない限り、この問題は解消しない**と考えられます。

（そもそもApple側のAPIが非推奨になっているので、Firebase側も修正は難しいかもしれませんが...）

# 現時点での対処法

現時点で開発者側がとれる対応としてはいくつかあります。

### 対処法A. Xcodeのバージョンを14.3未満に戻す

Xcode 14.3未満ではこの問題は発生しないため、Xcode 14.2を使い続けることでこの問題を回避する事ができます。
しばらく待っていれば、FirebaseUI側がこの問題に対処してくれる可能性はあります。

また今回の問題について、 FirebaseUI-iOS のリポジトリにIssueを起票してあります。
https://github.com/firebase/FirebaseUI-iOS/issues/1155

**上記のIssueに👍をつけてくれれば、優先的に修正をしてくれるかもしれません**。(神頼み🙏)

### 対処法B. FirebaseUI-iOSのリポジトリをForkして当該処理を修正する

FirebaseUI-iOSのソースコードは Apache License Version 2.0 で配布されているため、自由に改変してアプリ内に組み込むことができます。
特定の国のみで提供しているアプリであれば、デフォルト国コードを設定する処理を書き換えることで、任意の国コードを表示することが可能だと考えられます。

しかし、この方法をとる場合、FirebaseUI-iOS本家に更新があった場合に随時差分を取り込む必要があり、できれば避けたいところです。

### 対処法C. 電話番号の認証画面を自力で実装する

FirebaseUI-iOSを使用しなくても、認証画面を自力で実装する事は可能です。

https://firebase.google.com/docs/auth/ios/phone-auth?hl=ja

面倒ですが認証画面を自力で実装すれば、この問題を回避できます。

### 対処法D. 諦める

正直電話番号の国コードを選択する手間はそれほど大きくないとは思います。
UXと開発効率を天秤にかけて、諦めるという判断ができるのであれば、諦めるのも一つの手だと思います。

# 最後に

少しでも皆さんの開発の手助けになれば幸いです。
致命的なレベルの問題ではないですがユーザ体験は低下するので、早く修正が行われるとよいですね。


# PR

withではエンジニアの採用を行っています。
興味があれば、ぜひお問い合わせください！

https://enito.co.jp/careers/

# 【2023/09/22】追記

こちらの問題が修正された FirebaseUI-iOS v13.1.0 がリリースされました！🎉

https://github.com/firebase/FirebaseUI-iOS/releases/tag/v13.1.0

`FUIPhoneAuth.defaultCountryCode` に任意の値を設定することで、デフォルト国コードをUS以外の国に変更する事ができます。メンテナの方に感謝！！