anz blog

Alternate Iconsの設定の仕方

2019-10-16 #Xcode

ざっくりまとめ。

  • Alternate Icons の設定まとめ
  • Info.plist あたりで CFBundleIcons を記述したらおk
  • iPadは?
    • CFBundleIcons~ipad と記述します

です。

環境

  • Xcode v10.3

やりたいこと

Alternate Icons を利用したい!!

やっていき

ここらへんググればたくさんでてくるので、さくっと行きますw

用意している画像名は

  • wataten_icon@2x.png
  • wataten_icon@3x.png

です。

Info.plist あたりに下記の感じで記述したらおkです

<key>CFBundleIcons</key>
<dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>icon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>wataten_icon</string>
            </array>
        </dict>
    </dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string></string>
        </array>
        <key>UIPrerenderedIcon</key>
        <false/>
    </dict>
</dict>

で設定するコードは

UIApplication.shared.setAlternateIconName("icon") { error in
}

これだけです。

<key>icon</key> で指定する文字列が setAlternateIconName("icon") で指定する文字列に連動します。なのでこちらは任意です。
<string>wataten_icon</string> で指定する文字列は画像ファイルの名前と連動します。
追加する画像ファイルはアセットカタログに追加ではだめで、直接リソースとして追加する必要があります。

これで、アプリアイコンも変更できますね!
ちなみに、アイコンサイズを間違うと動作しません

iPad では。。?

このままだと、iPad では動きません。
前述したとおり、アイコンサイズが違うとエラーになるからです。
上記だけだと iPhone 用のアプリアイコンサイズでしか用意してないため、iPad では設定できないという流れ。

ここで疑問になるのが、iPad 用の設定はどうするのだろう?🤔 ということ。

こうなります!

<key>CFBundleIcons</key>
<dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>icon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>wataten_icon</string>
            </array>
        </dict>
    </dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string></string>
        </array>
        <key>UIPrerenderedIcon</key>
        <false/>
    </dict>
    <key>CFBundleAlternateIcons~ipad</key>
    <dict>
        <key>icon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>wataten_icon_ipad</string>
            </array>
        </dict>
    </dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string></string>
        </array>
        <key>UIPrerenderedIcon</key>
        <false/>
    </dict>
</dict>

<key>CFBundleAlternateIcons~ipad</key> っていうのを追加して iPhone と同じように記述します。

画像は

  • wataten_icon_ipad@1x.png
  • wataten_icon_ipad@2x.png

を新たに用意して追加してます。
これで無事に iPad でも使えるようになります!!💪

あれれぇ?アイコンはサイズあってないとダメじゃないの??

そう、iPad には3種類アプリアイコンのサイズがあります。

  • 76pt
  • 76x2pt
  • 83.5x2pt

83.5x2pt ... iPad Pro(3rd) の設定用のアイコンです。
上記までだとこれの設定は特にしていません。
が、iPad Pro(3rd) でも上記設定のママ、アプリアイコンを変更することはできます。
ただし、サイズがあってないことには変わらないので、ほかアプリアイコンと見比べるとあらく見えるかもしれません。
専用にちゃんと設定したくなりますが、どうしたら...🤔

<key>CFBundleIcons</key>
<dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>icon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>wataten_icon</string>
            </array>
        </dict>
    </dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string></string>
        </array>
        <key>UIPrerenderedIcon</key>
        <false/>
    </dict>
    <key>CFBundleAlternateIcons~ipad</key>
    <dict>
        <key>icon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>wataten_icon_ipad</string>
                <string>wataten_icon_ipadpro</string>
            </array>
        </dict>
    </dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string></string>
        </array>
        <key>UIPrerenderedIcon</key>
        <false/>
    </dict>
</dict>

<string>wataten_icon_ipadpro</string> というのを追記しました。
もちろん、wataten_icon_ipadproというファイル名で画像も追加します。
これで、iPad Pro(3rd) でもしっかりちゃんと変更できるようになります!

画像ファイル名の指定は array でできるので、多分ですが、@2xとかで命名しなくても

<array>
    <string>icon_60.png</string>
    <string>icon_120.png</string>
</array>

という書き方でもいけそうなきがします(やってませんが)