見出し画像

【個人開発】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で モバイルバッテリー を見る


いいなと思ったら応援しよう!

やすだ.dev@毎日投稿 ここまで読んでいただきありがとうございます! 記事が少しでもお役に立てたなら、応援チップをいただけると跳ねて喜びます🙌 いただいたチップは、AIツールの検証費・API利用料・新しい記事の取材にそのまま使わせていただきます。 無理のない範囲で、気持ちだけでも嬉しいです✨