Imagine pressing the submit button, and a reviewer asks, "What are the rights for this icon?" You had an AI produce dozens of candidates. Which one did you pick? Under which tool's terms was it made? I am not confident that I could answer that three months later.
I cannot give you a one-line rule for whether an AI-made image is allowed. What I can offer is a practical habit for solo developers: accept what cannot be decided, and make the image explainable before you submit.
What the stores ask for is "made by you, or licensed to you"
App Store Review Guideline 5.2.1 asks you not to use protected third-party material, such as trademarks, copyrighted works, or patented ideas, without permission. It also says apps should be submitted by the person or legal entity that owns or has licensed the intellectual property. The section opens with the line that your app should only include content you created or have a license to use.
Nothing there asks whether an image was AI-generated. What is checked is whether you can explain where it came from. Google Play also has policies on intellectual property and impersonation, and the direction is the same.
How AI-generated images are treated in law differs by country, and each tool words its terms differently, so I will not draw a legal conclusion here. This article sticks to four checks.
Check 1: One ledger row per image
Start by listing every image you plan to ship. No special tool is needed; put one CSV in the project root.
| Column | What to write | Example |
|---|---|---|
| file | Path relative to the project | assets/images/icon.png |
| source | Generated, self-made, purchased, or free stock | generated |
| tool | Tool name and where the prompt is saved | Image tool A (prompt saved separately) |
| date | Date created | 2026-10-02 |
| license_note | Which clause you relied on | Commercial-use clause checked |
If you postpone the first row until "later," the more images you have, the harder it gets to trace them. My own rule is to add the row at the moment I adopt the image.
Check 2: Keep the tool's terms, with a date
Writing only "checked" in license_note is not enough, because terms can change. Record the date you checked and the heading of the clause you read. If you can, save the terms page as a PDF or text file next to the ledger.
Three things to look for:
- Whether generated images may be used in a commercial app
- Whether free and paid plans differ in what you may do
- Whether the terms say the output belongs to you or to the service
If none of this is readable, a perfectly sound decision is not to use that tool's output for something as prominent as the icon.
Check 3: Look for resemblance to existing work and trademarks
A generated image can come close to an existing character or logo. Guideline 4.1 (Copycats) asks you not to ship an app that is a popular app with minor changes.
My routine is plain. I run candidate icons through a reverse image search and see whether similar images rank at the top. For the app name, I search both the store and the Japan Patent Office trademark search (J-PlatPat). Finding nothing does not prove safety; the point is to record that you looked in the ledger.
Check 4: Let a script check the store size rules
This is a job for a machine, not for judgment. Here is what the official sources say:
| Target | Requirement | Source |
|---|---|---|
| iOS icon (source image) | Exactly square; 1024x1024 is a good size; no rounded corners or transparent pixels | Expo docs, "App icons" |
| Google Play icon | 32-bit PNG (with alpha), 512px by 512px, 1024KB or less | Play Console Help, "Add preview assets" |
| Google Play feature graphic | JPEG or 24-bit PNG (no alpha), 1024px by 500px | Same page |
Transparent pixels that the eye cannot see can slip in during export or editing. To check them together with the ledger, here is a script.
#!/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())Only images whose file names contain icon are treated as icons; splash and adaptive images are skipped. For the 512px Play version, check separately that it is 1024KB or less.
I ran it on a small test folder (a clean icon.png, an icon-rounded.png with one transparent pixel, a 1000x1024 store-icon.png, and some images deliberately missing from the ledger). The output:
[要確認] 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 has a single transparent pixel in the top-left corner. You cannot see it on screen, but the script does. That is why I leave this to a machine. The exit code is 1 when anything needs attention, so you can wire it into a pre-submission check.
What this method cannot tell you
It does not guarantee that no rights problem will arise. The ledger is a record that lets you explain later what you relied on. If the terms are hard to read, or the app earns significant revenue, it is worth consulting a professional.
The script looks only at size, transparency, and blank ledger fields. It does not check whether an image resembles existing work.
If you do only one thing next
For the app you plan to submit, write one ledger row for the icon. If you find yourself stuck on the source column, that is exactly the spot to resolve before submitting.
Before asking whether an AI-made image is allowed, make sure you can explain it.
Related articles: