78 行
2.4 KiB
Swift
78 行
2.4 KiB
Swift
|
|
import SwiftUI
|
|||
|
|
|
|||
|
|
private let kDevUrlKey = "dev_custom_start_url"
|
|||
|
|
|
|||
|
|
/// Debug-only URL switcher. Mirrors Android's DevUrlSettingsActivity.
|
|||
|
|
/// Production builds should never show or use this.
|
|||
|
|
enum DevUrlSettings {
|
|||
|
|
static var effectiveStartUrl: String? {
|
|||
|
|
#if DEBUG
|
|||
|
|
return UserDefaults.standard.string(forKey: kDevUrlKey)?.nonEmpty
|
|||
|
|
#else
|
|||
|
|
return nil
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static func save(_ url: String) {
|
|||
|
|
UserDefaults.standard.set(url.trimmingCharacters(in: .whitespaces), forKey: kDevUrlKey)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static func clear() {
|
|||
|
|
UserDefaults.standard.removeObject(forKey: kDevUrlKey)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if DEBUG
|
|||
|
|
struct DevUrlSettingsSheet: View {
|
|||
|
|
@Environment(\.dismiss) private var dismiss
|
|||
|
|
@State private var input: String = DevUrlSettings.effectiveStartUrl ?? ""
|
|||
|
|
|
|||
|
|
var body: some View {
|
|||
|
|
NavigationStack {
|
|||
|
|
Form {
|
|||
|
|
Section {
|
|||
|
|
TextField("自定义 URL(留空使用默认)", text: $input, axis: .vertical)
|
|||
|
|
.keyboardType(.URL)
|
|||
|
|
.autocorrectionDisabled()
|
|||
|
|
.textInputAutocapitalization(.never)
|
|||
|
|
.lineLimit(4)
|
|||
|
|
} header: {
|
|||
|
|
Text("调试用后端地址")
|
|||
|
|
} footer: {
|
|||
|
|
Text("设置后重启 App 生效。留空则使用 AppConfig.startUrl。")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Section {
|
|||
|
|
Button("使用默认地址") {
|
|||
|
|
input = ""
|
|||
|
|
}
|
|||
|
|
.foregroundStyle(.secondary)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.navigationTitle("开发环境设置")
|
|||
|
|
.navigationBarTitleDisplayMode(.inline)
|
|||
|
|
.toolbar {
|
|||
|
|
ToolbarItem(placement: .confirmationAction) {
|
|||
|
|
Button("保存") {
|
|||
|
|
let trimmed = input.trimmingCharacters(in: .whitespaces)
|
|||
|
|
if trimmed.isEmpty {
|
|||
|
|
DevUrlSettings.clear()
|
|||
|
|
} else {
|
|||
|
|
DevUrlSettings.save(trimmed)
|
|||
|
|
}
|
|||
|
|
dismiss()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
ToolbarItem(placement: .cancellationAction) {
|
|||
|
|
Button("取消") { dismiss() }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
private extension String {
|
|||
|
|
var nonEmpty: String? { isEmpty ? nil : self }
|
|||
|
|
}
|