diff --git a/README.md b/README.md index 7895fc2..d570a7a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ## iOS Native 应用 -`apps/ios` 提供不依赖 8788 控制台的原生 iPhone 应用,当前版本 **0.2.2**(build 7),运行在 iOS 16 及以上,产物为未签名 IPA,供 TrollStore 或自有签名流程安装。iOS 开发在 `ios-native-ipa` 分支进行。 +`apps/ios` 提供不依赖 8788 控制台的原生 iPhone 应用,当前版本 **0.2.2**,构建号 7,运行在 iOS 16 及以上,产物为未签名 IPA,供 TrollStore 或自有签名流程安装。iOS 开发在 `ios-native-ipa` 分支进行。 底部为节点、消息、设置三个入口: diff --git a/apps/ios/Sources/MultiSimAdmin/Features/Device/InstanceDetailView.swift b/apps/ios/Sources/MultiSimAdmin/Features/Device/InstanceDetailView.swift index 1168be5..55bac15 100644 --- a/apps/ios/Sources/MultiSimAdmin/Features/Device/InstanceDetailView.swift +++ b/apps/ios/Sources/MultiSimAdmin/Features/Device/InstanceDetailView.swift @@ -105,7 +105,7 @@ struct InstanceDetailView: View { private var headerCard: some View { AICard(padding: 16, emphasis: true) { - VStack(alignment: .leading, spacing: 14) { + VStack(alignment: .leading, spacing: 12) { // 导航栏已经显示实例名,卡片内不再重复,只留地址与状态。 HStack(spacing: 8) { Image(systemName: "globe") @@ -128,10 +128,11 @@ struct InstanceDetailView: View { moduleAvailability - if !model.instance.tags.isEmpty { + // 与节点卡片同一枚标签形状(同一胶囊、同一图标),两处只有一处能点。 + if model.instance.tags.isEmpty == false { FlowLayout(spacing: 7) { ForEach(model.instance.tags, id: \.self) { tag in - AITag(tag) + AITag(tag, systemImage: "tag") } } .frame(maxWidth: .infinity, alignment: .leading) @@ -490,7 +491,7 @@ struct InstanceDetailView: View { .frame(height: 4) } } - .frame(maxWidth: .infinity, minHeight: 62, alignment: .topLeading) + .frame(maxWidth: .infinity, minHeight: 56, alignment: .topLeading) .accessibilityElement(children: .combine) } } diff --git a/apps/ios/Sources/MultiSimAdmin/Features/Fleet/FleetTagBatchSheet.swift b/apps/ios/Sources/MultiSimAdmin/Features/Fleet/FleetTagBatchSheet.swift index fa0a9d3..efba790 100644 --- a/apps/ios/Sources/MultiSimAdmin/Features/Fleet/FleetTagBatchSheet.swift +++ b/apps/ios/Sources/MultiSimAdmin/Features/Fleet/FleetTagBatchSheet.swift @@ -47,11 +47,17 @@ struct FleetTagBatchSheet: View { AICard { VStack(alignment: .leading, spacing: 10) { AISectionTitle("已选 \(targets.count) 台", systemImage: "checklist") - Text(selectedNames.joined(separator: "、")) - .font(.caption) - .foregroundStyle(AITheme.muted) - .lineLimit(3) - .truncationMode(.tail) + if targets.isEmpty { + Text("先在节点列表勾选要归类的节点。") + .font(.caption) + .foregroundStyle(AITheme.muted) + } else { + Text(selectedNames.joined(separator: "、")) + .font(.caption) + .foregroundStyle(AITheme.muted) + .lineLimit(3) + .truncationMode(.tail) + } } } } diff --git a/apps/ios/Sources/MultiSimAdmin/Features/Messages/MessagesView.swift b/apps/ios/Sources/MultiSimAdmin/Features/Messages/MessagesView.swift index f2ab3d9..8547f3d 100644 --- a/apps/ios/Sources/MultiSimAdmin/Features/Messages/MessagesView.swift +++ b/apps/ios/Sources/MultiSimAdmin/Features/Messages/MessagesView.swift @@ -134,7 +134,7 @@ struct MessagesView: View { .layoutPriority(1) AITag( message.direction.label, - tint: message.direction == .outgoing ? AITheme.primary : AITheme.success) + systemImage: message.direction == .outgoing ? "arrow.up.right" : "arrow.down.left") Spacer(minLength: 8) Text(TimestampText.short(message.timestamp)) .font(.caption2.weight(.medium)) diff --git a/apps/ios/Sources/MultiSimAdmin/Theme/AICard.swift b/apps/ios/Sources/MultiSimAdmin/Theme/AICard.swift index 485a8e8..09f7f81 100644 --- a/apps/ios/Sources/MultiSimAdmin/Theme/AICard.swift +++ b/apps/ios/Sources/MultiSimAdmin/Theme/AICard.swift @@ -47,29 +47,42 @@ extension AICard { public struct AITag: View { private let text: String - private let tint: Color + private let tint: Color? + private let systemImage: String? - public init(_ text: String, tint: Color = AITheme.primary) { + /// 不传 `tint` 时是中性归类标签(标签、方向这类不带健康含义的信息), + /// 传了 `tint` 才是状态标签,用同色色雾与描边。颜色只留给后者。 + public init(_ text: String, tint: Color? = nil, systemImage: String? = nil) { self.text = text self.tint = tint + self.systemImage = systemImage } public var body: some View { - Text(text) - .font(.caption2.weight(.semibold)) - .foregroundStyle(tint) - .lineLimit(1) - .truncationMode(.middle) - .padding(.horizontal, 10) - // 与节点卡片上的标签胶囊同一形状,同一高度;深色底上 10% 色雾几乎看不见, - // 所以描边权重必须够,不能让标签在暗色主题里消失。 - .frame(height: 28) - .background(tint.opacity(0.14)) - .clipShape(Capsule(style: .continuous)) - .overlay { - Capsule(style: .continuous) - .strokeBorder(tint.opacity(0.30)) + let tint = self.tint + HStack(spacing: 4) { + if let systemImage { + Image(systemName: systemImage) + .font(.system(size: 10, weight: .semibold)) + .accessibilityHidden(true) } + Text(text) + .font(.caption2.weight(.semibold)) + .lineLimit(1) + .truncationMode(.middle) + } + .padding(.horizontal, 10) + // 与节点卡片上的标签胶囊同一形状,同一高度;深色底上 10% 色雾几乎看不见, + // 所以描边权重必须够,不能让标签在暗色主题里消失。 + .frame(height: 28) + .foregroundStyle(tint == nil ? AITheme.ink : tint!) + .background(tint.map { $0.opacity(0.14) } ?? AITheme.tile) + .clipShape(Capsule(style: .continuous)) + .overlay { + Capsule(style: .continuous) + .strokeBorder(tint.map { $0.opacity(0.30) } ?? AITheme.tileLine) + } + .accessibilityLabel(text) } } diff --git a/docs/ios-native-0.2.0.md b/docs/ios-native-0.2.0.md index c57f5b7..edcbb3a 100644 --- a/docs/ios-native-0.2.0.md +++ b/docs/ios-native-0.2.0.md @@ -35,7 +35,7 @@ MultiSimAdmin 0.2.0 是面向 iPhone 的原生 IPA 版本。应用直接连接 - `build/ipa/MultiSimAdmin.ipa` - `build/ipa/MultiSimAdmin.ipa.sha256` -0.2.0 (3) 校验值: +0.2.0 构建 3 校验值: ```text 1ddba7399d74705a7d31835dc6dff30c3b2fc3b3cada23c68eaa84a8fb2c832f MultiSimAdmin.ipa diff --git a/docs/ios-native-0.2.1.md b/docs/ios-native-0.2.1.md index d47ec8a..b6e2493 100644 --- a/docs/ios-native-0.2.1.md +++ b/docs/ios-native-0.2.1.md @@ -1,6 +1,6 @@ # iOS Native 0.2.1 -0.2.1 (6) 在 0.2.0 的基础上做界面与图标重构,功能集合不变。应用的整体结构、页面能力、上游白名单和本地数据布局见现行说明 [docs/ios-native.md](ios-native.md),本文只记录本次发布的变化。 +0.2.1 构建 6 在 0.2.0 的基础上做界面与图标重构,功能集合不变。应用的整体结构、页面能力、上游白名单和本地数据布局见现行说明 [docs/ios-native.md](ios-native.md),本文只记录本次发布的变化。 ## 本次变更 @@ -41,7 +41,7 @@ - `build/ipa/MultiSimAdmin.ipa` - `build/ipa/MultiSimAdmin.ipa.sha256` -0.2.1 (6) 校验值: +0.2.1 构建 6 校验值: ```text 3bef3c678d0bb77a765d4920cb1fe917b82216f158e05b6f08315014e94bd8b7 MultiSimAdmin.ipa diff --git a/docs/ios-native-0.2.2.md b/docs/ios-native-0.2.2.md index a9aa457..85739d9 100644 --- a/docs/ios-native-0.2.2.md +++ b/docs/ios-native-0.2.2.md @@ -1,6 +1,6 @@ # iOS Native 0.2.2 -0.2.2 (7) 把「分组」这个实体从应用里彻底删掉,归类只靠标签;同时完成第二轮配色与图标重构, +0.2.2 构建 7 把「分组」这个实体从应用里彻底删掉,归类只靠标签;同时完成第二轮配色与图标重构, 界面上不再出现蓝色。页面能力、上游白名单与本地数据布局见现行说明 [docs/ios-native.md](ios-native.md), 本文只记录本次发布的变化。 @@ -27,6 +27,11 @@ - 字段名补全:详情页里 `name`、`disk_total_bytes`、`disk_available_bytes`、`percent` 四个键 此前直接把原始键名渲染到界面上,现补为「设备名称」「存储总量」「可用存储」「使用率」并排进 固定顺序。 +- 标签与方向胶囊中性化:`AITag` 拆成两类——不传状态色时是中性归类胶囊(浅底、发丝描边、墨色 + 文字,可带图标),传状态色时才用色雾。详情页标签因此不再显示成近乎禁用的黑雾块,并与节点 + 卡片同一形状同一图标;消息中心的「收件 / 发件」由绿色改回中性胶囊配上下箭头,绿色重新只 + 表示健康状态。 +- 批量标签表在没有任何勾选时给出「先在节点列表勾选要归类的节点」提示,不再留一行空白。 - 版本号显示去掉括号:设置页「应用信息」只显示 `0.2.2`。 ## 文档同步 @@ -56,10 +61,10 @@ - `build/ipa/MultiSimAdmin.ipa` - `build/ipa/MultiSimAdmin.ipa.sha256` -0.2.2 (7) 校验值: +0.2.2 构建 7 校验值: ```text -a8ac7a33aa8dbbeb3197d8131b8c5f77847d1908cbb65beadd8ea6e44c475c12 MultiSimAdmin.ipa +0e4ffb74d03c2da5648e7bc039f67b14798e6d3aec723c206bce17da5b8f06fb MultiSimAdmin.ipa ``` IPA 目标为 iOS 16.0 及以上,`arm64`,Bundle ID 为 `fun.chick.multi-simadmin`,未签名, diff --git a/docs/ios-native.md b/docs/ios-native.md index e79bd3b..07677cd 100644 --- a/docs/ios-native.md +++ b/docs/ios-native.md @@ -3,7 +3,7 @@ 本文是 iPhone 应用的唯一现行说明,内容与仓库代码一致。历史设计稿和执行计划保留在 `docs/superpowers/` 下,其中已被实现推翻的决策在本文第 9 节逐条列出。 -- 当前版本:`0.2.2`(build 7) +- 当前版本:`0.2.2`,构建号 7 - 承载分支:`ios-native-ipa` - 运行要求:iOS 16.0 及以上,`arm64`,Bundle ID `fun.chick.multi-simadmin` - 产物:未签名 `MultiSimAdmin.ipa`,由 TrollStore 或用户自有签名流程安装 @@ -197,8 +197,8 @@ xcodebuild -scheme MultiSimAdmin \ ## 11. 文档索引 - [docs/ios-native.md](ios-native.md):本文,现行说明 -- [docs/ios-native-0.2.2.md](ios-native-0.2.2.md):0.2.2 (7) 发布说明与校验值 -- [docs/ios-native-0.2.1.md](ios-native-0.2.1.md):0.2.1 (6) 发布说明与校验值 +- [docs/ios-native-0.2.2.md](ios-native-0.2.2.md):0.2.2 构建 7 发布说明与校验值 +- [docs/ios-native-0.2.1.md](ios-native-0.2.1.md):0.2.1 构建 6 发布说明与校验值 - [docs/ios-native-0.2.0.md](ios-native-0.2.0.md):0.2.0 发布说明 - [docs/superpowers/specs/2026-09-08-ios-native-ipa-design.md](superpowers/specs/2026-09-08-ios-native-ipa-design.md):历史设计稿 - [docs/superpowers/plans/2026-09-08-ios-native-ipa-foundation.md](superpowers/plans/2026-09-08-ios-native-ipa-foundation.md):地基执行计划(已完成)