1
This commit is contained in:
zeus
2025-08-02 07:07:59 +08:00
parent 4c4c6ac26a
commit ecf2feb429
4 changed files with 61 additions and 40 deletions
+10 -3
View File
@@ -2,20 +2,27 @@ import Foundation
import Library
import SwiftUI
/// UUVPN iOS
///
@main
struct Application: App {
///
@UIApplicationDelegateAdaptor private var appDelegate: ApplicationDelegate
/// VPN
@StateObject private var environments = ExtensionEnvironments()
///
@State private var isLoggedIn = UserManager.shared.isUserLoggedIn()
var body: some Scene {
WindowGroup {
//
if isLoggedIn {
//MainView().environmentObject(environments)
//
HomeView(isLoggedIn: $isLoggedIn).environmentObject(environments)
}else{
} else {
//
LoginContentView(isLoggedIn: $isLoggedIn)
}
}
@@ -5,36 +5,50 @@ import Library
import Network
import UIKit
/// UUVPN
/// VPN
class ApplicationDelegate: NSObject, UIApplicationDelegate {
/// iOS 16+
private var profileServer: ProfileServer?
///
func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
// Libbox VPN
LibboxSetup(FilePath.sharedDirectory.relativePath, FilePath.workingDirectory.relativePath, FilePath.cacheDirectory.relativePath, false)
setup()
return true
}
///
private func setup() {
do {
//
try UIProfileUpdateTask.configure()
NSLog("setup background task success")
} catch {
NSLog("setup background task error: \(error.localizedDescription)")
}
//
Task {
if UIDevice.current.userInterfaceIdiom == .phone {
// iPhone
await requestNetworkPermission()
}
//
await setupBackground()
}
}
/// iOS 16+
private nonisolated func setupBackground() async {
if #available(iOS 16.0, *) {
do {
let profileServer = try ProfileServer()
profileServer.start()
// 线
await MainActor.run {
self.profileServer = profileServer
}
@@ -45,22 +59,23 @@ class ApplicationDelegate: NSObject, UIApplicationDelegate {
}
}
private nonisolated func requestNetworkPermission() async {
if await SharedPreferences.networkPermissionRequested.get() {
return
}
if !DeviceCensorship.isChinaDevice() {
await SharedPreferences.networkPermissionRequested.set(true)
return
}
URLSession.shared.dataTask(with: URL(string: "http://captive.apple.com")!) { _, response, _ in
if let response = response as? HTTPURLResponse {
if response.statusCode == 200 {
Task {
await SharedPreferences.networkPermissionRequested.set(true)
}
}
}
}.resume()
}
}
///
private nonisolated func requestNetworkPermission() async {
if await SharedPreferences.networkPermissionRequested.get() {
return
}
if !DeviceCensorship.isChinaDevice() {
await SharedPreferences.networkPermissionRequested.set(true)
return
}
URLSession.shared.dataTask(with: URL(string: "http://captive.apple.com")!) { _, response, _ in
if let response = response as? HTTPURLResponse {
if response.statusCode == 200 {
Task {
await SharedPreferences.networkPermissionRequested.set(true)
}
}
}
}.resume()
}
}
@@ -9,7 +9,6 @@ import Foundation
import Foundation
// UserManager UserDefaults
class UserManager {
static let shared = UserManager()
@@ -26,7 +25,7 @@ class UserManager {
private let baseURLKey = "baseURLKey"
private let crisptoken = "crisptoken"
// UserDefaults
/// UserDefaults
private let defaults = UserDefaults.standard
@@ -65,7 +64,7 @@ class UserManager {
defaults.synchronize()
}
// URL
/// URL
func storebaseURLData(data: String) {
defaults.set(data, forKey: "baseURLKey")
defaults.synchronize()
@@ -102,7 +101,7 @@ class UserManager {
//
///
func updateLoginStatus(_ loggedIn: Bool) {
defaults.set(loggedIn, forKey: loginStatusKey)
defaults.synchronize()
@@ -118,48 +117,48 @@ class UserManager {
}
}
//
///
func isUserLoggedIn() -> Bool {
return defaults.bool(forKey: loginStatusKey)
}
//
///
func storeUserInfo(email: String, avator: String) {
defaults.set(email, forKey: userEmailKey)
defaults.set(avator, forKey: avatarurlKey) // info JSON
defaults.set(avator, forKey: avatarurlKey)
defaults.synchronize()
}
//
///
func getUserInfo() -> (email: String, avator: String) {
let email = defaults.string(forKey: userEmailKey) ?? ""
let avator = defaults.string(forKey: avatarurlKey) ?? ""
return (email, avator)
}
// autodata
///
func storeAutoData(data: String) {
defaults.set(data, forKey: autodataKey)
defaults.synchronize()
}
// autodata
/// URL
func getSuburlData() -> String {
return defaults.string(forKey: subURLDataKey) ?? ""
}
// autodata
/// URL
func storeSuburlData(data: String) {
defaults.set(data, forKey: subURLDataKey)
defaults.synchronize()
}
// autodata
///
func getAutoData() -> String {
return defaults.string(forKey: autodataKey) ?? ""
}
//
///
func clearUserData() {
defaults.removeObject(forKey: loginStatusKey)
defaults.removeObject(forKey: userEmailKey)
@@ -11,7 +11,7 @@ import Crisp
struct SupportView: View {
@Environment(\.presentationMode) var presentationMode //
@Environment(\.presentationMode) var presentationMode
var body: some View {
NavigationView(content: {
@@ -21,7 +21,7 @@ struct SupportView: View {
HStack{
Button(action: {
presentationMode.wrappedValue.dismiss() //
presentationMode.wrappedValue.dismiss()
}, label: {
Image(systemName: "chevron.left")
@@ -29,7 +29,7 @@ struct SupportView: View {
Text("返回")
.foregroundColor(.white)
}).padding(10) //
}).padding(10)
Spacer(minLength: 0)
@@ -59,7 +59,7 @@ struct SupportView: View {
})
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true) //
.navigationBarBackButtonHidden(true)
}