最近話題になっているAWS製のAI IDE「Kiro」を使ってiOSアプリを開発してみました。
結果として、想像以上に高速かつ正確にアプリを作成できたので、その体験を共有したいと思います。

Kiroでのアプリ開発はとにかく早い

今回のアプリ開発は、あらかじめ要件が決まっていた状態で始めました。
Kiroでは、この要件をもとにアプリの骨組み(設計・構造)を自動で作成してくれるため、経験年数が1〜2年程度のエンジニアでも、迷うことなくスムーズに開発を進められる印象を受けました(私もそのくらいの経験年数です)。

実際の開発フロー

早速ですがKiroを使って開発していきます。インストールやセットアップに関してはこちらの記事を参考にさせていただきました。

まず、フォルダを作成し、プロジェクトを作成すると以下の画面が表示されます。

少し見づらいですが、右側のSpecを選択してチャット欄に要件を入力します。

できた要件文書は以下のようにMarkdownでまとめてくれます

作成した要件文書
# 要件文書

## 概要

目標までの日数を確認し、生年月日から特定の年齢までの残り日数を表示するiOSアプリケーション。ユーザーが設定した目標日や年齢目標に向けたカウントダウンを視覚的に表示する。

## 要件

### 要件1

**ユーザーストーリー:** ユーザーとして、目標日までの残り日数を確認したいので、設定した目標に向けた進捗を把握できる

#### 受け入れ基準

1. WHEN ユーザーが目標日を設定する THEN システムは現在日から目標日までの日数を計算して表示する
2. WHEN 目標日が過去の日付である THEN システムは「目標日が過去です」というエラーメッセージを表示する
3. WHEN 目標日が今日である THEN システムは「今日が目標日です」と表示する

### 要件2

**ユーザーストーリー:** ユーザーとして、生年月日を保存して特定の年齢までの日数を表示したいので、年齢に関する目標を追跡できる

#### 受け入れ基準

1. WHEN ユーザーが生年月日を入力する THEN システムは生年月日をSwiftDataで永続化する
2. WHEN ユーザーが目標年齢を設定する THEN システムは目標年齢に達するまでの残り日数を計算して表示する
3. IF 目標年齢が現在の年齢より小さい THEN システムは「目標年齢は現在の年齢より大きく設定してください」というエラーメッセージを表示する

### 要件3

**ユーザーストーリー:** ユーザーとして、タイトルと日数を見やすく表示したいので、一目で情報を把握できる

#### 受け入れ基準

1. WHEN カウントダウンが表示される THEN システムはタイトルと残り日数を明確に表示する
2. WHEN 複数の目標がある THEN システムは各目標をリスト形式で表示する
3. WHEN 日数が0になる THEN システムは「目標達成!」というメッセージを表示する

### 要件4

**ユーザーストーリー:** ユーザーとして、目標を編集・削除したいので、変更があった場合に対応できる

#### 受け入れ基準

1. WHEN ユーザーが既存の目標をタップする THEN システムは編集画面を表示する
2. WHEN ユーザーが目標を削除する THEN システムは確認ダイアログを表示してから削除を実行する
3. WHEN ユーザーが目標を編集する THEN システムは変更をSwiftDataで永続化する

### 要件5

**ユーザーストーリー:** ユーザーとして、アプリを再起動しても設定が保持されていてほしいので、毎回設定し直す必要がない

#### 受け入れ基準

1. WHEN アプリが起動する THEN システムはSwiftDataから保存された目標と生年月日を読み込む
2. WHEN データが破損している THEN システムは初期状態にリセットしてエラーログを記録する
3. WHEN アプリがバックグラウンドから復帰する THEN システムは日数を再計算して最新の情報を表示する

### 要件6

**ユーザーストーリー:** ユーザーとして、Widgetでアプリを開かなくても一番上の目標を確認したいので、ホーム画面から素早く情報を把握できる

#### 受け入れ基準

1. WHEN ユーザーがWidgetをホーム画面に追加する THEN システムはリストの一番上の目標のタイトルと残り日数を表示する
2. WHEN 目標がない THEN Widgetは「目標を設定してください」というメッセージを表示する
3. WHEN Widgetがタップされる THEN システムはメインアプリを起動する
4. WHEN 日付が変わる THEN Widgetは自動的に日数を更新する

これだけでも要件がかなりまとめられていて、アプリ開発の仕様の作成の手助けとなりそうです。

また今回は追加でWidgetを実装したかったのでさらにチャットで追加してもらいました。

次に設計計画を作成します。こちらを実行すると要件文書に沿って設計に関する情報が出力されます。

今回は以下のようになりました。

設計文書
# 設計文書

## 概要

SwiftUIとSwiftDataを使用したiOSカウントダウンアプリの設計。目標日までの日数と年齢目標までの日数を表示し、Widgetで素早くアクセスできる機能を提供する。

## アーキテクチャ

### 全体構成

```
CountdownApp (メインアプリ)
├── Views (SwiftUI)
│   ├── ContentView
│   ├── GoalListView
│   ├── AddGoalView
│   └── EditGoalView
├── Models (SwiftData)
│   ├── Goal
│   └── UserProfile
├── Services
│   ├── CountdownService
│   └── DataManager
└── Utilities
    └── DateCalculator

CountdownWidget (Widget Extension)
├── CountdownWidgetView
├── CountdownWidgetProvider
└── Shared Data Access
```

### データフロー

1. ユーザー入力 → SwiftUI Views
2. Views → Services → SwiftData Models
3. SwiftData → App Groups → Widget
4. Widget → WidgetKit → ホーム画面表示

## コンポーネントとインターフェース

### SwiftDataモデル

#### Goal
```swift
@Model
class Goal {
    var id: UUID
    var title: String
    var targetDate: Date?
    var targetAge: Int?
    var isAgeGoal: Bool
    var createdDate: Date
    var priority: Int
}
```

#### UserProfile
```swift
@Model
class UserProfile {
    var id: UUID
    var birthDate: Date?
    var createdDate: Date
}
```

### サービス層

#### CountdownService
- 日数計算ロジック
- 年齢計算ロジック
- 目標の優先順位管理

#### DataManager
- SwiftDataコンテキスト管理
- App Groups共有データ管理
- データ同期処理

### SwiftUI Views

#### ContentView
- メインナビゲーション
- 目標リスト表示
- 新規目標追加ボタン

#### GoalListView
- 目標一覧表示
- 編集・削除機能
- 日数表示

#### AddGoalView
- 新規目標作成フォーム
- 日付選択器
- 年齢目標設定

#### EditGoalView
- 既存目標編集
- 削除確認ダイアログ

### Widget

#### CountdownWidget
- 小サイズWidget対応
- 一番上の目標表示
- タップでアプリ起動

## データモデル

### 目標の種類
1. **日付目標**: 特定の日付までのカウントダウン
2. **年齢目標**: 特定の年齢に達するまでのカウントダウン

### データ関係
- UserProfile: 1つのプロファイル(生年月日)
- Goal: 複数の目標(優先順位付き)

### App Groups設定
- グループID: `group.com.yourcompany.countdown`
- 共有データ: 最優先目標の情報
- Widget更新トリガー: データ変更時

## エラーハンドリング

### データ検証
- 生年月日: 未来日付の拒否
- 目標日: 過去日付の警告
- 目標年齢: 現在年齢以下の拒否

### エラー表示
- インライン検証メッセージ
- アラートダイアログ
- Widget用フォールバック表示

### データ復旧
- SwiftData自動マイグレーション
- 破損データの初期化
- バックアップ機能(iCloud同期)

## テスト戦略

### 単体テスト
- DateCalculator: 日数計算ロジック
- CountdownService: ビジネスロジック
- SwiftDataモデル: データ整合性

### UIテスト
- 目標作成フロー
- 編集・削除操作
- Widget表示確認

### 統合テスト
- App Groups データ共有
- Widget更新タイミング
- バックグラウンド復帰時の更新

### テストデータ
- 過去・現在・未来の日付パターン
- 異なる年齢設定
- 空データ状態

## 技術的考慮事項

### パフォーマンス
- SwiftDataクエリ最適化
- Widget更新頻度制限
- メモリ使用量監視

### セキュリティ
- App Groups適切な設定
- データ暗号化(iCloud同期時)
- プライバシー情報の保護

### アクセシビリティ
- VoiceOver対応
- Dynamic Type対応
- 色覚サポート

### 国際化
- 日付フォーマット対応
- 多言語サポート準備
- 右から左への言語対応

UIごとの役割やデータのモデルまで実装に必要な情報がまとめられています。また個人で開発すると忘れそうなデータの復旧やバリデーションなどもしっかりと書いてあり、抜け漏れのチェックにも使用できそうです。

次にタスクを作成します。下の画像のようにタスクごとに実行ボタンがついていて簡単に実装を開始できます。

タスクが終了するとタスク完了が表示されて次のタスクを実行していくという流れです。

完成品

要件通りのアプリが完成しました。かなりの速度で出来上がったのでかなり満足しています。

UIもAppleの公式UIガイドラインに則っていますが、要件にデザイン案も加えれば変更も簡単にできそうです。

開発して感じた「よかった点」

  • Xcodeプロジェクトを作成する必要がなかった
    今回はproject.pbxprojなどのファイルすら自分で触ることなく、Kiroが自動で生成・管理してくれました。細かいビルド設定もAIに任せられるのはかなり楽です。
  • コマンド実行は開発者が確認して許可
    例えば「ファイルを削除する」などの危険な操作は自動で実行されることはなく、開発者の確認が求められる設計になっています。これは安心できるポイントだと感じました。

少しつまずいた点

  • Xcodeでの認識の問題
    Kiroが作成したファイルがXcode上で認識されないことがありました。手動でプロジェクトに追加する必要がある場面もあり、これはXcode側の仕様が影響していそうです。
  • Targetの追加が自動化されていない
    WidgetやApp Extensionなど、Targetの追加は自動で行われず、手動で対応する必要がありました。
    ただし、KiroがMarkdownで手順を解説してくれるため、その通りに操作すれば問題なく進められました。

終わりに

Kiroを使ってアプリ開発を一通り行った結果、非常に完成度の高いアプリが短時間で出来上がりました。
個人開発において、「0→1」でアプリを立ち上げる際の強力なツールになると感じています。

もしこの記事に興味を持っていただけたなら、ぜひ一度Kiroを触ってみてください!



ギャップロを運営しているアップフロンティア株式会社では、一緒に働いてくれる仲間を随時、募集しています。 興味がある!一緒に働いてみたい!という方は下記よりご応募お待ちしております。
採用情報をみる