mirror of
https://github.com/xweiba/location-spoofer.git
synced 2026-09-21 22:30:46 +08:00
fix: harden startup proxy and coordinate handling
This commit is contained in:
+34
-19
@@ -4,31 +4,46 @@ struct ContentView: View {
|
||||
@StateObject private var setup = SetupCoordinator()
|
||||
@ObservedObject private var net = NetworkMonitor.shared
|
||||
@State private var showSetup = false
|
||||
@State private var phase: AppPhase = .splash
|
||||
@AppStorage("setupCompleted") private var setupCompleted = false
|
||||
|
||||
enum AppPhase { case splash, map }
|
||||
|
||||
var body: some View {
|
||||
NavigationView {
|
||||
MapHomeView(setup: setup)
|
||||
Group {
|
||||
switch phase {
|
||||
case .splash:
|
||||
VStack(spacing: 16) {
|
||||
Image(systemName: "location.fill")
|
||||
.font(.system(size: 48)).foregroundStyle(.blue)
|
||||
ProgressView()
|
||||
Text("正在启动…").font(.subheadline).foregroundStyle(.secondary)
|
||||
}
|
||||
case .map:
|
||||
NavigationView {
|
||||
MapHomeView(setup: setup)
|
||||
}
|
||||
.fullScreenCover(isPresented: $showSetup) {
|
||||
FirstSetupView(setup: setup, onComplete: {
|
||||
setupCompleted = true
|
||||
setup.completeSetup()
|
||||
showSetup = false
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
.task {
|
||||
if !setupCompleted {
|
||||
showSetup = true
|
||||
return
|
||||
if !setup.proxy.isRunning {
|
||||
do {
|
||||
try await setup.proxy.start()
|
||||
} catch {
|
||||
RuntimeLogger.error("APP", "Startup", "代理启动失败,将在设置检测中重试", error: error)
|
||||
}
|
||||
}
|
||||
await setup.refreshTrust()
|
||||
}
|
||||
.onChange(of: net.isAirplaneMode) { airplane in
|
||||
guard setupCompleted else { return }
|
||||
if !airplane {
|
||||
Task { await setup.refreshTrust() }
|
||||
}
|
||||
}
|
||||
.fullScreenCover(isPresented: $showSetup) {
|
||||
FirstSetupView(setup: setup, onComplete: {
|
||||
setupCompleted = true
|
||||
setup.completeSetup()
|
||||
showSetup = false
|
||||
})
|
||||
phase = .map
|
||||
if !setupCompleted { showSetup = true }
|
||||
// Tile probing is a best-effort display refinement and must never block first render.
|
||||
await CoordinateConverter.detectTileByFixedGeocode(force: true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user