iOSアプリのアイコンを任意のタイミングで変更する方法(アイコンの動的変更)

##はじめに
先日、アプリのアイコンを変更することでユーザのアプリを開く手間を削減するといった内容のアプリをリリースしました。
そこで、アイコンを動的に変更する方法とリリース方法を自分なりにメモとして残しておきます。

##開発環境
Xcode 10.1
Swift 4.2.1

##準備するもの
アイコンを3つ（サイズ：1024px）

##ストーリボードにボタンを配置
<img width="1440" alt="スクリーンショット 2018-12-24 17.42.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/173720/e3879b74-70e4-178e-701a-ad7002ea0614.png">

こんな感じ
ボタンが押されたタイミングでアイコンが変更されるようにする。
<img width="1440" alt="スクリーンショット 2018-12-24 18.30.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/173720/2b3a5325-eb7f-dd2c-cd15-9e1a972441d1.png">
関連付けは忘れずにしておくように。

##プロジェクトにアイコン画像を入れる
今回は以下の画像を使用
![icon.png](https://qiita-image-store.s3.amazonaws.com/0/173720/6d5bdc5d-0891-7fa8-513d-6c80710e681b.png)![icon1.png](https://qiita-image-store.s3.amazonaws.com/0/173720/0f56c709-3b27-f07e-14dc-b62788e068cf.png)![icon2.png](https://qiita-image-store.s3.amazonaws.com/0/173720/61fe97b0-da54-fe8a-2168-b5ebf134dff5.png)![icon3.png](https://qiita-image-store.s3.amazonaws.com/0/173720/c37cdfa5-0220-9c96-f236-fe8ab16a5a1c.png)
白のアイコンをデフォルトのアイコンとする。

##コーディング
の前にInfo.plistを編集する。
<img width="1440" alt="スクリーンショット 2018-12-24 18.05.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/173720/697fad01-3089-4ded-a773-5ab22a74c8f8.png">

そして**Icon files（iOS 5）を追加**<img width="1440" alt="スクリーンショット 2018-12-24 18.06.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/173720/2268122a-c180-1e4d-0cf9-194e5045b4e8.png">

**CFBundleAlternateIcons**というKeyを**Dictionary**型で追加
<img width="1440" alt="スクリーンショット 2018-12-24 18.08.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/173720/b88452b9-5dac-fa78-6b33-c9c446105ec1.png">

さらにDictionary型でIcon1を追加
さらにその下に**CFBundleIconFiles**というKeyを**Array**型で追加
その下にitemを**String**型で追加し，**Value**にアイコン画像の名前を入れる（拡張子は不要）
<img width="1440" alt="スクリーンショット 2018-12-24 18.17.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/173720/076228dd-66c7-3d07-a81b-f8d6cd796035.png">
あとは同じものを残りのアイコンの分も行う．コピペが可能。
このようになっていればOK
<img width="1440" alt="スクリーンショット 2018-12-24 18.18.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/173720/195dee9a-a8da-7621-bfcf-01d9e227fd3d.png">

あとは，アイコンを変更するコードを書くだけ．

##今度こそコーディング
といっても，簡単にできてしまう．

```swift
let iconName = "Info.plistに書き込んだアイコンのKey"
UIApplication.shared.setAlternateIconName(iconName, completionHandler: { error in print(error as Any) })
````

今回作ったサンプルにプロジェクトだとこうなる。

```swift
// アイコン1のボタンに関連付け済み
@IBAction func changeIconBtn1(_ sender: Any) {
    let iconName = "Icon1" // icon1.png(赤色のアイコン)
    UIApplication.shared.setAlternateIconName(iconName, completionHandler: { error in print(error as Any) })
}
```

ちなみに**nil**にするとデフォルトのアイコンになる。

```swift
UIApplication.shared.setAlternateIconName(nil, completionHandler: { error in print(error as Any) })
```

##実際に動かしてみた
![sample_movie_1(1).gif](https://qiita-image-store.s3.amazonaws.com/0/173720/4d36629a-87dc-b264-cee9-046298054f3b.gif)

でけた。ほんとに簡単。それでは。

##1/28追記 リリースする際の注意事項
####必ずユーザからの入力(ボタンタップなどの操作)のみにおいて変更する
リリース済みアプリでは開発段階では天気が変更されたタイミングで自動的にアイコンも変更していました。しかしそれではHuman Interface Guidelinesにそぐわない為リジェクトされました。
####デフォルトのアイコンへ戻すことができるようにしておく
こちらもHuman Interface Guidelinesに記載されています
####@2x.png(120 x 120)，@3x.png(180 x 180)のサイズのアイコンをプロジェクトに入れておく
こちらも(ry
Human Interface Guidelinesをよく読めということですね。
詳しくは[こちら](https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/)に載っています。英語ですが頑張って読みましょう。