# LoveLive Music Player — KMP + Compose Multiplatform 与 Flutter 仓库 `LoveLiveMusicPlayerMobile` **并列**。UI 使用 Compose Multiplatform(Android / iOS 一致);PC 仍为 Electron,本仓库提供协议客户端与共享模型。 包名:`top.zhushenwudi.llmp` ## Maven / Nexus `settings.gradle.kts` 已对齐 Flutter `android/nexus_repos.gradle`: - 探测 `http://192.168.123.100:18081/service/rest/v1/status`(2s) - 可达 → `maven-public` / `google` / `mob` / `gradle`(插件) / `jitpack` - 不可达 → 公网 `google()` / `mavenCentral()` / `gradlePluginPortal()` 等 - 强制:`-PuseNexus=true|false` ## 模块 | 模块 | 职责 | |------|------| | `:shared` | 协议、模型、SQLDelight、OSS、歌词、传歌/同步、Player、Settings、FileSystem、PlatformServices | | `:composeApp` | CMP UI + Android 原生(Glance Widget、LyricService、扫码、WebView) | | `iosApp/` | Xcode 脚手架(CarPlay / PiP / WidgetKit),需 macOS 签名链接 | ## 构建(Windows) ```bash ./gradlew.bat :shared:testDebugUnitTest ./gradlew.bat :composeApp:assembleDebug ./gradlew.bat :composeApp:installDebug ``` Debug APK:`composeApp/build/outputs/apk/debug/composeApp-debug.apk` ## 原生功能矩阵 | 功能 | Android | iOS | 状态 | |------|---------|-----|------| | 播放引擎 | ExoPlayer(单实例 + MediaSession) | AVPlayer + MPNowPlaying / RemoteCommand | **done** | | `FileSystem.writeBytes` | 完整 | NSData 原子写入 | **done** | | 桌面歌词 | `LyricService` 悬浮窗 + 设置开关 | PiP(`iosApp/pip/*`,Swift) | **done**(iOS 需 Mac 链 framework) | | Home Widget | Glance 四样式 + `HomeWidgetPreferences` | WidgetKit White/Black(`iosApp/WidgetExtension`) | **done**(iOS 需 Xcode target) | | CarPlay | 目录模型 `CarPlayCatalog`(common) | `CarPlaySceneDelegate` Tab Music/Album/Mine | **sources done**;真机需 Apple **carplay-audio** entitlement | | 深链 `llmp://` | Manifest + `DeepLinkHandler` | SceneDelegate + App Group | **done** | | USB 挂载监听 | Broadcast + `UsbMountMonitor` | N/A(NoOp) | **done**(Android) | | 系统分享 | `ACTION_SEND` | UIActivity / Notification → Swift | **done**(最低系统分享) | | QR 扫码 | ZXing embedded `QrScanActivity` | IP 粘贴(相机可在 Swift 补) | **done**(Android 真扫) | | 萌娘百科 / 立绘 | `WebViewActivity` + assets/tachie | `openURL` / Safari | **done** | | 友盟 | `UmengBridge` 反射(key `634bd9c688ccdf4b7e4ac67b`) | 需在 Swift 初始化 iOS key | **done**(Android 反射;SDK 可选) | | PlatformServices | MainActivity `installAndroidPlatformServices` | `installIosPlatformServices` | **done**(非 NoOp 默认) | ### 仍需 macOS / Apple 开发者完成的项 1. **Xcode 工程**:创建 App + Widget Extension,链接 `ComposeApp.framework`(`./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64`) 2. **签名 / App Group**:`group.top.zhushenwudi.llmp`(已从 Flutter `group.com.zhushenwudi.lovelivemusicplayer` 迁移;见 `iosApp/README.md`) 3. **CarPlay entitlement**:`com.apple.developer.carplay-audio` + `playable-content` 需 Apple 审批后真机可用 4. **PiP 资源**:`black.mp4`(Flutter 仓库若缺失需自行放入 `iosApp/iosApp/pip/`) 5. **Swift ↔ Kotlin 播放回调**:Widget/CarPlay 的 NotificationCenter 事件需在 Mac 上接到 `AppContainer.player` ## 已实现业务(相对骨架) 1. OSS 元数据入库、曲库 6 Tab、播放队列、滚动歌词、Love/歌单/History 2. WiFi 传歌 / 数据同步、驾驶模式、SD/USB、设置、每日推送 3. 桌面歌词 / Widget / 扫码 / WebView / 分享 / 深链 / 友盟桥 4. `FeatureModuleIndex` 模块清单(日志页) ## 对照 | 主题 | Flutter | 本仓库 | |------|---------|--------| | Nexus | `android/nexus_repos.gradle` | `settings.gradle.kts` | | 常量 | `lib/global/const.dart` | `Const.kt` | | 入库 | `global_db.dart` | `DataImportService` | | 协议 | Docs `03` | `protocol/*` + `transfer/*` | | 歌词 | `global_lyric.dart` | `lyric/*` + `native/LyricService` | | Widget SP | `HomeWidgetPreferences` | 同名键 | | CarPlay | `lib/pages/carplay/*` | `CarPlayCatalog` + Swift Scene | | UI | GetX | `composeApp` CMP | 文档:`E:\LoveLiveMusicPlayer-Docs\`