tva
← コラム

App Storeでアイコンが拒否されたときの対処:sRGB、アルファチャンネルなどの落とし穴

App Store Connectのアイコン検証は、失敗の原因を示してくれません。どの画像編集ツールでも完璧に見える1024×1024のPNGをアップロードしても、返ってくるのは「画像を処理できませんでした」といったメッセージです。色空間にもアルファチャンネルにも触れられず、App Storeへの申請がそこで止まってしまいます。

実際に検証される技術的なプロパティは限られており、一つでも条件を満たさないと同じ汎用エラーが出ます。よくある原因は、sRGB以外のカラープロファイル(通常は最新のデザインツールが出力するDisplay P3)、ストアが明示的に禁止するアルファチャンネル、そして頻度は低いもののインデックスカラーモードの三つです。2025年に作成するアイコンにインデックスカラーが使われるとは考えにくいですが、古い最適化パイプラインを通すと今でも発生します。原因が分かれば、いずれもターミナルから1分以内に修正できます。

App Store Connectが実際に求める要件

Appleが定めるApp Store掲載用アイコンの要件は明確です。ファイル形式はPNG、寸法は1024×1024ピクセルである必要があります。アルファチャンネルは一切含めてはいけません。一部が透明なものも、完全に不透明なものも不可で、アルファデータそのものがない状態が必要です。色空間はsRGBが推奨です。AppleのHuman Interface Guidelinesでは、アプリアイコンで使用できる色空間としてDisplay P3とGray Gamma 2.2も挙げられていますが、当社の経験では、App Store用アイコンにはsRGBが最も安全な選択です。カラーモードは、インデックスパレットではなくRGB TrueColorを推奨します。

アルファチャンネルが禁止されるのは、App Store Connectがアイコンの角丸処理と合成を独自に行うためです。アルファチャンネルがあると、その処理に干渉します。sRGBが必要なのは、ストアが異なるディスプレイプロファイルを持つ幅広い端末でアイコンを表示するためで、sRGBが共通の基準になります。Appleの広色域色空間Display P3は、Figma、Sketch、Affinity Designerなどでよく使われる書き出しオプションです。当社の経験では、P3タグ付きアイコンが、このガイドで扱う多くのエラーの原因になっています。

sipsで問題を診断する

macOSには、外部の依存ツールなしで画像を調査・変換できるコマンドラインツールsips(Scriptable Image Processing System)が付属しています。アイコンファイルの内容を正確に把握する最も手早い方法です。

sips --getProperty all icon.png

出力はプロパティの一覧です。App Storeの検証で重要なのはhasAlpha、space、profileです。問題のあるファイルでは、通常、次のように表示されます。

hasAlpha: yes
space: RGB
profile: Display P3

この組み合わせでは検証に失敗します。space: RGBだけでは一般的なRGBとsRGBを区別できず、判別にはprofileフィールドを使います。アップロード可能なアイコンでは、hasAlpha: noと、プロファイル名「sRGB IEC61966-2.1」または同等の値が表示されるはずです。

ビルドスクリプト内で素早く確認したい場合は、個別のプロパティだけを取得することもできます。

sips --getProperty hasAlpha icon.png
sips --getProperty profile icon.png

カラープロファイルの問題

最も多い拒否理由は、Display P3のカラープロファイルです。最近のMacのディスプレイはP3に対応しており、デザインツールは、明示的にsRGBを選ばないと、広色域プロファイルで書き出すことがあります。Figmaは2023年8月に「Unmanaged」オプションを廃止しました。現在、各ファイルはsRGBまたはDisplay P3を使用し、書き出し設定で変更しない限り、ファイルのプロファイルが書き出しにも使われます。Sketchにも文書ごとの同様の設定があります。デザイナーがMacBook Proで作業し、この設定を確認せずに書き出すと、PNGはP3になります。

対処は、sRGBというタグを付けるだけでなく、実際にsRGBへ変換することです。この違いは重要です。sips -s profileは、ピクセル値を変換せずに別のプロファイルをメタデータへ埋め込みます。その結果、P3で記録されたピクセルにsRGBという誤ったラベルが付きます。正しく使うべきなのは、実際に色空間を変換する--matchToです。

sips --matchTo '/System/Library/ColorSync/Profiles/sRGB Profile.icc'   icon.png --out icon-srgb.png

このコマンドは元のピクセルをP3として読み取り、対応するsRGBの値に変換して、新しいファイルを書き出します。ほとんどのディスプレイでは色の変化は気になりませんが、検証要件を満たすうえでは重要です。実行後に結果を確認します。

sips --getProperty profile icon-srgb.png

プロファイルには「sRGB IEC61966-2.1」と表示されるはずです。

アルファチャンネルの除去

sipsではアルファチャンネルを除去できません。調査や、アルファチャンネルを持つファイルへのプロファイル追加はできますが、アルファレイヤーの除去には別のツールが必要です。ImageMagickのconvertなら簡単に処理できます。

convert icon-srgb.png -background white -alpha remove -alpha off icon-final.png

オプションは順番に作用します。-background whiteは、透明なピクセルを置き換える背景色を設定します。-alpha removeはその背景に画像を合成し、透明部分をなくします。-alpha offは出力からアルファチャンネルを完全に除去します。これで、App Storeの検証を通過する、透明部分のないPNGになります。

アイコンのすべてのピクセルが完全に不透明で、実際の透明部分はないものの、ファイル構造にアルファチャンネルが残っている場合は、代わりにpngcrushを使えます。pngcrush 1.8.0以降で初期設定として有効な、色タイプの可逆的な縮約により、ピクセル値を一切変えずに、完全に不透明なRGBA画像をRGBとして書き直します。

pngcrush -ow -rem alla icon.png

アルファチャンネルはメタデータチャンクではなくピクセルデータなので、-rem allaでは除去されません。このオプションは、tRNSを除く既知のすべての補助チャンクを除去し、埋め込まれたカラープロファイルも削除するため、処理後にプロファイルを再確認してください。-owは元のファイルを上書きします。高速で劣化もありませんが、色タイプの縮約が行われるのは、背景との合成が必要な透明部分がない場合だけです。identify -verbose icon.png | grep Alphaで不透明でないピクセルが見つかったら、ImageMagickを使ってください。

インデックスカラーモードの例外的な問題

RGB TrueColorは、各ピクセルを独立した三つの8ビット(または16ビット)チャンネル値で保存します。インデックスモードは色のパレットを保存し、整数インデックスで各色を参照します。1989年の小さなGIF向けに設計された形式で、アプリアイコン向けではありません。ほとんどのデザインツールはインデックスカラーのPNGを生成しませんが、Web向けの最適化パイプライン、特にpngquantなどを積極的に使う古いものでは、パレット量子化の副作用としてTrueColorのアイコンがインデックスカラーに変換されることがあります。

ImageMagickでカラーモードを確認します。

identify -verbose icon.png | grep -E "^  Type"

TrueColorファイルではType: TrueColorまたはType: TrueColorAlpha、インデックスカラーファイルではType: Paletteと表示されます。Paletteが表示されたら変換します。

convert icon.png -type TrueColor icon-truecolor.png

実際には、これは最も少ない拒否理由です。ただし、過去にアセット最適化スクリプトでアイコンを処理したことのあるコードベースでは、繰り返し見られます。

修正をまとめて行うパイプライン

P3プロファイル、アルファチャンネル、場合によっては古いメタデータという三つの問題がある場合は、短いパイプラインにまとめるのが最も簡潔です。まずsipsで色変換を行い、続いて一つのImageMagickコマンドで残りを処理します。

sips --matchTo '/System/Library/ColorSync/Profiles/sRGB Profile.icc'   icon.png --out /tmp/icon-srgb.png   && convert /tmp/icon-srgb.png     -type TrueColor     -background white     -alpha remove     -alpha off     -strip     icon-final.png

末尾の-stripは、埋め込まれたすべてのプロファイル、コメント、補助メタデータチャンクを出力から除去します。この時点でピクセルはすでにsRGBに変換されているため、容量が小さく余分な情報のないPNGが得られます。前述の推奨どおり明示的なsRGBタグを残す場合は、-stripを省いてください。実行後は最後にsips --getProperty all icon-final.pngを実行し、hasAlpha: no、space: RGB、そしてプロファイルなし、またはsRGBプロファイルが明示的に埋め込まれていることを確認します。

書き出し設定から問題を解決する

コマンドラインでの修正は有効ですが、根本的な解決策は、最初から正しく書き出せるようデザインツールを設定することです。Figmaでは、アセットを書き出す前にファイルのカラープロファイルをsRGBに設定するか、書き出し設定でsRGBを選びます。Sketchではキャンバスの空白部分をクリックし、InspectorでColor Profileを設定します。Affinity DesignerではFile → Document Setupを開き、ColorタブでプロファイルをsRGB IEC61966-2.1にします。

App Store用アイコンは、sRGBプロファイルを有効にして、拡大・縮小せずに1024×1024のPNGとして書き出します。CI/CDパイプラインからxcrun altoolやApp Store Connect APIで直接アップロードする場合は、その前にsips --getProperty hasAlphaを実行し、アルファチャンネルがあればビルドを失敗させる検証工程を追加してください。API呼び出し前に検出すれば、通信の往復と手動調査にかかる時間を省けます。

ここから分かるのは、App Store Connectの検証がAppleの文書どおりに動作しているということです。問題は、アップロード手順の途中でその文書が提示されず、エラーメッセージも具体的な失敗条件に対応していないことです。確認対象となる三つのプロパティが分かれば、検証は不可解なものではなく、単純なチェックリストになります。

関連記事

関連記事