From 27687868efa836dce97d6263ec591caa17f4d1f9 Mon Sep 17 00:00:00 2001 From: chick Date: Sun, 13 Sep 2026 01:15:41 +0800 Subject: [PATCH] fix(ios): unify toolbar controls and release build 3 --- .../Sources/MultiSimAdmin/AppMetadata.swift | 2 +- .../Features/Fleet/FleetView.swift | 15 ++-------- .../MultiSimAdmin/Theme/AIButtonStyle.swift | 5 +++- .../Sources/MultiSimAdmin/Theme/AICard.swift | 30 +++++++++++++++++++ .../MultiSimAdminTests/AppMetadataTests.swift | 2 +- .../SettingsViewModelTests.swift | 2 +- docs/ios-native-0.2.0.md | 7 +++-- 7 files changed, 45 insertions(+), 18 deletions(-) diff --git a/apps/ios/Sources/MultiSimAdmin/AppMetadata.swift b/apps/ios/Sources/MultiSimAdmin/AppMetadata.swift index 4339a48..7928bd3 100644 --- a/apps/ios/Sources/MultiSimAdmin/AppMetadata.swift +++ b/apps/ios/Sources/MultiSimAdmin/AppMetadata.swift @@ -2,5 +2,5 @@ public enum AppMetadata { public static let name = "MultiSimAdmin" public static let bundleIdentifier = "fun.chick.multi-simadmin" public static let marketingVersion = "0.2.0" - public static let buildVersion = "2" + public static let buildVersion = "3" } diff --git a/apps/ios/Sources/MultiSimAdmin/Features/Fleet/FleetView.swift b/apps/ios/Sources/MultiSimAdmin/Features/Fleet/FleetView.swift index 8941c40..6680a4f 100644 --- a/apps/ios/Sources/MultiSimAdmin/Features/Fleet/FleetView.swift +++ b/apps/ios/Sources/MultiSimAdmin/Features/Fleet/FleetView.swift @@ -118,28 +118,19 @@ struct FleetView: View { } } else { ToolbarItemGroup(placement: .primaryAction) { - Button { + AIIconButton("管理分组", systemImage: "folder.badge.gearshape") { model.showingGroupManager = true - } label: { - Image(systemName: "folder.badge.gearshape") } - .accessibilityLabel("管理分组") .disabled(model.isLoading) - Button { + AIIconButton("批量选择", systemImage: "checklist") { model.selectionMode = true - } label: { - Image(systemName: "checklist") } - .accessibilityLabel("批量选择") .disabled(model.visibleRows.isEmpty) - Button { + AIIconButton("添加实例", systemImage: "plus") { model.showingForm = true - } label: { - Image(systemName: "plus") } - .accessibilityLabel("添加实例") .disabled(model.isLoading) } } diff --git a/apps/ios/Sources/MultiSimAdmin/Theme/AIButtonStyle.swift b/apps/ios/Sources/MultiSimAdmin/Theme/AIButtonStyle.swift index ae2aac5..b28d782 100644 --- a/apps/ios/Sources/MultiSimAdmin/Theme/AIButtonStyle.swift +++ b/apps/ios/Sources/MultiSimAdmin/Theme/AIButtonStyle.swift @@ -40,6 +40,7 @@ public struct AIButtonStyle: ButtonStyle { case compact case regular case large + case icon case toolbar case toolbarInline } @@ -67,6 +68,7 @@ public struct AIButtonStyle: ButtonStyle { switch size { case .compact: AITheme.compactButtonHeight case .large: AITheme.largeButtonHeight + case .icon: AITheme.iconButtonSize case .regular: AITheme.buttonHeight case .toolbar: AITheme.toolbarButtonHeight case .toolbarInline: AITheme.toolbarButtonHeight @@ -129,11 +131,12 @@ public struct AIButtonStyle: ButtonStyle { case .compact: return AITheme.compactButtonMinWidth case .regular: return AITheme.regularButtonMinWidth case .large: return 92 + case .icon: return AITheme.iconButtonSize case .toolbar, .toolbarInline: return AITheme.toolbarButtonMinWidth } } private var fixedWidth: CGFloat? { - fixedWidthRequest ?? (size == .toolbar ? AITheme.toolbarButtonWidth : nil) + fixedWidthRequest ?? (size == .icon ? AITheme.iconButtonSize : (size == .toolbar ? AITheme.toolbarButtonWidth : nil)) } } diff --git a/apps/ios/Sources/MultiSimAdmin/Theme/AICard.swift b/apps/ios/Sources/MultiSimAdmin/Theme/AICard.swift index 8564124..53440b2 100644 --- a/apps/ios/Sources/MultiSimAdmin/Theme/AICard.swift +++ b/apps/ios/Sources/MultiSimAdmin/Theme/AICard.swift @@ -697,3 +697,33 @@ public struct AIToolbarButton: View { .accessibilityLabel(title) } } + +public struct AIIconButton: View { + private let title: String + private let systemImage: String + private let kind: AIButtonStyle.Kind + private let action: () -> Void + + public init( + _ title: String, + systemImage: String, + kind: AIButtonStyle.Kind = .secondary, + action: @escaping () -> Void + ) { + self.title = title + self.systemImage = systemImage + self.kind = kind + self.action = action + } + + public var body: some View { + Button { + action() + } label: { + Image(systemName: systemImage) + .font(.system(size: 16, weight: .semibold)) + } + .buttonStyle(AIButtonStyle(kind: kind, size: .icon)) + .accessibilityLabel(title) + } +} diff --git a/apps/ios/Tests/MultiSimAdminTests/AppMetadataTests.swift b/apps/ios/Tests/MultiSimAdminTests/AppMetadataTests.swift index e84c7c7..e057a48 100644 --- a/apps/ios/Tests/MultiSimAdminTests/AppMetadataTests.swift +++ b/apps/ios/Tests/MultiSimAdminTests/AppMetadataTests.swift @@ -7,6 +7,6 @@ final class AppMetadataTests: XCTestCase { XCTAssertEqual(AppMetadata.name, "MultiSimAdmin") XCTAssertEqual(AppMetadata.bundleIdentifier, "fun.chick.multi-simadmin") XCTAssertEqual(AppMetadata.marketingVersion, "0.2.0") - XCTAssertEqual(AppMetadata.buildVersion, "2") + XCTAssertEqual(AppMetadata.buildVersion, "3") } } diff --git a/apps/ios/Tests/MultiSimAdminTests/SettingsViewModelTests.swift b/apps/ios/Tests/MultiSimAdminTests/SettingsViewModelTests.swift index c9bbdc8..40ad120 100644 --- a/apps/ios/Tests/MultiSimAdminTests/SettingsViewModelTests.swift +++ b/apps/ios/Tests/MultiSimAdminTests/SettingsViewModelTests.swift @@ -12,7 +12,7 @@ final class SettingsViewModelTests: XCTestCase { XCTAssertEqual(model.runtime?.appName, "MultiSimAdmin") XCTAssertEqual(model.runtime?.marketingVersion, "0.2.0") - XCTAssertEqual(model.runtime?.buildVersion, "2") + XCTAssertEqual(model.runtime?.buildVersion, "3") XCTAssertEqual(model.runtime?.platform, "iOS") XCTAssertTrue(model.runtime?.deviceModel.isEmpty == false) diff --git a/docs/ios-native-0.2.0.md b/docs/ios-native-0.2.0.md index 3f60043..9b77f40 100644 --- a/docs/ios-native-0.2.0.md +++ b/docs/ios-native-0.2.0.md @@ -11,6 +11,9 @@ MultiSimAdmin 0.2.0 是面向 iPhone 的原生 IPA 版本。应用直接连接 - 隐私说明改为“隐私与数据”,明确节点信息、实例密码和登录会话的实际保存方式。 - 节点详情重排为更清晰的状态、连接、SIM、设备和会话分区。 - 应用图标重做为黑金风格。 +- 节点总览展示硬件、控制、SIM、蜂窝链路状态。 +- 分组头和节点详情头部使用固定尺寸指标卡,加载完成后不会跳变。 +- 节点总览工具栏统一为 44pt 圆角图标按钮,补齐无障碍标签。 ## 数据与安全 @@ -32,10 +35,10 @@ MultiSimAdmin 0.2.0 是面向 iPhone 的原生 IPA 版本。应用直接连接 - `build/ipa/MultiSimAdmin.ipa` - `build/ipa/MultiSimAdmin.ipa.sha256` -0.2.0 (2) 校验值: +0.2.0 (3) 校验值: ```text -0320d746e231725b6f94283da0df39108cb0fc2443064201e75142cdd49fe62b MultiSimAdmin.ipa +1ddba7399d74705a7d31835dc6dff30c3b2fc3b3cada23c68eaa84a8fb2c832f MultiSimAdmin.ipa ``` IPA 目标为 iOS 16.0 及以上,`arm64`,Bundle ID 为 `fun.chick.multi-simadmin`。构建脚本不要求开发者证书,TrollStore 或自有签名流程可以后续处理。