【アプリ開発】その文言、新OSになっても同じこと言えるの？を考える

iOSアプリを開発していると、年に1度最新OSへのアップデート対応があると思います。

私が携わっているLIFULL HOME'SのiOSアプリ（以降、HOME'Sアプリ）も例外ではありません。
これまでにOSの仕様に合わせてさまざまなアップデート対応をしてきましたし、私が関わる前からも対応されてきました。

今回は、その中でなかなか気づかれずに負債となってしまっていたアプリの仕様に遭遇して対策を考える機会があったので、それについて紹介します。

# 気づいた負債
HOME'Sアプリ内ではカメラを用いる機能があります。

カメラを利用するには、ユーザがアプリ内でアクセス許可をする必要があります。
初めてカメラを利用する機能を使おうとすると、下記のようなアラートを出るのが一般的ですね。

<img width="370" alt="camera-access.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550560/93a619d0-8cf7-35dd-6dbf-cdc189b1b088.jpeg">

HOME'Sアプリでは、カメラのアクセス許可のアラートを出すことはもちろん対応していますし、アクセス未許可状態でカメラの機能がある画面に遷移しようとした時には、下記のアラートを出してユーザにカメラ許可を促すようにしています。

<img width="370" alt="camera_no_authorize_old.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550560/5c2adcba-bc2a-1fbd-5ffe-880616511f5a.png">

一見何の変哲もないよくある仕様かと思います。
しかしこれが負債となっていることに気づきました。では、何がいけないのでしょうか🤔


正解は`文言の案内が誤った内容になっている`でした。
実際にお手持ちのiPhoneを使ってアラートの文言の通りに操作してみてもらえれば異変に気づくはずです。

執筆時点では`iOS16系`が最新バージョンかと思いますが、設定アプリを開いてみると下記のようになるはずです。
<img width="370" alt="setting1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550560/2dc2755d-e399-f49a-2a6e-df9693dcc77e.jpeg">

ん、、`プライバシー`はないけど`プライバシーとセキュリティ`はあるけどこれか？と少し困惑します。
試しに押していくと`カメラ > [該当のアプリ]`という流れでカメラのアクセス許可は設定できました。 

<img width="600" alt="setting_img.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550560/73d61e95-352b-8def-15d8-2822a01d8c4e.jpeg">

また、この経路ではない方法でもカメラアクセス許可ができます。
設定アプリを開いた直後に下にスクロールしていくと、端末にインストールされているアプリの一覧が表示され、そこからアプリを選択すると下記のようにアプリ内で利用されているアクセス許可の必要な機能の一覧が表示されます。

<img width="370" alt="setting2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550560/4143bed2-9aba-704d-96ef-3f01b0152711.jpeg">

では本題に戻って、なぜアラートの文言の説明が違ったのでしょう🤔

# 原因調査
アラートの機能をリリースするときにテスト観点が甘かったとかは正直考えにくい。
該当の処理が書かれたのはいつだったのか、コード履歴を探ってみました。

すると、該当箇所は`2016年`に書かれたコードであることがわかりました。
その年代と当時のOSを照らし合わせると、`iOS10`の頃でした。

その当時の設定アプリはどのような見た目だったのかを、Googleで画像検索してみると、iOS10時代にまとめられたであろう[こちらのサイト](http://webmemo.biz/ios10-screenshot-silent/)に辿り着きました👀
見てもらえるとわかるように、サイトで取り上げている箇所とは異なりますが、よく見ると`プライバシー`という項目が当時あったことがわかったのです。

それからどこかのOSバージョンのアップデートのタイミングで、今の設定アプリの仕様に変わったのでしょう😇

- 文言の定義に関する箇所なので、新OS対応時のXcodeのビルドで時に**エラーが出ない**
- HOME'Sアプリの中でも物件検索や閲覧機能に比べて利用数の低い箇所だった（=**コア機能ではない**）ので、開発サイドも**確認頻度が低く気付きにくかった**
- クラッシュしたり、閲覧したい情報が見れないような**クリティカルな問題ではない**のでユーザサイドとしても問合せするほどの問題ではない

といった理由でこれまで気づかれなかったのかなと考察しました。

# 実際に行った対応
改修前の文言のように現OSバージョンの設定アプリに合わせて文言を修正するのも考えましたが、次のOSバージョンで同様に設定アプリの仕様が変わったら同様の負債を抱えることになり得ます。

よって設定アプリの仕様が変わっても、不変で伝わる文言にする必要があると考えました。
その結果、修正して少し抽象的な表現に変わりました。

<img width="370" alt="camera_no_authorize_new.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550560/79ecfdc6-6913-86b2-086c-acc25fea984a.png">

完璧なガイドにはなりませんが、どの設定アプリがどういう仕様になったとしても通じるような表現にしました。
`設定アプリ`、`LIFULL HOME'Sアプリ(アプリ名)`、`カメラ設定`といったヒントになるようなキーワードはそのまま残しました。

これによって該当箇所のアラート文言の保守性は高まったのではないでしょうか。

## Befor / After

ここで見比べてみましょう。

|Before|After|
|---|---|
|<img width="370" alt="camera_no_authorize_old.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550560/5c2adcba-bc2a-1fbd-5ffe-880616511f5a.png"> | <img width="370" alt="camera_no_authorize_new.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550560/79ecfdc6-6913-86b2-086c-acc25fea984a.png"> |

設定アプリの仕様に対する変化には強くなりました。
丁寧さは少し薄まったかもしれませんが、その中でもなるべく伝わるように。を意識した表現になったかなと思います。

あと改修前は`UIAlertController`の`title`は使わずに`message`に全ての文言を代入する形になっていて、区切りが曖昧で文字数が多い印象がありました。
なので、`title`と`message`に文言を分割して見やすくもしました。

文言の見せ方は何でこの形式だったのだろう...😅

# おわりに
今回取り上げた内容はコーディングに関する知見は特段必要ありません。

OSバージョンによって変更されるものは、処理の挙動はもちろんですが、標準のアプリの仕様にも影響があることがわかりました。
もし開発しているアプリ内で`設定`、`写真`や`連絡先`等のアプリを連携して用いていると、ガイドする機会もあるので、その時の仕様文言は**変更に強く、かつ伝わりやすい**ものを考えなければいけません。

アプリ以外でも、みなさんの携わるサービスに同様の不具合が潜んでいるかもしれないので、これを機に意識して見ると良いでしょう。

P.S.
WWDC23もあと2週間を切りましたね。
今年はどんなアップデートが来るんでしょうか。楽しみですね😄

# 参照
- [[Å] iOS10 カメラのシャッター音とスクショ音を消す方法を試したら本当に無音になった！](http://webmemo.biz/ios10-screenshot-silent/)
- [UIAlertController](https://developer.apple.com/documentation/uikit/uialertcontroller)
- [WWDC23 - Apple Developer](https://developer.apple.com/jp/wwdc23/)