还原顶栏、浮动卡片、时间侧栏与底部交互;照片路径改为 CameraDownloads 相对路径并兼容旧数据;格式 Chip 固定 JPG 且不可点击。 Co-authored-by: Cursor <cursoragent@cursor.com>
59 lines
2.1 KiB
Swift
59 lines
2.1 KiB
Swift
//
|
||
// DeviceStorageHelper.swift
|
||
// suixinkan
|
||
//
|
||
// 读取本机型号与可用存储,对齐 Android DeviceStorageHelper。
|
||
//
|
||
|
||
import Foundation
|
||
import UIKit
|
||
|
||
/// 设备存储快照,用于有线传图页设备信息面板。
|
||
struct DeviceStorageSnapshot: Equatable {
|
||
let modelName: String
|
||
let availableGbText: String
|
||
}
|
||
|
||
/// 设备存储信息读取工具。
|
||
enum DeviceStorageHelper {
|
||
/// 读取当前设备型号与 Documents 目录可用空间。
|
||
static func readStorageSnapshot() -> DeviceStorageSnapshot {
|
||
let availableBytes = availableDocumentsBytes()
|
||
let availableGb = Double(availableBytes) / 1024.0 / 1024.0 / 1024.0
|
||
return DeviceStorageSnapshot(
|
||
modelName: buildModelName(),
|
||
availableGbText: String(format: "还剩 %.1fGB 可用", availableGb)
|
||
)
|
||
}
|
||
|
||
private static func buildModelName() -> String {
|
||
var systemInfo = utsname()
|
||
uname(&systemInfo)
|
||
let machine = withUnsafePointer(to: &systemInfo.machine) {
|
||
$0.withMemoryRebound(to: CChar.self, capacity: 1) {
|
||
String(cString: $0)
|
||
}
|
||
}
|
||
let marketingName = UIDevice.current.name.trimmingCharacters(in: .whitespacesAndNewlines)
|
||
if !marketingName.isEmpty, marketingName != "iPhone", !marketingName.hasPrefix("iPad") {
|
||
return marketingName
|
||
}
|
||
if !machine.isEmpty { return machine }
|
||
return UIDevice.current.model
|
||
}
|
||
|
||
private static func availableDocumentsBytes() -> Int64 {
|
||
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
|
||
guard let documentsURL else { return 0 }
|
||
let values = try? documentsURL.resourceValues(forKeys: [.volumeAvailableCapacityForImportantUsageKey])
|
||
if let capacity = values?.volumeAvailableCapacityForImportantUsage {
|
||
return Int64(capacity)
|
||
}
|
||
if let attributes = try? FileManager.default.attributesOfFileSystem(forPath: documentsURL.path),
|
||
let freeSize = attributes[.systemFreeSize] as? NSNumber {
|
||
return freeSize.int64Value
|
||
}
|
||
return 0
|
||
}
|
||
}
|