ネイティブ Swift / Kotlin アプリを AI で構築
ネイティブアプリ開発では、Swift も Kotlin も書けて当たり前、という空気が長く続いてきました。Rork Max と Antigravity を組み合わせると、その前提が少し変わります。AI に土台を任せ、自分は設計と仕上げに集中する——iOS と Android の両方で、そんな進め方が現実的になります。ここでは実際の開発フローとベストプラクティスを整理します。
Rork Max とは
Rork Max は、Claude AI を搭載したネイティブアプリケーションビルダーです。Swift と Kotlin に対応し、開発者が AI の力を活用して効率的にモバイルアプリを構築できるプラットフォームです。
Rork Max の主な機能
コード生成とアシスタンス Rork Max は自然言語の仕様から Swift / Kotlin コードを自動生成します。複雑なロジックの実装、UI コンポーネントの構築、API 連携の設定など、多くの開発タスクを加速化できます。
マルチプラットフォーム対応 iOS と Android の両プラットフォームに対応しており、一つのプロジェクトから両者を並行開発できます。プラットフォーム固有の実装についても、AI アシスタンスで効率化します。
インテリジェントなエラー診断 実行時エラーやコンパイルエラーが発生した際、Rork Max は自動でエラーメッセージを解析し、修正案を提案します。
リアルタイムコラボレーション Xcode や Android Studio との連携により、リアルタイムでコードの修正提案を受け取れます。
Antigravity と Rork Max の併用ワークフロー
Antigravity のエージェント機能と Rork Max を組み合わせることで、さらに強力な開発環境が構築できます。
統合ワークフロー図
要件定義
↓
Antigravity エージェント: 仕様検討・設計
↓
Rork Max: コード生成・実装
↓
Antigravity: テストと検証
↓
デプロイ
段階別の作業フロー
1. プロジェクト初期化フェーズ
Antigravity のエージェントを使用して、プロジェクトの要件をまとめます。
Antigravity への指示:
「iOS/Android のネイティブアプリを開発します。
- ユーザー認証機能
- REST API との連携
- ローカルデータベース(SQLite)
について実装計画を立ててください」
Antigravity は、プロジェクト構造、必要なライブラリ、実装順序などを提案します。
2. Rork Max による実装フェーズ
Rork Max にコード生成を指示します。
Rork Max への指示:
「ユーザー認証用の ViewController を Swift で作成してください。
- メールアドレスとパスワードの入力フィーム
- バリデーション処理
- API とのHTTP連携」
3. Antigravity による検証フェーズ
生成されたコードをAntigravity のテストエージェントに渡し、動作確認やベストプラクティスのチェックを実施します。
iOS アプリ開発の流れ
環境セットアップ
iOS アプリ開発には、以下の環境が必要です。
# Xcode のインストール確認
xcode-select --install
# Swift のバージョン確認
swift --version
# CocoaPods のセットアップ(依存パッケージ管理)
sudo gem install cocoapods
pod setupプロジェクト作成と初期設定
# Xcode コマンドライン で新規プロジェクト作成
mkdir MyMobileApp
cd MyMobileApp
# Swift Package Manager を使用する場合
swift package init --type app --name MyMobileAppXcode を開き、プロジェクト設定を行います。
// App.swift - SwiftUI の場合
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
// ContentView.swift
import SwiftUI
struct ContentView: View {
@State private var username = ""
@State private var password = ""
var body: some View {
VStack(spacing: 16) {
TextField("ユーザー名", text: $username)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
SecureField("パスワード", text: $password)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
Button(action: login) {
Text("ログイン")
.font(.headline)
.frame(maxWidth: .infinity)
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(8)
}
.padding()
}
}
func login() {
// Rork Max が AI アシスタンスで以下の処理を補助
print("ログイン処理を実行")
}
}API 連携実装
REST API との通信をRork Max のサポートで効率化します。
import Foundation
class APIClient {
static let shared = APIClient()
private let baseURL = "https://api.example.com"
func login(username: String, password: String) async throws -> AuthToken {
let endpoint = "\(baseURL)/auth/login"
var request = URLRequest(url: URL(string: endpoint)!)
request.httpMethod = "POST"
let credentials = ["username": username, "password": password]
request.httpBody = try JSONEncoder().encode(credentials)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let (data, response) = try await URLSession.shared.data(for: request)
guard let httpResponse = response as? HTTPURLResponse,
httpResponse.statusCode == 200 else {
throw APIError.unauthorized
}
return try JSONDecoder().decode(AuthToken.self, from: data)
}
}
struct AuthToken: Codable {
let accessToken: String
let expiresIn: Int
}
enum APIError: Error {
case unauthorized
case serverError
}UI/UX の実装ベストプラクティス
Antigravity Lab では、以下のベストプラクティスを推奨しています。
-
レスポンシブデザイン
- 様々なデバイスサイズに対応
- GeometryReader を活用したレイアウト
-
アクセシビリティ
- VoiceOver 対応
- コントラスト比の確保
-
パフォーマンス最適化
- 不要な再レンダリング回避
- 画像キャッシング
テストの実装
import XCTest
class LoginTests: XCTestCase {
var sut: APIClient!
override func setUp() {
super.setUp()
sut = APIClient.shared
}
func testSuccessfulLogin() async throws {
// Rork Max がテストケースの生成をサポート
let result = try await sut.login(username: "test", password: "pass123")
XCTAssertNotNil(result.accessToken)
}
func testInvalidCredentials() async throws {
do {
_ = try await sut.login(username: "", password: "")
XCTFail("バリデーションエラーが発生すべき")
} catch {
XCTAssertTrue(error is APIError)
}
}
}Android アプリ開発の流れ
環境セットアップ
Android アプリ開発には、Android Studio と Kotlin が必要です。
# Android Studio がインストールされていることを確認
# Kotlin のバージョン確認
kotlinc -version
# Gradle のセットアップ
gradle --versionプロジェクト作成と初期設定
Android Studio から新規プロジェクトを作成し、以下の構成を使用します。
// MainActivity.kt
package com.example.mymobileapp
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Compose を使用したUI構築
setupUI()
}
private fun setupUI() {
// Rork Max が UI コンポーネントの実装をサポート
}
}Kotlin での API 連携
Retrofit ライブラリを使用したREST API 連携です。
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.POST
import retrofit2.http.Body
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
data class LoginRequest(
val username: String,
val password: String
)
data class AuthToken(
val accessToken: String,
val expiresIn: Int
)
interface APIService {
@POST("/auth/login")
suspend fun login(@Body request: LoginRequest): AuthToken
}
class APIClient {
companion object {
private const val BASE_URL = "https://api.example.com"
val retrofitService: APIService by lazy {
Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(APIService::class.java)
}
}
}
// ViewModel での使用
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class LoginViewModel : ViewModel() {
fun login(username: String, password: String) {
viewModelScope.launch {
try {
val response = withContext(Dispatchers.IO) {
APIClient.retrofitService.login(
LoginRequest(username, password)
)
}
// 成功時の処理
println("ログイン成功: ${response.accessToken}")
} catch (e: Exception) {
// エラーハンドリング
println("ログイン失敗: ${e.message}")
}
}
}
}Room データベースの実装
ローカルデータベースをRoom で管理します。
import androidx.room.*
import kotlinx.coroutines.flow.Flow
@Entity(tableName = "users")
data class User(
@PrimaryKey val id: Int,
val username: String,
val email: String,
val createdAt: Long
)
@Dao
interface UserDao {
@Query("SELECT * FROM users WHERE id = :userId")
fun getUser(userId: Int): Flow<User>
@Insert
suspend fun insertUser(user: User)
@Update
suspend fun updateUser(user: User)
@Delete
suspend fun deleteUser(user: User)
}
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}ユニットテスト
import org.junit.Test
import org.junit.Assert.*
import kotlinx.coroutines.runBlocking
class LoginViewModelTest {
@Test
fun testSuccessfulLogin() = runBlocking {
val viewModel = LoginViewModel()
// Rork Max がテストロジックの生成をサポート
viewModel.login("testuser", "password123")
}
@Test
fun testInvalidCredentials() {
val viewModel = LoginViewModel()
// バリデーションテスト
assertThrows(IllegalArgumentException::class.java) {
// 空の認証情報でのログイン試行
}
}
}Antigravity のエージェントを活用したデバッグ
Antigravity Lab では、エージェント機能を使ったデバッグワークフローを推奨しています。
ステップ1: エラーログの収集
// iOS: Console ログの記録
os_log("Login attempt: %{private}@", log: OSLog.default, type: .info, username)// Android: Logcat へのログ出力
Log.d("LoginActivity", "Login attempt for user: $username")ステップ2: Antigravity へのエラー報告
Antigravity への指示:
「以下のクラッシュログが発生しました。
原因を分析して修正案を提案してください。
Fatal Exception: java.lang.NullPointerException
at com.example.app.APIClient.login (APIClient.kt:45)」
ステップ3: 修正提案の受け取り
Antigravity は、エラーの根本原因を特定し、修正コードを提案します。
// Antigravity が提案する修正コード
class APIClient {
fun login(username: String, password: String): AuthToken? {
// Null チェックを追加
if (username.isBlank() || password.isBlank()) {
Log.e("APIClient", "Invalid credentials")
return null
}
return try {
// API 呼び出し
retrofitService.login(LoginRequest(username, password))
} catch (e: Exception) {
Log.e("APIClient", "Login failed: ${e.message}")
null
}
}
}プロジェクトの初期設定とベストプラクティス
ディレクトリ構成
iOS (Swift)
MyMobileApp/
├── App/
│ ├── MyApp.swift
│ └── ContentView.swift
├── Models/
│ ├── User.swift
│ └── AuthToken.swift
├── Views/
│ ├── LoginView.swift
│ └── DashboardView.swift
├── Services/
│ ├── APIClient.swift
│ └── AuthService.swift
├── Utils/
│ └── Extensions.swift
└── Tests/
├── LoginTests.swift
└── APIClientTests.swift
Android (Kotlin)
app/
├── src/main/kotlin/com/example/app/
│ ├── MainActivity.kt
│ ├── models/
│ │ ├── User.kt
│ │ └── AuthToken.kt
│ ├── ui/
│ │ ├── LoginActivity.kt
│ │ └── DashboardActivity.kt
│ ├── network/
│ │ ├── APIClient.kt
│ │ └── APIService.kt
│ ├── database/
│ │ ├── AppDatabase.kt
│ │ └── UserDao.kt
│ └── viewmodel/
│ └── LoginViewModel.kt
└── src/test/kotlin/
└── LoginViewModelTest.kt
命名規則
Antigravity Lab では、以下の命名規則を推奨します。
| 要素 | ルール | 例 |
|---|---|---|
| クラス名 | PascalCase | UserAuthService, LoginViewController |
| メソッド名 | camelCase | getUserData(), validateEmail() |
| 定数 | UPPER_SNAKE_CASE | MAX_RETRIES, API_TIMEOUT |
| ローカル変数 | camelCase | userName, isLoading |
バージョン管理
Git を使用してバージョン管理を実施します。
# リポジトリの初期化
git init
# .gitignore の設定
echo "build/" >> .gitignore
echo ".DS_Store" >> .gitignore
echo "*.xcworkspace/" >> .gitignore
echo ".gradle/" >> .gitignore
# 初回コミット
git add .
git commit -m "Initial project setup"デプロイまでの流れ
iOS アプリのデプロイ
App Store Connect への登録
1. Apple Developer Account を作成
2. App Store Connect にアプリを登録
3. Signing Certificate を取得
4. Provisioning Profile を設定
ビルドとアップロード
# Xcode でのビルド
xcodebuild -scheme MyMobileApp -configuration Release archive -archivePath MyMobileApp.xcarchive
# altool を使用してアップロード
xcrun altool --upload-app -f MyMobileApp.ipa \
-t ios -u <apple_id> -p <app_specific_password>Android アプリのデプロイ
リリースビルドの作成
# Gradle でリリースビルド
./gradlew bundleRelease
# キーストアの作成(初回のみ)
keytool -genkey -v -keystore release.keystore \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias release_keyGoogle Play Console への登録
1. Google Play Console アカウントを作成
2. アプリを登録
3. ストア掲載情報を入力
4. リリースビルド(AAB)をアップロード
ベータテスト
1. TestFlight (iOS) または Internal Testing (Android) を使用
2. テスターを招待
3. フィードバックを収集
4. 本番リリース