【個人開発】iOSアプリ「城印帳」をリリースしました──AIに795枚の御城印を描かせ、たった1行のコードでリジェクトされるまでの4か月
📣 メンバーシップ「実践フルアクセス」開設中! 月1,000円で、週1の実践有料記事(月4〜5本)+過去記事がすべて読み放題📚 コピペで使えるテンプレ・プロンプト・コード付き。最新AIニュースは毎日無料更新。
👇 入会はこちらから
📖 約5分で読めます | 📅 2026年7月27日
審査、通りました。
毎日AIの話ばかり書いている私ですが、実はその裏で iOSアプリを1人で作っていました 。名前は 「城印帳(じょういんちょう)」 。 実際に城へ行くと、デジタルの御城印がもらえる城めぐりアプリ です。
📱 App Store :城印帳をダウンロード(無料)
着手から 約4か月 。 AIに795枚の画像を描かせ 、 たった1行のコードでリジェクトを食らい ました。その全部を書きます。

📖 目次
1. どんなアプリ?
結論:「城に行った」という事実だけが手に入れる条件。写真でもチェックインボタンでもなく、GPSで本当にその場に3分いた人にだけ御城印が出ます。
御城印は、神社の御朱印の"城版"。近年、城の売店などで売られているコレクションアイテムです。これを デジタルで再現し、「実際に行った人だけ」という条件を付けた のが城印帳です。

🏯 収録は全255城
🗾 日本100名城・続日本100名城を含む255城 / 47都道府県すべて をカバー
📝 城ごとに 城主・築城年・天守種別・アクセス・駐車場 まで収録
✍️ 説明文は 平均195文字を書き下ろし (255城ぶん)
ちなみに 公式のスタンプラリーと並行して回る人が多い ので、実物のスタンプ帳も持っておくと集まり方が倍になります( 日本100名城公式ガイドブック(スタンプ帳つき)で実物も集める のがおすすめです)。

📍 チェックイン条件は、あえて厳しく
既存の城めぐりアプリに感じていた 「GPS判定が甘い」 という不満が出発点でした。なので、条件はこうしています。
📏 城から50メートル以内
⏱️ 3分間の滞在
🎯 GPS精度20m以内の測位だけを採用 (ビル影などの誤測位で"行っていないのに取れる"のを防ぐ)
ただし 厳しくするだけでは理不尽になる ので、 圏外に出てもタイマーはリセットされず一時停止 。戻れば続きから再開します。電波の悪い山城で振り出しに戻るのは、さすがに酷なので。
滞在中は ロック画面とDynamic Islandに残り時間が出ます (Live Activity)。アプリを閉じていても大丈夫です。
✨ 通うほど輝く、3段階

🥉 1回目:通常の御城印
🥈 2回目:銀印
🥇 3回目以降:金印
同じ城へのチェックインは 1日1回まで 。つまり 金印までは最短でも3日、3回の登城が必要 です。
ここは意識的に ガチャ要素を入れませんでした 。運ではなく 通った回数が正当に報われる 形にしたかったからです。
2. AIに795枚の御城印を描かせた
結論:255城×3段階=765枚。試作を含めて795枚の背景をAIで生成しました。この記事を読んでいる方には、ここが一番おもしろいパートかもしれません。

御城印が ただの写真 なのは嫌でした。かといって 255城×3種類を手描き するのは、1人では絶対に終わりません。
そこで Google Gemini(Imagen 4) に描かせることにしました。
🎨 プロンプトで指定したこと
一括生成用のスクリプトを自作し、プロンプトにはかなり細かく指定しています。
📐 縦長のハガキサイズ(100mm×148mm)の縦構図
📜 和紙の質感 ──楮(こうぞ)の繊維、クリーム色、しわ、経年のシミ、指紋の跡、墨の滲み
🖌️ 中央に城名を 縦書きの筆文字 で(かすれ・墨の飛び・筆圧の変化まで指定)
⬜ 左端15mmは完全に空白 にする
🔴 朱印は 手押しの不完全さ (インクのムラ、欠け、わずかな回転)を再現
左端を空けているのは、あとからアプリ側で訪問日を縦書きで重ねるため です。生成した背景に、SwiftUIで日付を合成して1枚の御城印にしています。
😱 全部やり直しになった「城城」事件
順調に見えて、ここで盛大にやらかしました。
プロンプトのテンプレートを `{name}城` と書いていたのですが、 データ側の城名がすでに「姫路城」 の形で入っていたんです。
結果、生成された画像には全部——
「姫路城城」
見つけたときは笑うしかありませんでした。 全件やり直し です。さらに「仙台城(青葉城)」のような括弧付きの名前もそのまま描かれてしまい、データ側の整形も必要でした。
最終的な生成ログは 成功944回/失敗347回 。リトライ込みで のべ1,291回 回して、795枚(203MB)を作り切りました。 無料枠内に収めるため、1日あたりの生成数を絞って数日に分けて実行 しています。
💡 学び: AIに大量生成させるときは、 1枚目で気づけるミスを、765枚ぶん量産してしまう リスクがあります。テスト生成を挟むのは本当に大事です。
3. たった1行でリジェクトされた話
結論:実装は正しかったのに、"表示が嘘"になっていました。原因はハードコードされた1行です。
4月8日に初提出。修正を重ねて4月24日に審査へ。そして——
🚫 4月26日、リジェクト
Guideline 2.1(b) - Performance - App Completeness
アプリが無料トライアルを広告しているにもかかわらず、決済時にユーザーへ提供されていない
🔍 原因はこの1行
ペイウォールの購入ボタンの文言が、こうなっていました。
Text(selectedPackageId == Constants.RevenueCat.monthlyPackageID
? "7日間無料で試す" // ← App Store の設定と無関係に常に表示
: "プレミアムにアップグレード")月額プランを選ぶと、ストア側の設定に関係なく必ず「7日間無料で試す」と出る 実装です。審査官がこのボタンを押すと、決済シートには トライアルのない通常価格 が出ます。「広告しているのに提供されていない」とは、この食い違いのことでした。
価格表示も同じく コード内の固定文字列 で、App Store Connectの実データを一切見ていませんでした。
🔧 直し方
表示を全部、StoreKitの実データから作る 方式に作り直しました。
💴 価格 → ストアの 実価格・実通貨 をそのまま表示
🎁 トライアル → 商品に実在し、かつそのユーザーが対象のときだけ 表示
📉 年額の割引率も 月額の実価格から計算 (「39%オフ」の固定文言を廃止)
📄 ボタン下に 自動更新条件を明示
これで 「表示と実際の課金内容がズレる」という不具合が、構造的に起こらなくなりました 。
🎓 教訓3つ
✅ 課金まわりの文言をコードに直書きしない 。ストアが正、アプリは表示するだけ
✅ 「実装は正しいが、表示が嘘」タイプのバグは自分では気づきにくい
✅ 審査はiPadで行われることもある (iPhone向けアプリでも互換モードで検証されます)
なお、 リジェクトから再提出まで約3か月空きました 。原因を特定して直したビルド5を7月25日に提出し、その日のうちに通過。 提出は通算5ビルド、リジェクトは1回 でした。
🎯 まとめ
🏯 城印帳=実際に行くとデジタル御城印がもらえる城めぐりアプリ (全255城・47都道府県)
📍 50m以内・3分滞在・GPS精度20m以内 =あえて厳しく。ただし圏外では一時停止
🎨 AIで795枚を生成 。「城城」事件で全件やり直しも経験
🚫 リジェクト原因はハードコードされた1行 。表示はストアの実データから作るべし
サーバーもアカウントもありません 。記録はすべて端末内に保存され、城のデータもアプリに同梱しているので、 オフラインでも地図と検索は動きます 。
📱 App Store :城印帳をダウンロード(無料・アプリ内課金あり)
※ iOS 26.1以降のiPhone に対応しています。
城好きの方はもちろん、 個人開発に興味がある方 にも、どこかが刺されば嬉しいです。
最後まで読んでいただきありがとうございました!
「使ってみたよ」「ここが分かりにくい」など、感想をコメントでいただけると本当に励みになります。
この記事が役に立ったら「スキ」をお願いします!
📖 この記事を読んだ方におすすめの関連商品
日本100名城公式ガイドブック スタンプ帳つき(歴史群像シリーズ)
城印帳の"デジタル御城印"と、公式スタンプ帳の"実物スタンプ"は相性抜群。アプリには実物の御城印を撮って登録する機能もあるので、二刀流で集めるのが一番楽しいです。
👉 Amazonで 日本100名城公式ガイドブック を見るモバイルバッテリー 12000mAh(軽量・小型・PSE認証済)
GPSチェックインは位置情報を使い続けるので、電池の消費が読めません。山城まで足を延ばす日ほど、軽くて小さい1本が効いてきます。
👉 Amazonで モバイルバッテリー を見る
いいなと思ったら応援しよう!
ここまで読んでいただきありがとうございます!
記事が少しでもお役に立てたなら、応援チップをいただけると跳ねて喜びます🙌
いただいたチップは、AIツールの検証費・API利用料・新しい記事の取材にそのまま使わせていただきます。
無理のない範囲で、気持ちだけでも嬉しいです✨
