iOSDC2017で Alternate Icons についてLT登壇してきました

1年に1度iOSアプリ開発者が集まるお祭り「iOSDC2017」が、2017/9/15~17の2.5日間で行われました。

昨年より規模が拡大し、多くのiOSアプリ開発者が集まったこの勉強会の2日目に、いつかどこかで使ってみたい「きせかえアイコン」を実装してみた というタイトルでLTをさせていただきました。

この記事では本LTの技術的な側面の内容紹介と補足をしたいと思います。

使用したスライドはこちら

サンプルコード (GitHub)

きせかえアイコンと実装したアプリについて

alternate icons

本LTできせかえアイコンという表現をした機能は、「Alternate Icons」という機能です。

ホーム画面に表示されるアイコンを、アプリ内から変更することができる機能です。

活用方法

ニフティでは、現在「しろたん」というキャラクターとコラボしている「まとめてバイト探し」アプリにおいて、しろたんの人気投票を行った結果の上位10キャラクター分について、アイコンを作成し、アプリから切り替えられるようになっています。

興味のある方は、ぜひ実機で試してみてください。

まとめてバイト探しアプリをAppStoreで開く

きせかえアイコン できること・できないこと

できること・できないこと

この機能を使うと、ホーム画面に表示されるアイコンを、アプリ内から変更することが可能です。
変更は任意のタイミングで行うことができますので、ユーザーに選択してもらうことも、特定の条件を満たしたときに変更することも可能です。

ただ、バックグラウンドでアイコンを変更したり、時計のように動的に生成することはできません。変更時は必ずOS標準のダイアログが表示されます。
また、アイコン画像はアプリにバンドルし審査を通す必要があるため、ダウンロードした画像を設定することもできません。

実装方法について

実装方法

実装は非常に簡単で、UIApplicationsetAlternateIconName(_:completionHandler:)を呼び出すだけです。

ここで、iconNameとして指定する名前やファイル名は、info.plistで指定します。

※この機能はiOS10.3+でのみ利用可能ですので、呼び出す際は必ずOSチェックをするようにしてください。

デフォルトアイコン

また、切り替えを設定していない時のデフォルトアイコンは、通常通り設定から変更する方法と、info.plistから指定する方法の2種類があります。

実装時のTips

ここからは、実装した際にはまりやすいポイントや、注意すべきポイントを紹介します。

xcassetsを使えない

xcassetsを使えない

デフォルトアイコンを除き、xcassetsでアイコン指定をすることができません。pngファイルを直接プロジェクトに加えることになります。

アイコンのサイズ

アイコンのサイズ

xcassetsのAppIconを指定できないため、アイコンのサイズに困ることになります。ドキュメントを探したのですが、見つけることができませんでした。

手元で確認したところ、 60ptx60ptのアイコン(@x1, @x2, @x3)を用意しておけば、通知や設定アプリでも問題なく表示されるようでした。
このあたりのサイズ調整はOS側でやってくれているのでしょうか。

(もし正しい実装方法がありましたら、指摘いただけますと幸いです。)

iPad対応について

iPad対応について

設定によって、「iPhoneでは正しく切り替えられるが、iPadでは切り替えようとするとクラッシュする」場合があります。

  • 前述のデフォルトアイコンをxcassetsで指定している
  • そのデフォルトアイコンのAppIconにiPad用のアイコンサイズが用意されている

を満たすと、このクラッシュが発生します。
たとえ Target Device が iPhone に設定されていたとしてもこのクラッシュは発生しますので、注意が必要です。

この場合、AlternateIconsにもiPad用の指定が必要となります。
GitHubのサンプルではiPhone用の設定をキーだけ変えてコピーしていますが、iPad用サイズのアイコンを別名で用意する方がベターかもしれません。
(推測ですが、ちゃんとiPad用のアイコンが指定できるように、このような仕様になっているのだと思いますので…。)

アイコン画像のキャッシュについて

キャッシュについて

アイコン画像を一度変更すると、OS側でキーをもとにアイコン画像をキャッシュしているような動作が確認できています。

開発段階で、キーを同じにしてアイコン画像だけ差し替えたとき、一度そのキーのアイコンに切り替えたことがある端末では画像が変わらないことがありました。

アプリを再インストールしても動作が変わらなかったため、シミュレーターの場合はコンテンツの全削除等を行なうと良いでしょう。

アイコンの削除について

これは当日紹介しませんでしたが、きせかえアイコンが設定された状態で、アプリバージョンアップにより該当キーのアイコンがinfo.plistから削除された場合、デフォルトのアイコンに自動で戻るようになっています。

おまけ:Androidについて

LTでは「キャラクターをお持ちのアプリでぜひ使ってみて」とオススメしたこの機能ですが、Androidには同様の機能がありません。

代替機能として、Androidにはウィジェット機能があります。
ユーザー側でホーム画面に設置する操作をする必要がありますが、そちらを使って実装する方が良いかと思います。

一応(公式ではサポートされていませんが)アプリショートカットを作り直す(要権限)という方法で実現できるという記事を見かけましたので、参考までにご紹介しておきます。
なお、特に検証等はしておりませんので、実装する際は自己責任にてお願いします。

https://stackoverflow.com/questions/1103027/how-to-change-an-application-icon-programmatically-in-android

まとめ

LTでは「制限が強く、賑やかし程度にしかならない」という表現をしましたが、アプリに愛着を持ってもらう・ファンを増やすという意味では、効果的な機能だと思っています。

比較的新しい機能であることもあって、日本では事例をほとんど聞いたことがありませんが、ユーザーには喜んでもらえる機能だと思いますので、ぜひ使ってみてください。

最後に

昨年のiOSDCは、すでにSwiftを使ったセッションがほとんどで、当時フルObj-Cのアプリを担当していた私にはとても刺激的でした(その後、Swiftを導入するきっかけにもなりました)。
そのような思い出深い場で今年は登壇する側に回ることができ、非常に嬉しく思っています。

また(お酒の力もあってか)非常に和やかな雰囲気でLTをすることができ、とても楽しかったです。聞いてくださった皆さま、また場を作り上げてくださった皆さま、ありがとうございました。