Appleのカレンダーアプリは、今日の曜日と日付がアプリアイコンになる。
これはサードパーティのアプリでは不可能で、なんとも羨ましいと常々思っていた。
iOS10.3でその制限が少し緩和されて、サードパーティアプリでもアップデートなしでアプリアイコンが変更できるようになった。
該当のメソッドは、UIApplicationの setAlternateIconName。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let iconName = "sampleicon" | |
UIApplication.shared.setAlternateIconName(iconName) { (error) in | |
if let e = error { | |
print(e) | |
} | |
} |
つまり、サーバーからダウンロードした画像や、アプリ内で作成した画像を設定することはできない。
Staticな画像をアプリに入れ、Info.plistに設定した名前を渡す必要がある。
Info.plistに設定が必要なのは少々面倒だが、アプリアイコンもレビューの審査対象になっていることを考えると、しょうがないのかもしれない。
とはいえ、できることが増えたのは嬉しい限り。
アプリアイコンを変更すること自体はすぐにできたのだが、混乱したのは変更時に表示されるダイアログ。
このダイアログは、setAlternateIconName で変更すると強制的に表示されるもので、削除することはできない。
「アプリアイコンが変更されたことをユーザに知らせるべきだろう」というAppleのポリシーは理解できるので、表示自体は問題ではないのだけれど、実は、このダイアログが表示されないパターンがある。
ダイアログが表示される/表示されない の差が何かは実はよくわからなかった。
このコードを呼ぶときに表示されている画面の種類に依存するような....?
ただ、iOS10では表示されないコードを、iOS11 beta2で試すと表示されたことから、表示されないということ自体がバグなのであろう と思う。
私がsetAlternateIconNameを最初に試した時、ダイアログが表示されないパターンだったためこのダイアログの存在を暫く気づかなかった。
気づいていない場合、とても危険なことをしてしまう可能性がある。
たとえば、setAlternateIconNameをアプリ起動時の度にを呼ぶ とか、一定時間たったら自動的に呼ぶとか。
ダイアログが表示される以上、
勝手に裏でアプリアイコンを変更する という仕様はNGで、
ユーザが画面上で「アイコンを変える」という操作をした時のみ変わる
ように仕様を考えないといけない...ということ。
罠には気をつけてお使いください!