1.1.1 · 開発基盤

iPhone だけでアプリを実装する方法

2026.07.02約8分

00Overview

Tools

  • iPhone開発の主端末手持ち
  • Claude ProClaude Code on Web20 ドル/月
  • GitHubソース管理 + ActionsFree
  • EAS + Expo Go配信と実機確認Free

01Story

Situation

1.1 開発環境構築 で書いたとおり、日常で PC を開く時間はない。新規に Mac を買い換える余裕もない。あるのは好奇心だけ。

Complication

その隙間時間にできることは、スマホをいじる程度である。ソファで、寝かしつけの布団の中で、電車で。片手でスマホ。それがすべての前提になる。

Question

スマホだけで、iPhone アプリが作れるのか?

02Solution

Criteria

  • スマホだけで iPhone アプリを作れること
  • Mac がなくても成立すること
  • AI に自分の資源を触らせないこと

Answer

# 開発ループの全体 (右端でまた iPhone に戻る)
iPhone の Claude アプリ → Claude Code on Web → GitHub → GitHub Actions → EAS → iPhone の Expo Go アプリ

iPhone の Claude アプリから依頼を出すと、コーディングから手元のアプリの更新までが自動で流れ、数分後に同じ iPhone の Expo Go で動作確認できる。

依頼も、確認も、手の中の iPhone だけ。
開発中に、build は一度も要らない。

Reason

Claude Code on Web を選んだ理由は、sandbox である。 Claude Code on Web は、依頼のたびにクラウド上へ一時的な Ubuntu 環境を立ち上げ、その中で Claude Code (AI コーディングエージェント) を動かす仕組みになっている。

通常の Claude Code は PC にインストールして PC 上で動かす。するとローカルのファイルにアクセスできてしまうし、作業に必要なツールを (承認は取ってくるものの) 次々インストールし始める。自分の PC の中を AI が自由に見て回れる状態は、率直に気持ちが悪い。— というより、そもそもサポート切れの Intel Mac には Claude Code をインストールしようとしたら拒否られたのだが。。。仮に入れられたとしても選びたくはない。

On Web なら、AI が何をしようと使い捨ての Ubuntu の中の話で、こちらの資産には届かない。安心して丸投げできる。この「任せきれる」感覚が、隙間時間開発では効いてくる。依頼したら閉じて、育児に戻れる。sandbox 環境なので、何かをインストールするときも安心してインストールの承認ができる。

GitHub は、sandbox の揮発性を埋めるピースである。 使い捨て環境は、終わればデータも消える。だから成果物を保存する場所が別に要る。それが GitHub で、ソースの置き場所と履歴管理を担う。さらに GitHub Actions — これも一時的な Linux を立ち上げてコマンドを流してくれる CI/CD (継続的インテグレーション / デリバリー) の仕組み — が、後段の自動化を受け持つ。

EXPO を選んだ理由は、build なしで実機確認できることである。 EXPO は React Native ベースの開発フレームワークで、EAS (Expo Application Services) というクラウド基盤と、Expo Go という実機確認用アプリを持つ。GitHub のリポジトリの内容を EAS に流し込む (update する) と、手元の Expo Go 上のアプリが差し替わる。App Store を経由しない。つまり開発中の 1 サイクルに build が存在しない

Actions のトリガーは main ブランチへの merge にしてある。全部つなげると、こうなる。

# 1 サイクルの中身
1. Claude に「○○して」と依頼 (iPhone)
2. Claude がコーディングして main へ merge
3. merge をトリガーに GitHub Actions が起動
4. Actions が EAS Update を実行
5. 手元の Expo Go 上のアプリが自動更新
6. iPhone で動作確認 → 次の依頼へ

依頼から確認まで、体感は数分。隙間時間に複数の依頼をまとめて投げ、次の隙間時間に確認してまた依頼する。このループを回すことで、まとまった時間ゼロのまま開発が進む。

最後に、EXPO が React Native ベースであることは iOS / Android 両対応の要件もそのまま満たす。実機の Android を持っていなくても、Android 側の動作確認までできる。

Options

  • Codex (OpenAI) — 試した時点 (2026 年春) では iPhone アプリから使えず、ブラウザ操作になった。片手スマホの UX として成立しなかったため見送り。なお 2026 年 5 月に ChatGPT アプリへ Codex が搭載されたので、いま選定するなら再評価の余地がある。また、動作確認だけは行っており、動くことは確認済みのため、Codex でも Gemini でも、ここは好みの問題だと思う。
  • Flutter — クロスプラットフォームのフレームワークとして検討はした。ただ EXPO の PoC (Proof of Concept) の時点で要件をすべて満たしてしまったので、Flutter の PoC は行っていない。比較して負けたのではなく、比較する必要がなくなった、が正確なところ。Flutter 経験者であれば、こちらを採用しても同等なことはできると思う。

03Result

Good

iPhone の Claude アプリで依頼して、同じ iPhone の Expo Go で確認する。この体験はかなり快適である。Claude が考えて実装し、EAS へ update が届くまで数分、長いと 10 分くらいかかるが、依頼して放置すればいいだけなので苦にならない。断片的な隙間時間で開発を進める CI/CD 環境としては、現状これが最強ではないかと感じている。

コストも良い。EXPO も GitHub も Free 枠で十分足りるので、この開発ループ自体の追加費用はゼロである。

Bad

Claude・GitHub・EAS という 3 つのクラウドにまたがってパイプラインを自動で繋げているため、どこか 1 か所で障害が起きるとループ全体が止まる

実害として、こんなハマり方をした。バグを直したはずなのに直っていない。おかしいな、と修正サイクルを何周か回したら、実は EAS 側の障害で update が反映されていなかった。というオチである。シビアな納期で開発しているわけではないので障害自体は気長に待てばいいのだが、「挙動がおかしい」と思ったら、まず各クラウドのステータスページを確認することをおすすめする。自分のコードを疑う前に、インフラを疑う日が月に一度くらいはある。

Follow-up

このループで作れるのは「開発中のアプリ」まで。App Store に出すには build と submit が必要で、そこで Mac 問題が再登場する。続きは 1.1.2 Mac なしで iPhone アプリを build する方法

なお、この OTA 配信をそのまま本番でも使うと、改修時に開発中のコードが公開ユーザーへ誤って届く危険がある。リリースできたら、配信を安全に分離する 1.1.3 EAS Update の安全な運用 を読んでほしい。

■ 再現できる方法

この構成を自分で再現したい人向けのメモ。読み物ではないので、指示文は数行だけ表示してスクロールにしてある。

  1. GitHub リポジトリを作る (空でよい)
  2. Expo アカウントを作る (expo.dev 無料)
  3. Expo アクセストークンを発行 (expo.dev → Account settings → Access tokens)
  4. Expo でプロジェクトを作成。Project details のスクショを取っておく
  5. GitHub リポジトリの Secrets に EXPO_TOKEN を登録 (リポジトリ Settings → Secrets and variables → Actions → New repository secret)

Claude Code on Web で上記のリポジトリを指定し、Expo の Project details のスクショを添付して、下記を貼り付けで実行。

Expo (SDK 54) + React Native の新規アプリを、この空リポジトリに立ち上げてください。
目的は「main にマージしたら GitHub Actions が自動で EAS Update を実行し、
iPhone の Expo Go で動作確認できる」状態を作ることです。

【作ってほしいもの】
1. 最小構成の Expo アプリ(App.js に「Hello World」を表示するだけ)
   - エントリーポイントは App.js
   - 白画面ハマりを避けるため、app.json には icon / splash / favicon /
     runtimeVersion / updates.url を最初は書かない(画像もまだ用意しない)
2. .npmrc に legacy-peer-deps=true を入れる(Expo 54 + React 19 の
   peer 依存衝突を回避するため)
3. package-lock.json は .gitignore に入れる(CI が毎回クリーンインストールするので)
4. GitHub Actions ワークフロー .github/workflows/eas-update.yml
   - トリガー: main への push
   - 中身: npm install --legacy-peer-deps → EAS セットアップ → eas update
   - 認証は Secrets の EXPO_TOKEN を使う

【開発の進め方】
- main への直接 push は保護で失敗するので、ブランチ → PR → main マージの
  流れにしてください

作り終えたら、私が次に手元で何をすればいいか手順で教えてください。

後は「なんか動かないんだけど」と聞けば「○○を確認してください」と言われる。「○○って何?」と聞くと色々と教えてくれる。