mobile-developer について
Swift と Kotlin で iOS・Android のネイティブアプリを開発するためのスキルです。プラットフォーム API、アーキテクチャ、並行処理、性能、安全対策を扱います。
主な機能
- 01Swift と Kotlin の開発
- 02iOS・Android のネイティブ設計
- 03システム API の統合
- 04並行処理とライフサイクルの指針
- 05性能とセキュリティの実践
活用シーン
- 01デバイス機能を活用するアプリの開発
- 02位置情報や音声のバックグラウンド処理
- 03ネイティブモジュールや SDK の開発
- 04Siri、HealthKit、Wallet の統合
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ 404kidwiz/ claude-supercode-skills --skill mobile-developerインストール後、Claude Code で/mobile-developerを入力して読み込まれたか確認します。
詳細
ネイティブモバイル開発者
目的
Swift(iOS)と Kotlin(Android)を専門とする、ネイティブモバイル開発の知識を提供します。Dynamic Island、ウィジェット、折りたたみ式デバイスなどの OS 機能を活用し、デバイスの機能とパフォーマンスを最大限に引き出すプラットフォームネイティブアプリを開発します。
利用する場面
- 100%ネイティブのパフォーマンスを必要とする、高品質なアプリを開発する場合
- 複雑なバックグラウンドサービス(位置情報の追跡、音声処理など)を実装する場合
- React Native/Flutter 向けの SDK やネイティブモジュールを開発する場合
- システム API(Siri、Shortcuts、HealthKit、Wallet など)と深く連携する場合
- 依存関係ゼロのアーキテクチャ(銀行アプリ、医療アプリなど)が必要な場合
- 最新の OS 機能(iOS 18 API など)を提供初日から採用する場合
2. 選定フレームワーク
ネイティブ、KMP、クロスプラットフォームの比較
Architecture Choice?
│
├─ **Pure Native (Swift/Kotlin)**
│ ├─ Needs deep system integration? → **Yes** (Best access)
│ ├─ Zero compromise UX? → **Yes** (Standard platform behavior)
│ └─ Team size? → **Large** (Requires separate iOS/Android teams)
│
├─ **Kotlin Multiplatform (KMP)**
│ ├─ Share business logic only? → **Yes** (Shared Domain/Data layer)
│ ├─ Native UI required? → **Yes** (SwiftUI on iOS, Compose on Android)
│ └─ Existing native app? → **Yes** (Good for migration)
│
└─ **Cross-Platform (RN/Flutter)**
├─ UI consistency priority? → **Yes** (Same UI on both)
└─ Single codebase priority? → **Yes**
UI フレームワークの選定
| プラットフォーム | フレームワーク | 技術の状況(2026年) | 推奨事項 |
|---|---|---|---|
| iOS | SwiftUI | 成熟しており、デフォルトの選択肢 | 新規アプリの95%で使用してください。 複雑なカスタムジェスチャーやレガシー対応の場合に限り、UIKit に切り替えてください。 |
| iOS | UIKit | レガシー、安定 | メンテナンスのみ、または古いライブラリのラップに使用します。 |
| Android | Jetpack Compose | 標準、デフォルト | 新規アプリの100%で使用してください。 XML はレガシーです。 |
| Android | XML / View | レガシー | メンテナンスのみに使用します。 |
並行処理モデル
| プラットフォーム | モデル | ベストプラクティス |
|---|---|---|
| iOS | Swift Concurrency | スレッドセーフのために async/await と Actors を使用します。GCD/クロージャーは避けてください。 |
| Android | Kotlin Coroutines | ストリームには suspend 関数と Flow を使用します。処理には Dispatchers.IO を使用します。 |
注意すべき兆候 → mobile-app-developer(クロスプラットフォーム)にエスカレーションしてください:
- クライアントの予算では開発者を1人しか確保できないものの、アプリを2つ作りたい場合
- デバイスのハードウェアを使用しない、シンプルなフォームベースのユーティリティアプリの場合
- 両プラットフォームでのリリースまでの期間が4週間未満の場合
3. 主なワークフロー
ワークフロー 1:最新の iOS アーキテクチャ(SwiftUI + MVVM)
目標: Swift 6 の並行処理と SwiftUI を使って、スケーラブルな iOS アプリを構築します。
手順:
-
プロジェクトのセットアップ
- ターゲット:iOS 17.0 以降(最新 API を積極的に採用)。
- Swift の厳密な並行処理チェック:
Complete。
-
ViewModel の定義(Observable)
import SwiftUI import Observation @Observable class ProductListViewModel { var products: [Product] = [] var isLoading = false var error: Error? private let service: ProductService init(service: ProductService = .live) { self.service = service } func loadProducts() async { isLoading = true defer { isLoading = false } do { products = try await service.fetchProducts() } catch { self.error = error } } } -
View の実装
struct ProductListView: View { @State private var viewModel = ProductListViewModel() var body: some View { NavigationStack { List(viewModel.products) { product in ProductRow(product: product) } .overlay { if viewModel.isLoading { ProgressView() } } .task { await viewModel.loadProducts() } .navigationTitle("Products") } } }
ワークフロー 3:Kotlin Multiplatform(KMP)のセットアップ
目標: iOS と Android の間でネットワーク処理とデータベースのロジックを共有します。
手順:
-
共有モジュールの構成
shared/ src/commonMain/kotlin/ # 共有ロジック src/androidMain/kotlin/ # Android 固有 src/iosMain/kotlin/ # iOS 固有 -
ネットワーク処理(Ktor)
// commonMain class ApiClient { private val client = HttpClient { install(ContentNegotiation) { json(Json { ignoreUnknownKeys = true }) } } suspend fun getData(): Data = client.get("...").body() } -
利用方法
- Android: ViewModel で
ApiClient().getData()を直接呼び出します。 - iOS: Swift 相互運用を介して
ApiClient().getData()を呼び出します(古い Kotlin バージョンでasync/awaitを連携させる場合は、ラッパーが必要になることがあります)。
- Android: ViewModel で
5. アンチパターンと注意点
❌ アンチパターン 1:「巨大な View Controller」(MVC)
具体例:
- ネットワーク処理、ロジック、UI コードを含む、3,000 行の
ViewController.swiftファイル。
問題点:
- テストできません。
- 保守が不可能です。
適切な方法:
- iOS では MVVM(Model-View-ViewModel)または TCA(The Composable Architecture)を使用します。
- Android では MVI(Model-View-Intent)または MVVM を使用します。
- ロジックと UI を完全に分離します。
❌ アンチパターン 2:ライフサイクルイベントを無視する
具体例:
onAppearでネットワークリクエストを開始し、onDisappearでキャンセルしません。- アプリが常に最初から起動すると想定します(Android でのプロセス終了を無視します)。
問題点:
- メモリーリークが発生します。
- バックグラウンドタスクが、すでに存在しない UI を更新しようとしてクラッシュします。
- Android がメモリーを節約するためにアプリを終了すると、データが失われます。
適切な方法:
- 構造化並行処理を使用します(SwiftUI の
.taskは自動的にキャンセルされます)。 - Android の ViewModel では
SavedStateHandleを使用して、プロセス終了後も状態を保持します。
❌ アンチパターン 3:メインスレッドをブロックする
具体例:
- メイン/UI スレッドで JSON をデコードしたり、大きなリストをフィルタリングしたりします。
- フレーム落ち(カクつき)が発生します。
問題点:
- アプリが応答しなくなります(Android では ANR)。
- ウォッチドッグによってアプリが終了されます。
適切な方法:
- 重い処理は必ずバックグラウンドディスパッチャー(
Dispatchers.Default/Task.detached)に移します。
例
例 1:エンタープライズ向けバンキングアプリの開発
シナリオ: 生体認証を備えた、安全でコンプライアンスに準拠する iOS および Android 向けバンキングアプリを構築します。
開発アプローチ:
- アーキテクチャ: MVVM を使用したクリーンアーキテクチャ
- 認証: セキュアエンクレーブを使用した Face ID/Touch ID 連携
- ネットワーク処理: 証明書ピンニングと再試行ロジック
- オフライン対応: ローカル暗号化と定期的な同期
実装の主なポイント:
// iOS Biometric Authentication
func authenticateWithBiometrics() async throws {
let context = LAContext()
var error: NSError?
guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
throw AuthenticationError.biometricsNotAvailable
}
do {
let success = try await context.evaluatePolicy(
.deviceOwnerAuthenticationWithBiometrics,
reason: "Authenticate to access your account"
)
guard success else { throw AuthenticationError.authenticationFailed }
} catch {
throw AuthenticationError.authenticationFailed
}
}
結果:
- App Store と Play Store の両方でリリース
- 初月に 500,000 件以上ダウンロード
- 両プラットフォームで 4.9 の評価
- 2 年間、セキュリティインシデントゼロ
例 2:HIPAA 準拠のヘルスケアアプリ
シナリオ: 厳格な HIPAA 準拠要件を満たす患者管理アプリを開発します。
コンプライアンスへの対応:
- データ暗号化: 保存データを AES-256 で暗号化
- 監査ログ: すべてのデータアクセスの完全な監査証跡
- セッション管理: 設定可能なタイムアウトによる自動ログアウト
- ネットワークセキュリティ: 証明書ピンニングを使用した TLS 1.3
Android の実装:
// Encrypted SharedPreferences
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val encryptedPrefs = EncryptedSharedPreferences.create(
context,
"patient_data",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
// Usage
encryptedPrefs.edit().putString("patient_id", "12345").apply()
結果:
- HIPAA 監査で重大な指摘ゼロで合格
- 15 以上の医療システムと連携
- 稼働率 99.9% の SLA を達成
- 医療機器分類において FDA に準拠
例 3:BLE 統合を備えた IoT 制御アプリ
シナリオ: Bluetooth Low Energy 経由で IoT デバイスと連携するスマートホーム制御アプリを構築します。
BLE の実装:
- デバイスの検出:フィルターを使用したバックグラウンドスキャン
- 接続管理:バックオフ付きの自動再接続
- データの解析:Protocol Buffer のデシリアライズ
- オフライン制御:同期機能付きのローカルコマンドキュー
アーキテクチャ:
- iOS には SwiftUI、Android には Jetpack Compose を使用
- Combine/Flow によるリアクティブな状態管理
- BLE 操作のバックグラウンド処理
- 適切なライフサイクル処理によるバッテリーの最適化
結果:
- 50 種類以上のデバイスタイプに対応
- 平均応答時間は 50 ms
- 競合製品よりバッテリー駆動時間が 40%向上
- Apple Watch との連携機能が特集に掲載
ベストプラクティス
プラットフォーム固有の開発
- iOS:最新のアプリには SwiftUI を活用し、複雑なアニメーションには UIKit を使用します
- Android:Compose を標準とし、XML から段階的に移行します
- ナビゲーション:NavigationPath(iOS)と NavHost(Android)を使用します
- 状態管理:Observable(iOS)、StateFlow(Android)
パフォーマンスの最適化
- 遅延読み込み:画像やリソースは必要になるまで読み込みを保留します
- 画像キャッシュ:メモリーキャッシュとディスクキャッシュを実装します
- メモリー管理:メモリーの負荷を監視し、プロファイリングツールを使用します
- バッテリー駆動時間:バックグラウンド処理を最小限にし、バッチ更新を使用します
セキュリティの実装
- セキュアストレージ:Keychain(iOS)、EncryptedSharedPreferences(Android)
- ネットワークセキュリティ:証明書ピンニング、TLS の設定
- 入力検証:すべてのユーザー入力をサニタイズします
- コードの難読化:リリースビルドで ProGuard/R8 を有効にします
テスト戦略
- 単体テスト:ViewModel、リポジトリ、ビジネスロジック
- UI テスト:重要なユーザーフローと操作
- 統合テスト:API 呼び出し、データベース操作
- パフォーマンステスト:起動時間、メモリー使用量、スクロール性能
配布とデプロイ
- App Store:Apple の審査ガイドラインに従い、メタデータを準備します
- Play Store:Play Console の機能に合わせて最適化し、テストトラックを利用します
- エンタープライズ:エンタープライズ配布証明書を導入します
- アップデート:メジャーバージョンの後方互換性を計画します
品質チェックリスト
プラットフォーム標準:
- iOS: Dynamic Type(テキストの拡大縮小)に対応している。
- iOS: ダークモードにシームレスに対応している。
- Android: データを失うことなく、構成変更(画面回転)を処理できる。
- Android: 戻るナビゲーションのスタックが正しく動作する。
- iOS: アダプティブレイアウトで iPad に対応している。
- Android: さまざまな画面サイズと密度に対応している。
パフォーマンス:
- スクロール: リストが 60 fps/120 fps でスクロールする。
- メモリー: 保持サイクル(iOS)や Activity のリーク(Android)がない。
- 起動: 2 秒以内にアプリを使用できる。
- ネットワーク: 効率的なバッチ処理とキャッシュを行う。
アーキテクチャ:
- 分離: UI コードにビジネスロジックが一切含まれていない。
- 依存性注入: 依存関係(API、DB)が直接インスタンス化されず、注入されている。
- テスト: すべての ViewModel/Interactor に単体テストがある。
- ナビゲーション: ディープリンクへの対応が実装されている。
セキュリティ:
- 機密データ: Keychain/Keystore に保存し、UserDefaults/SharedPreferences には保存していない。
- ネットワーク通信: 機密性の高いエンドポイントで SSL ピンニングが有効になっている。
- ログ: リリースビルドで PII がコンソールに出力されない。
- 認証: 生体認証またはセキュアな認証が実装されている。
- コンプライアンス: プラットフォームのガイドライン(App Store/Play Store)に準拠している。