Bedrud ドキュメント

Bedrud iOS アプリは SwiftUI で構築され、マルチインスタンスサポートと安全な認証情報保存を備えたネイティブビデオ会議エクスペリエンスを提供します。

テクノロジースタック

テクノロジーバージョン目的
Swift5.9+言語
SwiftUILatestUI フレームワーク
LiveKit Swift SDK2.0+WebRTC メディア
KeychainAccess4.2.2+安全な認証情報保存

デプロイメントターゲット: iOS 18.0

プロジェクト設定

プロジェクトは XCodeGen を使用して project.yml からプロジェクトファイルを生成します。

  • Bundle ID: com.bedrud.ios
  • 生成コマンド: xcodegen generate

ディレクトリ構造

apps/ios/Bedrud/
├── BedrudApp.swift                # App entry point
├── Core/
│   ├── API/
│   │   └── APIClient.swift        # URLSession-based REST client
│   ├── Auth/
│   │   └── AuthManager.swift      # Token management, login/logout
│   ├── Instance/
│   │   ├── InstanceManager.swift  # Central multi-instance orchestrator
│   │   └── InstanceStore.swift    # Persistent instance storage (UserDefaults)
│   └── LiveKit/
│       └── RoomManager.swift      # LiveKit room connection manager
├── Features/
│   ├── Auth/
│   │   ├── LoginView.swift        # Login screen
│   │   └── RegisterView.swift     # Registration screen
│   ├── Dashboard/
│   │   └── DashboardView.swift    # Room list and management
│   ├── Meeting/
│   │   └── MeetingView.swift      # Video call interface
│   ├── Profile/
│   │   └── ProfileView.swift      # User profile
│   ├── Instance/
│   │   ├── AddInstanceView.swift  # Add server instance
│   │   └── InstanceSwitcherView.swift  # Switch between instances
│   ├── Settings/
│   │   └── SettingsView.swift     # App settings
│   ├── JoinByURL/
│   │   └── JoinByURLView.swift    # Deep link handling
│   └── Main/
│       └── MainTabView.swift      # Tab navigation
├── Models/
│   ├── User.swift
│   ├── Room.swift
│   └── Instance.swift
└── Design/
    └── Components/                # Reusable SwiftUI components

マルチインスタンスアーキテクチャ

iOS アプリはマルチインスタンスサポートにおいて Android アーキテクチャと同じパターンを採用しています。

flowchart TB
    subgraph InstanceManager [InstanceManager ObservableObject]
        direction TB
        instances["instances: [Instance]"]
        activeInstance["activeInstance"]
        authManager["authManager"]
        apiClient["apiClient"]
        roomManager["roomManager"]
        others["..."]
        
        instances --- activeInstance
        activeInstance --- authManager
        authManager --- apiClient
        apiClient --- roomManager
        roomManager --- others
    end
    style InstanceManager fill:#f0f0f0,stroke:#333

主要なパターン

依存関係は ObservableObject である InstanceManager@Published プロパティとして公開されます。ビューは @EnvironmentObject 経由で受け取ります。

struct DashboardView: View {
    @EnvironmentObject var instanceManager: InstanceManager
 
    var body: some View {
        if let authManager = instanceManager.authManager {
            // Render authenticated UI
        }
    }
}

ナビゲーションフロー

flowchart LR
    NoInstances["No instances"] --> AddInstanceView
    HasInstancesNotLogged["Has instances,<br>not logged in"] --> LoginView
    HasInstancesLogged["Has instances,<br>logged in"] --> DashboardView
    DashboardView -. "toolbar sheet" .-> InstanceSwitcherView["InstanceSwitcherView"]

インスタンススイッチャーは Dashboard ツールバーからトリガーされる .sheet として表示されます。

アプリのエントリーポイント

BedrudApp.swift はコアサービスを初期化し、SwiftUI 環境に注入します。

@main
struct BedrudApp: App {
    @StateObject var instanceStore = InstanceStore()
    @StateObject var instanceManager = InstanceManager()
    @StateObject var settingsStore = SettingsStore()
 
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(instanceStore)
                .environmentObject(instanceManager)
                .environmentObject(settingsStore)
        }
    }
}

機能

安全な保存

JWT トークンと機密性の高い認証情報を UserDefaults ではなく KeychainAccess で保存します。

ディープリンク

ルームへの直接参加やルームコード用の URL を処理します。

設定

ユーザー設定は SettingsStore を通じて UserDefaults に永続化されます。

ビルド

# Open in Xcode
make dev-ios
 
# Build archive (Release)
make build-ios
 
# Export IPA (requires ExportOptions.plist)
make export-ios
 
# Build for simulator (Debug)
make build-ios-sim

必要条件

  • Xcode(最新安定版)
  • iOS 18.0 デプロイメントターゲット
  • デバイスビルド:Apple Developer アカウントとプロビジョニングプロファイル