AI エージェントである Claude Code を本格的な業務システムに使うのもいいのですが、治具的なツールを作るのも便利です、という話。
モバイルアプリの場合 React Native Expo を使うことが多いでしょう。コードが TypeScript で書けるし、アップロード等の手間も必要ありません。Web API を呼び出す程度の社内ツールならばこれで十分です。審査が面倒なので、社内配布や自分だけが使うのでれば、これで十分です。
Expo の場合、Android/iOS 共通のコードを使えるので2つの環境を別々に作らなくてよいというメリットが大きいです。一方で、スマホネイティブのコードを弄るときにはちょっと手間がかかります。手としては、それぞれのライブラリを作っておいて、Expo や Flutter から呼び出せ場イイのですが、少し複雑なことをやろうとすると、やっぱりネイティブ環境での動作確認が必要になります。そこで、初手の実験コードとしては、Kotlin, Swift で書かざるを得ません。
ネイティブコードとして Kotlin/Swift で書くときに結構面倒になるのが UI です。Android の場合は、*.xml を Android Studio で開いてデザインしないといけないし、Swift の場合は古来の *.storyboard を編集しないといけません。それぞれコツがあって結構面倒。なので、最近は Compose UI か Swift UI が流行りだし、そっちのほうがテストツールのような標準的な画面は作りやすいのです。
Compose UI / Swift UI を使う
AI エージェントツールである Claude Sonnet がどの程度まで UI を書けるかという、この程度までいけます。


最近は、仕様書駆動(spec駆動)が流行っているし、それらの指示を Claude Sonnet も読み取ってくれるので、プロンプトに直接書くのではなく、ちょっとした readme.md を書いて AI エージェントに渡します。
readme.md
# Folkbers.mini の作成
GATT/iBeacon の接続テストを行う
## iBeacon サービス
- BeaconScan : iBeacon のスキャン
- BeaconTransmitter : iBeacon の発信
- BeaconTraceService : iBeacon の発信とスキャンを制御する
## GATT サービス
- GattAdvertise : GATT アドバタイズ
- GattClient : GATT クライアント
- GattServer : GATT サーバー
- GattTraceService : GATT サービスの発信とスキャンを制御する
## ContentView.swift
- Trace の開始と停止ボタン
- GATT/iBeacon の切り替えスイッチ
この位の readme.md を書いておいて、プロンプトで
readme.md に従って画面作成して。
と指示するだけで ok です。iOS の場合は BLE 通信の中身まで作ってくれました。まあ、この中身は標準的なものでしかないので、私の場合は修正が必須なのですが。
Android の設定画面っぽいものも、readme.md とか別の *.md ファイルに書いておいてプロンプトで渡せば ok です。
治具ツールを作るときは、いちから Claude Sonnet に任せるのは難しいので、新規プロジェクトだけ Android Studio や Xcode で作成しておきます。
/save コマンド
プロンプトで /save と打つと今までのプロンプトと AI エージェントの回答が表示されます。
---
tools: ['listDirectory', 'readFile', 'createFile', 'replaceString', 'runInTerminal', 'textSearch', 'fileSearch']
---
readme.md を参考にして
- BeaconScan : iBeacon のスキャン
- BeaconTransmitter : iBeacon の発信
- BeaconTraceService : iBeacon の発信とスキャンを制御する
を作成して。
> Copilot: readme.mdを参考にして、iBeacon関連のサービスクラスを作成いたします。まず、現在のプロジェクト構造を確認してから、必要なファイルを作成していきます。 それでは、iBeacon関連のサービスクラスを作成します。まず、必要なインポートとCore Locationフレームワークを使用して、以下の3つのクラスを作成します:
>
> 1. **BeaconScan** - iBeaconのスキャン機能
> 2. **BeaconTransmitter** - iBeaconの発信機能
> 3. **BeaconTraceService** - 発信とスキャンを制御するサービス 次に、これらのサービスを使用するためにContentView.swiftを更新します:
> ```
>
> ```
> 最後に、プロジェクトでCore LocationとCore Bluetoothフレームワークを使用するため、Info.plistにプライバシー設定を追加する必要があります。Info.plistファイルを作成します: ## 作成完了
>
> readme.mdの仕様に基づいて、以下の3つのiBeacon関連サービスクラスを作成しました:
>
> ### 📡 BeaconScan.swift
> - **機能**: iBeaconのスキャン機能を提供
> - **主要メソッド**:
> - `startScanning()` - スキャン開始
> - `stopScanning()` - スキャン停止
> - **プロパティ**: 検出されたビーコン一覧、スキャン状態
>
> ### 📤 BeaconTransmitter.swift
> - **機能**: iBeaconの発信機能を提供
> - **主要メソッド**:
> - `startTransmitting()` - 発信開始
> - `stopTransmitting()` - 発信停止
> - `updateBeaconParameters()` - MajorとMinor値の更新
> - **プロパティ**: 発信状態、Bluetooth状態
>
> ### 🎛️ BeaconTraceService.swift
> - **機能**: 発信とスキャンを統合制御するサービス
> - **動作モード**:
> - スキャンのみ
> - 発信のみ
> - スキャン&発信の同時実行
> - **主要メソッド**:
> - `startTrace()` - トレース開始
> - `stopTrace()` - トレース停止
> - `changeTraceMode()` - モード切り替え
>
> ### 🖥️ ContentView.swift
> readme.mdの要件に従って以下の機能を実装:
> - ✅ Traceの開始と停止ボタン
> - ✅ iBeaconのモード切り替え(スキャン/発信/両方)
> - ✅ リアルタイムステータス表示
> - ✅ 検出されたビーコンの一覧表示
>
> ### 📋 Info.plist
> Core LocationとCore Bluetooth使用のためのプライバシー権限設定を追加しました。
>
> これで、iBeaconのスキャンと発信機能を持つアプリケーションが完成しました。アプリを実行すると、モードを選択してiBeaconの動作をテストできます。
readme.md を参照して、
- GattAdvertise : GATT アドバタイズ
- GattClient : GATT クライアント
- GattServer : GATT サーバー
- GattTraceService : GATT サービスの発信とスキャンを制御する
を作って。
> Copilot: readme.mdを参考にして、GATT関連のサービスクラスを作成いたします。GATT(Generic Attribute Profile)のアドバタイズ、クライアント、サーバー、そしてそれらを制御するサービスを作成します。 次に、ContentView.swiftを更新して、GATTとiBeaconの両方の機能を切り替えできるようにします:
> ```
>
> ```
> ## 作成完了 ✅
>
> readme.mdの仕様に基づいて、GATT関連の4つのサービスクラスを作成し、ContentView.swiftも更新しました:
>
> ### 📡 GattAdvertise.swift
> - **機能**: GATTアドバタイズ機能を提供
> - **主要メソッド**:
> - `startAdvertising()` - アドバタイズ開始
> - `stopAdvertising()` - アドバタイズ停止
> - `updateCharacteristicValue()` - キャラクタリスティック値の更新
> - **特徴**: カスタムサービスとキャラクタリスティックを設定し、クライアントからの読み書き要求に対応
>
...
