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