提出ボタンを押す直前に、審査担当者から「このアイコンの権利はどうなっていますか」と尋ねられた場面を想像してみます。AI に何十枚も出してもらった案のうち、どれを採用したのか。どのツールの、どの規約の下で作ったのか。三か月後の自分が、その問いに答えられるかどうかは正直なところ心もとありません。
お伝えしたいのは、AI が作った画像を使ってよいかどうかを一言で決める方法ではありません。決められない部分は決められないと認めたうえで、あとから説明できる状態を提出前に作っておくことが、個人開発でできる現実的な備えだ、ということです。
公式が求めているのは「作ったか、使用許諾があるか」です
App Store 審査ガイドラインの 5.2.1 は、保護されたサードパーティの素材(商標・著作物・特許になっているアイデア)を許可なく使わないこと、そして「アプリは、知的財産を所有または使用許諾を受けている人または法人が提出する」ことを求めています。節の冒頭には、アプリに入れてよいのは「自分で作ったか、使用許諾を得ているコンテンツ」だという趣旨の一文もあります。
ここには、AI 生成かどうかを問う文言はありません。見られているのは、出どころを説明できるかです。Google Play 側にも知的財産となりすましに関するポリシーがあり、考え方は同じ方向です。
AI 生成画像の権利が国や制度でどう扱われるかは、私には断定できません。ツールごとの利用規約でも書き方が違います。ここでは法的な結論は出さず、次の4点を確認する手順に絞ります。
確認1:画像ごとに「台帳」を1行つくります
最初にやることは、使うつもりの画像を1枚ずつ表に書き出すことです。専用のツールは要りません。プロジェクトの直下に、CSV を1つ置きます。
| 列 | 書くこと | 例 |
|---|---|---|
| file | プロジェクトからの相対パス | assets/images/icon.png |
| source | 生成・自作・購入・無料素材のどれか | 生成 |
| tool | 使ったツール名と、プロンプトの保存場所 | 画像生成ツールA(プロンプトは別紙) |
| date | 作った日 | 2026-10-02 |
| license_note | 規約のどこを根拠にしたか | 商用利用の条項を確認済み |
「いつか整理しよう」と思って最初の1行を後回しにすると、画像が増えるほど出どころを辿れなくなります。私は、画像を採用したその場で1行足すことを決まりにしています。
確認2:使ったツールの規約を、日付つきで残します
台帳の license_note に「確認済み」とだけ書いても、規約は書き換わることがあります。確認した日と、読んだ条項の見出しを一緒に残してください。可能であれば、規約ページを PDF か保存したテキストにして、台帳と同じ場所に置いておきます。
見る点は次の三つです。
- 生成した画像を商用アプリに使ってよいか
- 無料プランと有料プランで、使える範囲が違わないか
- 生成物の権利が、利用者・サービス側のどちらにあると書かれているか
どれも読み取れないときは、そのツールで作った画像をアイコンのような顔になる素材には使わない、という判断も十分に成り立ちます。
確認3:既存の作品や商標に似ていないかを見ます
生成した画像が、既存のキャラクターやロゴに近いことはありえます。審査ガイドライン 4.1 の Copycats の項目は、人気アプリの見た目を少し変えただけのものを出さないよう求めています。
私が行っているのは、地味な作業です。採用候補のアイコンを画像検索にかけ、似たものが上位に出ないかを見ます。アプリ名は、ストア内の検索と、特許庁の商標検索(J-PlatPat)の両方で調べます。検索に何も出なければ安全だという話ではなく、調べた記録を台帳に残すことに意味があります。
確認4:提出サイズの条件を、スクリプトで機械的に見ます
ここは判断ではなく、機械が得意な確認です。公式の記述を整理すると、次のとおりです。
| 対象 | 条件 | 出典 |
|---|---|---|
| iOS のアイコン(元画像) | 正方形。1024x1024 が目安。角丸や透明なピクセルを含めない | Expo 公式「App icons」 |
| Google Play のアイコン | 32 ビット PNG(アルファ付き)、512x512px、1024KB 以下 | Play Console ヘルプ「プレビュー アセットを追加する」 |
| Google Play のフィーチャー グラフィック | JPEG または 24 ビット PNG(アルファなし)、1024x500px | 同上 |
見た目では気づきにくい透明ピクセルは、書き出しや加工の途中で混ざることがあります。台帳と合わせて確認できるように、次のスクリプトを用意しました。
#!/usr/bin/env python3
"""画像素材の出どころ台帳と、ストア提出サイズの確認。
使い方:
python3 asset_ledger_check.py <プロジェクトのルート> [台帳CSV]
台帳CSV(既定: assets-ledger.csv)の列:
file,source,tool,date,license_note
file は プロジェクトのルートからの相対パス。
"""
import csv
import sys
from pathlib import Path
from PIL import Image # pip install pillow
SKIP_DIRS = {"node_modules", ".git", "ios", "android", ".expo", "dist"}
EXTS = {".png", ".jpg", ".jpeg", ".webp"}
def has_transparency(img: Image.Image) -> bool:
if img.mode in ("RGBA", "LA"):
return img.getchannel("A").getextrema()[0] < 255
return "transparency" in img.info
def main() -> int:
root = Path(sys.argv[1]).resolve()
ledger_path = Path(sys.argv[2]) if len(sys.argv) > 2 else root / "assets-ledger.csv"
ledger = {}
if ledger_path.exists():
with ledger_path.open(encoding="utf-8", newline="") as f:
for row in csv.DictReader(f):
ledger[row["file"].strip()] = row
problems = 0
for path in sorted(root.rglob("*")):
if path.suffix.lower() not in EXTS:
continue
if SKIP_DIRS & set(path.relative_to(root).parts):
continue
rel = path.relative_to(root).as_posix()
with Image.open(path) as img:
w, h = img.size
alpha = has_transparency(img)
kb = path.stat().st_size / 1024
notes = []
row = ledger.get(rel)
if row is None:
notes.append("台帳に行がありません")
else:
for col in ("source", "tool", "date", "license_note"):
if not (row.get(col) or "").strip():
notes.append(f"台帳の {col} が空です")
name = path.name.lower()
if "icon" in name and "splash" not in name and "adaptive" not in name:
if w != h:
notes.append(f"アイコンが正方形ではありません({w}x{h})")
elif w != 1024:
notes.append(f"1024x1024 ではありません({w}x{h})")
if alpha:
notes.append("透明なピクセルを含んでいます(iOS のアイコンは不透明に)")
status = "要確認" if notes else "OK"
problems += bool(notes)
print(f"[{status}] {rel} {w}x{h} {kb:.0f}KB alpha={'有' if alpha else '無'}")
for n in notes:
print(f" - {n}")
# 台帳にあるのに実ファイルがないもの
for rel in sorted(ledger):
if not (root / rel).exists():
print(f"[要確認] {rel} 台帳にあるがファイルが見つかりません")
problems += 1
print(f"\n要確認: {problems} 件")
return 1 if problems else 0
if __name__ == "__main__":
sys.exit(main())ファイル名に icon を含む画像だけを、アイコンとして扱います。スプラッシュ用やアダプティブ用の画像は対象外にしてあります。Play 用の 512px 版を調べたいときは、別途 1024KB 以下かどうかだけを見てください。
手元の検証用フォルダ(icon.png、四隅が透明な icon-rounded.png、1000x1024 の store-icon.png、台帳に行のない画像を意図的に混ぜたもの)で動かすと、出力は次のようになりました。
[要確認] assets/images/icon-rounded.png 1024x1024 6KB alpha=有
- 台帳に行がありません
- 透明なピクセルを含んでいます(iOS のアイコンは不透明に)
[OK] assets/images/icon.png 1024x1024 6KB alpha=無
[OK] assets/images/shot1.png 1242x2688 15KB alpha=無
[要確認] assets/images/splash-icon.png 512x512 1KB alpha=有
- 台帳に行がありません
[要確認] assets/images/store-icon.png 1000x1024 5KB alpha=無
- 台帳に行がありません
- アイコンが正方形ではありません(1000x1024)
[要確認] assets/images/old.png 台帳にあるがファイルが見つかりません
要確認: 4 件icon-rounded.png は、左上のたった1ピクセルを透明にしただけのファイルです。画面で見ても違いは分かりませんが、スクリプトは見つけます。ここが、目視ではなく機械に任せる理由です。終了コードが 1 になるので、提出前のチェックに組み込むこともできます。
この方法が言えないこと
この手順は、権利の問題が起きないことを保証するものではありません。台帳はあくまで、何を根拠に採用したかを後から説明するための記録です。規約の読み方に迷う場合や、収益の大きいアプリでは、専門家に相談する価値があります。
また、スクリプトが見ているのは画像のサイズと透明度、台帳の空欄だけです。画像が既存の作品に似ているかどうかは、見ていません。
次に1つだけやるなら
提出予定のアプリで、いま使っている画像のうちアイコンの1枚だけ、台帳に1行書いてみてください。出どころを書こうとして手が止まるなら、そこが提出前に確認すべき場所です。
原則として、AI が作った画像は「使ってよいか」を悩む前に「説明できるか」を整えておく。
関連する記事もあわせてどうぞ。