← 一覧に戻る

gabor-ops

GitHub ↗ 最終push: 2026/9/18 16:51

WIP(現在進行中)

Work In Progress

このプロジェクトで現在進行中の作業と、過去のスナップショットを記録する。

現在の状況

どこまで進んだか

  • Play Console の 2026/8/31 期限(対象 API レベル)に対応した vc14 / 1.3.8 を製品版へ昇格し、審査提出済み
    • targetSdk 34 → 36、Google Play Billing Library 6.2.1 → 8.3.0(Unity IAP 4.15.1)
    • あわせて AdMob プラグインを 10.5.0 → 11.4.0(GMA Android SDK 25.4.0)、メディエーション4種も更新
    • minSdk は 23 → 24(AppLovin アダプタの要件。Android 6.0 が新規インストール対象外に)
  • 実機(Android 10)で全画面・広告表示・データ保持を検証済み。クラッシュなし
  • ネイティブ デバッグ シンボルを別途生成してアップロード済み
  • 実装リポジトリ gabor-unity を gabor-ops/gabor-unity にクローンして参照できる状態(gabor-ops 側では追跡しない)

次に何をするか

  1. 審査結果を確認し、製品版に反映されたら Play Console の期限警告が消えることを確認する
  2. Pangle 経由の広告品質が悪い件をどうするか決める。AdMob の広告ソース別収益シェアを見て、切るか残すか判断
  3. レビュー依頼ポップアップの誤字(「協力してれくれませんか」→「してくれませんか」)を次回アップデートで修正
  4. iOS 側の確認。AdMob 11.4.0 は GMA iOS 13.0 / UMP 3.1 に上がるため、次に iOS ビルドを作るときに影響が出る可能性がある

詰まっていること・未決事項

  • Pangle の扱い(収益シェアを見ないと判断できない)
  • Android 版には課金導線が無いため、Unity IAP を Android ビルドから外せば Billing Library の年次バージョン要件から恒久的に解放される。ただし iOS と同一プロジェクトのため分離作業が必要で、やるかどうか未決

過去のWIPアーカイブ

(新しい「現在の状況」を書く前に、古いものをここに追記でアーカイブする。新しいものが上)

2026-08-29 14:06 時点の更新前スナップショット

どこまで進んだか

  • リポジトリを初期化し、README / CLAUDE.md にプロジェクトのスコープ(運用全般)と iOS 側のアプリ情報を記載した
  • 対象アプリは App Store ID 1607971341 / Bundle ID jp.thomsons.Eyesight

次に何をするか

  1. Android の package 名 / Google Play URL を確認して README・CLAUDE.md に記入する
  2. KPI のベースライン(DAU・継続率・売上)を一度取って記録する
  3. 定点観測の型(何を・どの頻度で・どこに)を決める

詰まっていること

  • 特になし

ROADMAP(計画)

ロードマップ

今週

  • Android 側の package 名を CLAUDE.md に記入する(jp.thomsons.Eyesight)
  • Play の 2026/8/31 期限対応(targetSdk 36 / Billing Library 8.3.0)を vc14 としてリリース
  • vc14 の審査結果を確認し、Play Console の期限警告が消えることを確認する
  • Pangle 経由の広告品質問題への対応を決める(AdMob の広告ソース別収益シェアを見て、無効化するか判断)
  • 現状の KPI(DAU・継続率・売上)のベースラインを一度取って記録する

今月

  • 定点観測の型を決める(何を・どの頻度で・どこに記録するか)
  • iOS / Android 双方の直近レビューを棚卸しし、対応が要るものを洗い出す
  • レビュー依頼ポップアップの誤字を修正する(「協力してれくれませんか」→「してくれませんか」)
  • iOS 側への影響確認。AdMob 11.4.0 で GMA iOS 13.0 / UMP 3.1 に上がるため、次回 iOS ビルド時に検証が要る

今四半期

  • Unity IAP を Android ビルドから外せるか検討する。Android 版に課金導線は無いが、 バイナリに含まれる限り Billing Library の年次バージョン要件の対象になり続ける

いつか

  • ASO の見直し(タイトル・サブタイトル・キーワード・スクリーンショット)
  • KPI 取得の自動化(App Store Connect MCP / GA4 を叩くスクリプト化)

DECISIONS(意思決定)

意思決定記録

このプロジェクトで下した重要な意思決定を記録する。 最新が上に来る。


2026-08-29 minSdk を 23 から 24 に引き上げる

背景: AdMob 11.4.0 に合わせた AppLovin メディエーションアダプタ 13.6.4.0 が minSdk 24 を要求し、minSdk 23 のままではマニフェストのマージが失敗してビルドできない。

決定: minSdk を 24 に引き上げる。Android 6.0(API 23)は新規インストールの対象外になる。

理由: Android 6.0 は 2015年の OS でシェアはごくわずか。既存の Android 6.0 ユーザーはインストール済みのバージョンを使い続けられる。代替案の「AppLovin アダプタだけ旧版に固定」は Google が検証した組み合わせから外れるため採らなかった。


2026-08-28 Unity IAP は 5.x ではなく 4.15.1 を選ぶ

背景: Play の 2026/8/31 期限に向けて Google Play Billing Library を 8.0 以上にする必要があった。プロジェクトは Unity IAP 4.12.2(Billing 6.2.1)だった。

決定: Unity IAP を 4.15.1 に上げる(Billing Library 8.3.0)。最新の 5.4.2(Billing 9.0.0)は採らない。

理由: 4.15.1 は 4.x 系の API を維持しているため、IStoreListener ベースの既存 PurchasingManager.cs を無改修のまま要件を満たせる。5.x は API の破壊的変更があり、期限まで3日という状況で移行リスクを取る理由がなかった。


2026-08-28 期限対応と AdMob 更新をコミット単位で分離する

背景: Play の 8/31 期限対応(targetSdk 36 + Billing 8.3.0)と、期限とは無関係な AdMob プラグイン更新を同じリリースに含めることになった。

決定: 先に期限対応だけをコミットして「いつでも出せる状態」を作り、その上に AdMob 更新を積む。

理由: AdMob の更新は minSdk 引き上げや R8 のクラッシュなど不確定要素が多かった。分離しておけば、行き詰まっても期限対応コミットに戻すだけでリリースできる。期限を人質に取らずに済む。


2026-08-28 実装リポジトリは運用リポジトリ直下にクローンして参照する

背景: 運用作業(ストア対応・ビルド・提出)で実装コードを直接触る必要が出てきたが、gabor-ops はスコープ上アプリ実装を持たない方針だった。

決定: gabor-unity を gabor-ops/gabor-unity にクローンし、gabor-ops 側では .gitignore で追跡しない。実装の変更は gabor-unity 内で commit / push する。

理由: 参照とビルドのために手元にある必要がある一方、運用リポジトリに実装を取り込むと「運用と実装を分ける」当初の方針が崩れる。追跡しないクローンなら両立できる。


2026-08-28 リリース署名は keystore.properties 方式に統一する

背景: 署名済み AAB をビルドする経路が無く、キーストアのパスワードをどう扱うか決める必要があった。

決定: kowai-android と同じく、gitignore 済みの keystore.properties にパスワードを置き、ビルドスクリプトがそれを読む方式にする。

理由: 既に別プロジェクトで実績のある方式で、運用を揃えられる。パスワードがリポジトリにも ProjectSettings にも残らないことを確認済み。


2026-08-28 リポジトリのスコープを「運用」に限定する

決定

gabor-ops はアプリ「THE 視力回復」の運用(ストア運用・KPI 観測・プロモーション・ユーザー対応)を扱い、アプリ本体の実装コードは置かない。

理由

アプリはすでに iOS / Android の両方でリリース済みで、実装リポジトリは別に存在する。 運用の記録・判断は実装のリリースサイクルと寿命が違うため、混ぜるとどちらも追いにくくなる。


DEVLOG(作業ログ)

開発日誌

このプロジェクトでの作業を時系列で記録する。 最新のエントリが上に来る。


2026-08-29

14:00 - vc14 の実機検証・製品版昇格・ネイティブシンボル対応

やったこと

  • 実機(Huawei YAL-L21 / Android 10 / arm64)で内部テスト版 vc14 を全画面確認
    • バナー広告・インタースティシャル広告とも実表示を確認(更新した AdMob 11.4.0 経由で配信されている)
    • トレーニング3モード(同じ図形を探そう / 間違い探し / 見るだけ)、視力測定、各結果画面、トレーニング履歴カレンダーすべて正常
    • 自己ベスト・実施履歴がセッションをまたいで保持されることを確認。クラッシュなし
  • 広告が毎回割り込んで結果画面に到達できなかったため、端末の通信を一時的に切って残りの画面を検証(検証後に復帰済み)
  • トムソンの確認 OK を受けて製品版へ昇格し、審査に提出(You が実施)
  • Play Console が「ネイティブ デバッグ シンボルが無い」と警告した件を調査・解決
    • AGP が生成していた zip は armeabi-v7a / x86 / x86_64 の Firebase ライブラリのみで、実際に配信している arm64-v8a のシンボルが1つも入っておらず使用不能だった
    • Unity の中間生成物からストリップ前シンボルを回収し、ELF の build-id でアップロード済み AAB と同一ビルドであることを照合したうえで zip を作成
    • Builds/gabor-1.3.8-vc14_native-debug-symbols.zip(libil2cpp / libunity / libmain)を You が手動アップロード
  • 再発防止として、リリースビルドスクリプトに androidCreateSymbols = Public を明示(cb84e88)

詰まったこと / 気づき

  • Pangle 経由のインタースティシャル広告の品質が悪い。スキップボタンを狙ったタップで Google Play が開き、バックキーを4回押しても閉じられず、動画→エンドカード→別動画と連鎖した。検証中に自アプリの広告を2回誤クリックしてしまった
  • メディエーション経由の広告は AdMob の広告レビューセンターでクリエイティブ単位のブロックができない。対処するならネットワーク単位で切るしかない
  • Android 版には課金が存在しないことが判明。ペイウォールへの導線が #if UNITY_ANDROID で全て塞がれており、Play 側にも定期購入が0件。ただし Unity IAP がバイナリに含まれる以上 Billing Library のバージョン要件の対象にはなる
  • レビュー依頼ポップアップに誤字(「協力してれくれませんか」)。今回は見送り

次回やること

  • 審査結果の確認と、製品版反映後の Play Console 警告の解消確認
  • Pangle の扱いを AdMob の広告ソース別収益シェアを見て判断

2026-08-28

14:30-19:00 - gabor-unity のクローンと Play 2026/8/31 期限対応

やったこと

  • アプリ本体が Unity 2022.3.62f2 製であることを確認し、実装リポジトリ ichirokisanuki/gabor-unity を gabor-ops/gabor-unity にクローン(gabor-ops 側では追跡しない)
  • Android package jp.thomsons.Eyesight、Unity バージョンを CLAUDE.md に記載
  • Play Console の 8/31 期限警告2件に対応(d78ba3e)
    • AndroidTargetSdkVersion 34 → 36
    • Unity IAP 4.12.2 → 4.15.1(Google Play Billing Library 6.2.1 → 8.3.0)
    • versionCode 13 → 14(versionName は 1.3.8 のまま)
  • AdMob プラグイン 10.5.0 → 11.4.0、メディエーション4種(AppLovin / Line / Pangle / LiftoffMonetize)も 11.4.0 検証済みの組み合わせに更新(9e7cd37)
  • 署名済み AAB のビルド経路を整備(keystore.properties 方式 + Assets/Editor/AndroidReleaseBuild.cs)
  • gabor-1.3.8-vc14.aab をビルドし、mapping ファイルとともに内部テストトラックへアップロード
  • API 36 / API 35(16KB ページサイズ)両エミュレータで起動・動作確認、ネイティブ .so の 16KB アライメント準拠も検証

詰まったこと / 気づき

  • メディエーションの新パッケージは asmdef のファイル名が変わっており、旧ファイルが残るとアセンブリ名重複でコンパイルが停止する。EDM4U のバージョンハンドラは batchmode では走らないため、旧ファイルを手動で掃除してから unitypackage を直接展開して解決
  • AGP 7.4.2 同梱の R8 が androidx.profileinstaller 1.4.0 の処理で StackOverflowError を起こす。baseProjectTemplate.gradle で 1.3.1 に固定して回避
  • Unity は Gradle を -Dorg.gradle.jvmargs 付きで起動するため、gradleTemplate.properties の同名プロパティは上書きされて効かない
  • Unity を二重起動すると、先に終了した方が AndroidGradleStopDaemonsOnExit により後発ビルドの Gradle デーモンを停止させてしまう

2026-08-28 プロジェクト初期化

  • new-project-setup Skill で ~/cdev/gabor-ops を作成し、GitHub private リポジトリ(ichirokisanuki/gabor-ops)と連携した
  • .devnotes/ 4ファイル、.gitignore、README.md、CLAUDE.md を配置
  • dev-tracked topic を付与
  • App Store Connect MCP の list_apps で対象アプリを特定:
    • 「THE 視力回復~ガボールパッチで視力回復トレーニング」 / App Store ID 1607971341 / Bundle ID jp.thomsons.Eyesight
  • スコープを「運用全般(ストア運用・KPI・プロモ・ユーザー対応)」と定義し、README / CLAUDE.md に記載
  • Android 側の package 名・Play URL は未取得(次にやること)

最近のコミット

README

gabor-ops(THE 視力回復 運用)

概要

iOS / Android でリリース済みのアプリ 「THE 視力回復~ガボールパッチで視力回復トレーニング」 の運用を管理するリポジトリ。

ガボールパッチ(Gabor patch)を使った視力トレーニングアプリで、リポジトリ名の gabor はこれに由来する。

アプリ本体の実装コードは別リポジトリで管理し、ここでは運用(ストア対応・KPI観測・プロモ・ユーザー対応)を扱う。

対象アプリ

項目 値
アプリ名 THE 視力回復~ガボールパッチで視力回復トレーニング
App Store ID 1607971341
iOS Bundle ID jp.thomsons.Eyesight
App Store https://apps.apple.com/jp/app/id1607971341
Android package (要記入)
Google Play (要記入)
ステータス iOS / Android ともリリース済み

このリポジトリで扱うこと

運用全般を扱う。

  • ストア運用 — 審査・リジェクト対応、バージョン更新、レビュー返信、規約変更への追従
  • KPI / 売上 — DAU・継続率・売上の定点観測、レポートの記録
  • プロモーション — ASO、告知文面、LP、ストア掲載素材
  • ユーザー対応 — 問い合わせ・不具合報告のトリアージ、告知

セットアップ

(記入予定)

使い方

(記入予定)

開発メモ

.devnotes/ 配下で管理する。