ホーム画面のアイコンは直ったのに、通知だけ古いアイコンのまま表示される
めぐる日記のアプリアイコンを、アプリ内の「気分の傾向」で使っているドーナツ型のグラフをモチーフにした新しいデザインに差し替えた。 ホーム画面には綺麗に反映されたのに、通知だけ様子がおかしい。届いた通知の小さいアイコンが、まるでアイコンを一度も設定していないアプリみたいな、白背景に黒い線が入っただけのプレースホルダーになっていた。
まず疑ったところ
最初はアイコンの画像ファイル自体が壊れているんじゃないかと思って、生成したPNGを1枚ずつ検査した。サイズ、透明度、フォーマット、どれも問題なし。 次に疑ったのは、新しく使ったアイコン形式(Icon Composerという、レイヤーを重ねて立体的に見せる新しい仕組み)が、そもそも小さいサイズのアイコンを一切作らない仕様なんじゃないかということ。 実際、いろいろな設定を試してビルドの中身を覗いてみたけど、通知用の小さいサイズはやっぱりどこにも存在しなかった。
ただ、ここで引っかかったのが「じゃあSlackやGoogle Mapsみたいな、見た目が凝ってるアプリはどうして通知アイコンが正しく出てるんだろう」という点。同じ新しい仕組みを使っているはずなのに、向こうは動いている。
比較実験
そこで、今のアプリの複雑な部分(ウィジェット、写真の共有機能、広告表示など)を全部取り除いた、アイコンの表示だけを試すための最小限のテスト用アプリを別に作った。 使うアイコンファイルは本物と完全に同じもの。これで通知を試したら、あっさり正常に表示された。
つまりアイコンのファイルや仕組み自体には問題がなく、何かこのアプリ特有の事情があるということになる。ウィジェットを追加してみる、広告のSDKを組み込んでみる、複雑な設定を1つずつ足していく、という地味な作業を繰り返したけど、どの状態でも通知アイコンは変わらず正常に表示され続けた。
気づいたこと
テスト用アプリと本物の決定的な違いに気づいたのはかなり後になってから。テスト用アプリは最初から一度も「壊れたアイコン」を経験していない、真新しいアプリだった。 一方で本物のめぐる日記は、開発中に何度もアイコンを作り直していて、その過程で一時的に見た目が壊れていた時期が何度もあった。
端末を再起動してから、もう一度アプリを削除して入れ直し、通知を試してみたら――正しいアイコンが表示された。
結局の原因
通知センター側が、アプリを識別するID(Bundle ID)に対して、過去に表示していたアイコンの状態を裏側でキャッシュしていて、それがアプリ本体を削除・再インストールしても消えない場所に残っていた、というのが実態だったらしい。 端末の再起動でそのキャッシュがクリアされて、ようやく最新のアイコンが表示されるようになった。
コードにもビルド設定にも、Xcodeやアイコンの新しい仕組みにも、何の問題もなかった。ただ端末の中に、開発中の試行錯誤の跡がキャッシュとして静かに残っていただけだった。
持ち帰ったこと
- アプリアイコンを開発中に何度も差し替えていると、通知センターのような周辺機能が古い状態をキャッシュし続けることがある
- 「アプリを消して入れ直す」と「端末を再起動する」は別物で、一部のキャッシュは前者では消えない
- 見た目に関する謎の不具合に当たったら、コードを疑う前に、まず端末側に残った古い状態を疑ってみる価値がある