浏览代码

[fix]注销不需要的文件

Destiny 10 月之前
父节点
当前提交
33031633b3

+ 4 - 6
QuickSearchLocation.xcodeproj/project.pbxproj

@@ -1226,7 +1226,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 5;
+				CURRENT_PROJECT_VERSION = 11;
 				DEVELOPMENT_TEAM = Q364C8K9BL;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				FRAMEWORK_SEARCH_PATHS = (
@@ -1239,7 +1239,6 @@
 				INFOPLIST_KEY_NSContactsUsageDescription = "手机关爱定位需要您同意访问通讯录的权限用于添加好友功能";
 				INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "手机关爱定位为了使用定位轨迹功能需要您同意开启持续定位权限";
 				INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "手机关爱定位为了使用定位轨迹功能需要您同意开启持续定位权限";
-				INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "手机关爱定位为了使用定位轨迹功能需要您同意使用您的定位信息";
 				INFOPLIST_KEY_NSUserTrackingUsageDescription = "手机关爱定位为了显示个性化广告需要使用您的广告标识符";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen.storyboard;
@@ -1251,7 +1250,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0;
+				MARKETING_VERSION = 1.0.1;
 				PRODUCT_BUNDLE_IDENTIFIER = com.manbu.shouji;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1271,7 +1270,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 5;
+				CURRENT_PROJECT_VERSION = 11;
 				DEVELOPMENT_TEAM = Q364C8K9BL;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				FRAMEWORK_SEARCH_PATHS = (
@@ -1284,7 +1283,6 @@
 				INFOPLIST_KEY_NSContactsUsageDescription = "手机关爱定位需要您同意访问通讯录的权限用于添加好友功能";
 				INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "手机关爱定位为了使用定位轨迹功能需要您同意开启持续定位权限";
 				INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "手机关爱定位为了使用定位轨迹功能需要您同意开启持续定位权限";
-				INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "手机关爱定位为了使用定位轨迹功能需要您同意使用您的定位信息";
 				INFOPLIST_KEY_NSUserTrackingUsageDescription = "手机关爱定位为了显示个性化广告需要使用您的广告标识符";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen.storyboard;
@@ -1296,7 +1294,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0;
+				MARKETING_VERSION = 1.0.1;
 				PRODUCT_BUNDLE_IDENTIFIER = com.manbu.shouji;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";

+ 315 - 315
QuickSearchLocation/Classes/Common/LoadingViewController.swift

@@ -1,318 +1,318 @@
+////
+////  LoadingViewController.swift
+////  QuickSearchLocation
+////
+////  Created by Destiny on 2024/12/31.
+////
 //
-//  LoadingViewController.swift
-//  QuickSearchLocation
+//import UIKit
+//import Photos
 //
-//  Created by Destiny on 2024/12/31.
+//class LoadingViewController: UIViewController {
+//    private let photoClassifier = PhotoClassifier()
+//    private let progressView = UIProgressView(progressViewStyle: .default)
+//    private let statusLabel = UILabel()
+//    private let resultLabel = UILabel()
+//    private let collectionView: UICollectionView
+//    private var similarGroups: [[PHAsset]] = []
+//    private var timer: Timer?
+//    
+//    // 添加详细进度标签
+//    private let detailProgressLabel = UILabel()
+//    private let percentageLabel = UILabel()
+//    
+//    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
+//        // 初始化 CollectionView
+//        let layout = UICollectionViewFlowLayout()
+//        layout.scrollDirection = .vertical
+//        layout.minimumLineSpacing = 10
+//        layout.minimumInteritemSpacing = 5
+//        
+//        let screenWidth = UIScreen.main.bounds.width
+//        let width = (screenWidth - 20) / 3
+//        layout.itemSize = CGSize(width: width, height: width)
+//        layout.sectionInset = UIEdgeInsets(top: 10, left: 5, bottom: 10, right: 5)
+//        layout.headerReferenceSize = CGSize(width: screenWidth, height: 40)
+//        
+//        collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
+//        
+//        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
+//    }
+//    
+//    required init?(coder: NSCoder) {
+//        fatalError("init(coder:) has not been implemented")
+//    }
+//    
+//    override func viewDidLoad() {
+//        super.viewDidLoad()
+//        setupUI()
+//        startClassifying()
+//    }
+//    
+//    private func setupUI() {
+//           view.backgroundColor = .white
+//           
+//           // 设置进度容器视图
+//           let progressContainer = UIView()
+//           progressContainer.translatesAutoresizingMaskIntoConstraints = false
+//           view.addSubview(progressContainer)
+//           
+//           // 配置所有标签
+//           statusLabel.textAlignment = .center
+//           statusLabel.font = .systemFont(ofSize: 16, weight: .medium)
+//           
+//           detailProgressLabel.textAlignment = .center
+//           detailProgressLabel.font = .systemFont(ofSize: 14)
+//           detailProgressLabel.textColor = .darkGray
+//           
+//           percentageLabel.textAlignment = .center
+//           percentageLabel.font = .systemFont(ofSize: 14, weight: .medium)
+//           percentageLabel.textColor = .systemBlue
+//           
+//           resultLabel.textAlignment = .center
+//           resultLabel.numberOfLines = 0
+//           resultLabel.font = .systemFont(ofSize: 14)
+//           
+//           // 配置进度条
+//           progressView.progressTintColor = .systemBlue
+//           progressView.trackTintColor = .systemGray5
+//           
+//           // 添加所有视图
+//           [statusLabel, progressView, detailProgressLabel, percentageLabel, resultLabel].forEach {
+//               $0.translatesAutoresizingMaskIntoConstraints = false
+//               progressContainer.addSubview($0)
+//           }
+//           
+//           // 布局约束
+//           NSLayoutConstraint.activate([
+//               progressContainer.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
+//               progressContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor),
+//               progressContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor),
+//               progressContainer.heightAnchor.constraint(equalToConstant: 180),
+//               
+//               statusLabel.topAnchor.constraint(equalTo: progressContainer.topAnchor, constant: 20),
+//               statusLabel.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor),
+//               
+//               progressView.topAnchor.constraint(equalTo: statusLabel.bottomAnchor, constant: 15),
+//               progressView.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor),
+//               progressView.widthAnchor.constraint(equalTo: progressContainer.widthAnchor, multiplier: 0.8),
+//               
+//               detailProgressLabel.topAnchor.constraint(equalTo: progressView.bottomAnchor, constant: 10),
+//               detailProgressLabel.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor),
+//               
+//               percentageLabel.topAnchor.constraint(equalTo: detailProgressLabel.bottomAnchor, constant: 5),
+//               percentageLabel.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor),
+//               
+//               resultLabel.topAnchor.constraint(equalTo: percentageLabel.bottomAnchor, constant: 15),
+//               resultLabel.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor),
+//               resultLabel.widthAnchor.constraint(equalTo: progressContainer.widthAnchor, multiplier: 0.8)
+//           ])
+//           
+//           // 设置 CollectionView
+//           collectionView.backgroundColor = .white
+//           collectionView.delegate = self
+//           collectionView.dataSource = self
+//           collectionView.register(PhotoCell.self, forCellWithReuseIdentifier: "PhotoCell")
+//           collectionView.register(
+//               HeaderView.self,
+//               forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader,
+//               withReuseIdentifier: "Header"
+//           )
+//           
+//           collectionView.translatesAutoresizingMaskIntoConstraints = false
+//           view.addSubview(collectionView)
+//           
+//           NSLayoutConstraint.activate([
+//               collectionView.topAnchor.constraint(equalTo: progressContainer.bottomAnchor),
+//               collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
+//               collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
+//               collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
+//           ])
+//       }
+//    
+//    private func startClassifying() {
+//        // 重置UI
+//        progressView.progress = 0
+//        statusLabel.text = "正在准备..."
+//        detailProgressLabel.text = "初始化中"
+//        percentageLabel.text = "0%"
+//        resultLabel.text = ""
+//        
+//        // 请求相册权限
+//        PHPhotoLibrary.requestAuthorization { [weak self] status in
+//            guard let self = self else { return }
+//            
+//            DispatchQueue.main.async {
+//                if status == .authorized {
+//                    self.beginPhotoClassification()
+//                } else {
+//                    self.statusLabel.text = "需要相册访问权限"
+//                    self.detailProgressLabel.text = "请在设置中允许访问相册"
+//                }
+//            }
+//        }
+//    }
+//    
+//    private func beginPhotoClassification() {
+//            statusLabel.text = "正在加载照片..."
+//            
+//            let fetchOptions = PHFetchOptions()
+//            let allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions)
+//            
+//            // 更新总数
+//            detailProgressLabel.text = "共发现 \(allPhotos.count) 张照片"
+//            
+//            photoClassifier.classifyPhotos(
+//                assets: allPhotos,
+//                progressHandler: { [weak self] (stage, progress) in
+//                    DispatchQueue.main.async {
+//                        self?.updateProgress(stage: stage, progress: progress)
+//                    }
+//                },
+//                completion: { [weak self] result in
+//                    guard let self = self else { return }
+//                    
+//                    DispatchQueue.main.async {
+//                        self.updateProgress(stage: "分类完成", progress: 1.0)
+//                        
+//                        // 更新结果显示
+//                        var resultText = "分类结果:\n"
+//                        resultText += "截图:\(result.screenshots.count) 张\n"
+//                        resultText += "相似照片组:\(result.similarPhotos.count) 组"
+//                        self.resultLabel.text = resultText
+//                        
+//                        // 更新相似照片展示
+//                        self.similarGroups = result.similarPhotos
+//                        self.collectionView.reloadData()
+//                    }
+//                }
+//            )
+//        }
+//    
+//    private func updateProgress(stage: String, progress: Float) {
+//            statusLabel.text = stage
+//            progressView.progress = progress
+//            percentageLabel.text = "\(Int(progress * 100))%"
+//            
+//            switch stage {
+//            case "正在加载照片...":
+//                detailProgressLabel.text = "正在读取照片数据"
+//            case "正在提取特征...":
+//                detailProgressLabel.text = "正在分析照片内容"
+//            case "正在比较相似度...":
+//                detailProgressLabel.text = "正在查找相似照片"
+//            case "分类完成":
+//                detailProgressLabel.text = "处理完成"
+//            default:
+//                break
+//            }
+//        }
+//}
 //
-
-import UIKit
-import Photos
-
-class LoadingViewController: UIViewController {
-    private let photoClassifier = PhotoClassifier()
-    private let progressView = UIProgressView(progressViewStyle: .default)
-    private let statusLabel = UILabel()
-    private let resultLabel = UILabel()
-    private let collectionView: UICollectionView
-    private var similarGroups: [[PHAsset]] = []
-    private var timer: Timer?
-    
-    // 添加详细进度标签
-    private let detailProgressLabel = UILabel()
-    private let percentageLabel = UILabel()
-    
-    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
-        // 初始化 CollectionView
-        let layout = UICollectionViewFlowLayout()
-        layout.scrollDirection = .vertical
-        layout.minimumLineSpacing = 10
-        layout.minimumInteritemSpacing = 5
-        
-        let screenWidth = UIScreen.main.bounds.width
-        let width = (screenWidth - 20) / 3
-        layout.itemSize = CGSize(width: width, height: width)
-        layout.sectionInset = UIEdgeInsets(top: 10, left: 5, bottom: 10, right: 5)
-        layout.headerReferenceSize = CGSize(width: screenWidth, height: 40)
-        
-        collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
-        
-        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
-    }
-    
-    required init?(coder: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-    
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        setupUI()
-        startClassifying()
-    }
-    
-    private func setupUI() {
-           view.backgroundColor = .white
-           
-           // 设置进度容器视图
-           let progressContainer = UIView()
-           progressContainer.translatesAutoresizingMaskIntoConstraints = false
-           view.addSubview(progressContainer)
-           
-           // 配置所有标签
-           statusLabel.textAlignment = .center
-           statusLabel.font = .systemFont(ofSize: 16, weight: .medium)
-           
-           detailProgressLabel.textAlignment = .center
-           detailProgressLabel.font = .systemFont(ofSize: 14)
-           detailProgressLabel.textColor = .darkGray
-           
-           percentageLabel.textAlignment = .center
-           percentageLabel.font = .systemFont(ofSize: 14, weight: .medium)
-           percentageLabel.textColor = .systemBlue
-           
-           resultLabel.textAlignment = .center
-           resultLabel.numberOfLines = 0
-           resultLabel.font = .systemFont(ofSize: 14)
-           
-           // 配置进度条
-           progressView.progressTintColor = .systemBlue
-           progressView.trackTintColor = .systemGray5
-           
-           // 添加所有视图
-           [statusLabel, progressView, detailProgressLabel, percentageLabel, resultLabel].forEach {
-               $0.translatesAutoresizingMaskIntoConstraints = false
-               progressContainer.addSubview($0)
-           }
-           
-           // 布局约束
-           NSLayoutConstraint.activate([
-               progressContainer.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
-               progressContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor),
-               progressContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor),
-               progressContainer.heightAnchor.constraint(equalToConstant: 180),
-               
-               statusLabel.topAnchor.constraint(equalTo: progressContainer.topAnchor, constant: 20),
-               statusLabel.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor),
-               
-               progressView.topAnchor.constraint(equalTo: statusLabel.bottomAnchor, constant: 15),
-               progressView.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor),
-               progressView.widthAnchor.constraint(equalTo: progressContainer.widthAnchor, multiplier: 0.8),
-               
-               detailProgressLabel.topAnchor.constraint(equalTo: progressView.bottomAnchor, constant: 10),
-               detailProgressLabel.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor),
-               
-               percentageLabel.topAnchor.constraint(equalTo: detailProgressLabel.bottomAnchor, constant: 5),
-               percentageLabel.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor),
-               
-               resultLabel.topAnchor.constraint(equalTo: percentageLabel.bottomAnchor, constant: 15),
-               resultLabel.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor),
-               resultLabel.widthAnchor.constraint(equalTo: progressContainer.widthAnchor, multiplier: 0.8)
-           ])
-           
-           // 设置 CollectionView
-           collectionView.backgroundColor = .white
-           collectionView.delegate = self
-           collectionView.dataSource = self
-           collectionView.register(PhotoCell.self, forCellWithReuseIdentifier: "PhotoCell")
-           collectionView.register(
-               HeaderView.self,
-               forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader,
-               withReuseIdentifier: "Header"
-           )
-           
-           collectionView.translatesAutoresizingMaskIntoConstraints = false
-           view.addSubview(collectionView)
-           
-           NSLayoutConstraint.activate([
-               collectionView.topAnchor.constraint(equalTo: progressContainer.bottomAnchor),
-               collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
-               collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
-               collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
-           ])
-       }
-    
-    private func startClassifying() {
-        // 重置UI
-        progressView.progress = 0
-        statusLabel.text = "正在准备..."
-        detailProgressLabel.text = "初始化中"
-        percentageLabel.text = "0%"
-        resultLabel.text = ""
-        
-        // 请求相册权限
-        PHPhotoLibrary.requestAuthorization { [weak self] status in
-            guard let self = self else { return }
-            
-            DispatchQueue.main.async {
-                if status == .authorized {
-                    self.beginPhotoClassification()
-                } else {
-                    self.statusLabel.text = "需要相册访问权限"
-                    self.detailProgressLabel.text = "请在设置中允许访问相册"
-                }
-            }
-        }
-    }
-    
-    private func beginPhotoClassification() {
-            statusLabel.text = "正在加载照片..."
-            
-            let fetchOptions = PHFetchOptions()
-            let allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions)
-            
-            // 更新总数
-            detailProgressLabel.text = "共发现 \(allPhotos.count) 张照片"
-            
-            photoClassifier.classifyPhotos(
-                assets: allPhotos,
-                progressHandler: { [weak self] (stage, progress) in
-                    DispatchQueue.main.async {
-                        self?.updateProgress(stage: stage, progress: progress)
-                    }
-                },
-                completion: { [weak self] result in
-                    guard let self = self else { return }
-                    
-                    DispatchQueue.main.async {
-                        self.updateProgress(stage: "分类完成", progress: 1.0)
-                        
-                        // 更新结果显示
-                        var resultText = "分类结果:\n"
-                        resultText += "截图:\(result.screenshots.count) 张\n"
-                        resultText += "相似照片组:\(result.similarPhotos.count) 组"
-                        self.resultLabel.text = resultText
-                        
-                        // 更新相似照片展示
-                        self.similarGroups = result.similarPhotos
-                        self.collectionView.reloadData()
-                    }
-                }
-            )
-        }
-    
-    private func updateProgress(stage: String, progress: Float) {
-            statusLabel.text = stage
-            progressView.progress = progress
-            percentageLabel.text = "\(Int(progress * 100))%"
-            
-            switch stage {
-            case "正在加载照片...":
-                detailProgressLabel.text = "正在读取照片数据"
-            case "正在提取特征...":
-                detailProgressLabel.text = "正在分析照片内容"
-            case "正在比较相似度...":
-                detailProgressLabel.text = "正在查找相似照片"
-            case "分类完成":
-                detailProgressLabel.text = "处理完成"
-            default:
-                break
-            }
-        }
-}
-
-// MARK: - UICollectionView DataSource & Delegate
-extension LoadingViewController: UICollectionViewDataSource, UICollectionViewDelegate {
-    func numberOfSections(in collectionView: UICollectionView) -> Int {
-        return similarGroups.count
-    }
-    
-    func collectionView(_ collectionView: UICollectionView,
-                       numberOfItemsInSection section: Int) -> Int {
-        return similarGroups[section].count
-    }
-    
-    func collectionView(_ collectionView: UICollectionView,
-                       cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
-        let cell = collectionView.dequeueReusableCell(
-            withReuseIdentifier: "PhotoCell",
-            for: indexPath
-        ) as! PhotoCell
-        
-        let asset = similarGroups[indexPath.section][indexPath.item]
-        cell.configure(with: asset)
-        return cell
-    }
-    
-    func collectionView(_ collectionView: UICollectionView,
-                       viewForSupplementaryElementOfKind kind: String,
-                       at indexPath: IndexPath) -> UICollectionReusableView {
-        if kind == UICollectionView.elementKindSectionHeader {
-            let header = collectionView.dequeueReusableSupplementaryView(
-                ofKind: kind,
-                withReuseIdentifier: "Header",
-                for: indexPath
-            ) as! HeaderView
-            
-            let groupCount = similarGroups[indexPath.section].count
-            header.titleLabel.text = "相似组 \(indexPath.section + 1) (\(groupCount) 张)"
-            return header
-        }
-        return UICollectionReusableView()
-    }
-}
-
-// MARK: - PhotoCell
-class PhotoCell: UICollectionViewCell {
-    private let imageView = UIImageView()
-    
-    override init(frame: CGRect) {
-        super.init(frame: frame)
-        setupUI()
-    }
-    
-    required init?(coder: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-    
-    private func setupUI() {
-        imageView.contentMode = .scaleAspectFill
-        imageView.clipsToBounds = true
-        imageView.translatesAutoresizingMaskIntoConstraints = false
-        contentView.addSubview(imageView)
-        
-        NSLayoutConstraint.activate([
-            imageView.topAnchor.constraint(equalTo: contentView.topAnchor),
-            imageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
-            imageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
-            imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)
-        ])
-    }
-    
-    func configure(with asset: PHAsset) {
-        let options = PHImageRequestOptions()
-        options.deliveryMode = .fastFormat
-        
-        PHImageManager.default().requestImage(
-            for: asset,
-            targetSize: CGSize(width: 200, height: 200),
-            contentMode: .aspectFill,
-            options: options
-        ) { [weak self] image, _ in
-            self?.imageView.image = image
-        }
-    }
-}
-
-// MARK: - HeaderView
-class HeaderView: UICollectionReusableView {
-    let titleLabel = UILabel()
-    
-    override init(frame: CGRect) {
-        super.init(frame: frame)
-        setupUI()
-    }
-    
-    required init?(coder: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-    
-    private func setupUI() {
-        titleLabel.font = .systemFont(ofSize: 16, weight: .medium)
-        titleLabel.translatesAutoresizingMaskIntoConstraints = false
-        addSubview(titleLabel)
-        
-        NSLayoutConstraint.activate([
-            titleLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 15),
-            titleLabel.centerYAnchor.constraint(equalTo: centerYAnchor)
-        ])
-    }
-}
+//// MARK: - UICollectionView DataSource & Delegate
+//extension LoadingViewController: UICollectionViewDataSource, UICollectionViewDelegate {
+//    func numberOfSections(in collectionView: UICollectionView) -> Int {
+//        return similarGroups.count
+//    }
+//    
+//    func collectionView(_ collectionView: UICollectionView,
+//                       numberOfItemsInSection section: Int) -> Int {
+//        return similarGroups[section].count
+//    }
+//    
+//    func collectionView(_ collectionView: UICollectionView,
+//                       cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+//        let cell = collectionView.dequeueReusableCell(
+//            withReuseIdentifier: "PhotoCell",
+//            for: indexPath
+//        ) as! PhotoCell
+//        
+//        let asset = similarGroups[indexPath.section][indexPath.item]
+//        cell.configure(with: asset)
+//        return cell
+//    }
+//    
+//    func collectionView(_ collectionView: UICollectionView,
+//                       viewForSupplementaryElementOfKind kind: String,
+//                       at indexPath: IndexPath) -> UICollectionReusableView {
+//        if kind == UICollectionView.elementKindSectionHeader {
+//            let header = collectionView.dequeueReusableSupplementaryView(
+//                ofKind: kind,
+//                withReuseIdentifier: "Header",
+//                for: indexPath
+//            ) as! HeaderView
+//            
+//            let groupCount = similarGroups[indexPath.section].count
+//            header.titleLabel.text = "相似组 \(indexPath.section + 1) (\(groupCount) 张)"
+//            return header
+//        }
+//        return UICollectionReusableView()
+//    }
+//}
+//
+//// MARK: - PhotoCell
+//class PhotoCell: UICollectionViewCell {
+//    private let imageView = UIImageView()
+//    
+//    override init(frame: CGRect) {
+//        super.init(frame: frame)
+//        setupUI()
+//    }
+//    
+//    required init?(coder: NSCoder) {
+//        fatalError("init(coder:) has not been implemented")
+//    }
+//    
+//    private func setupUI() {
+//        imageView.contentMode = .scaleAspectFill
+//        imageView.clipsToBounds = true
+//        imageView.translatesAutoresizingMaskIntoConstraints = false
+//        contentView.addSubview(imageView)
+//        
+//        NSLayoutConstraint.activate([
+//            imageView.topAnchor.constraint(equalTo: contentView.topAnchor),
+//            imageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
+//            imageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
+//            imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)
+//        ])
+//    }
+//    
+//    func configure(with asset: PHAsset) {
+//        let options = PHImageRequestOptions()
+//        options.deliveryMode = .fastFormat
+//        
+//        PHImageManager.default().requestImage(
+//            for: asset,
+//            targetSize: CGSize(width: 200, height: 200),
+//            contentMode: .aspectFill,
+//            options: options
+//        ) { [weak self] image, _ in
+//            self?.imageView.image = image
+//        }
+//    }
+//}
+//
+//// MARK: - HeaderView
+//class HeaderView: UICollectionReusableView {
+//    let titleLabel = UILabel()
+//    
+//    override init(frame: CGRect) {
+//        super.init(frame: frame)
+//        setupUI()
+//    }
+//    
+//    required init?(coder: NSCoder) {
+//        fatalError("init(coder:) has not been implemented")
+//    }
+//    
+//    private func setupUI() {
+//        titleLabel.font = .systemFont(ofSize: 16, weight: .medium)
+//        titleLabel.translatesAutoresizingMaskIntoConstraints = false
+//        addSubview(titleLabel)
+//        
+//        NSLayoutConstraint.activate([
+//            titleLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 15),
+//            titleLabel.centerYAnchor.constraint(equalTo: centerYAnchor)
+//        ])
+//    }
+//}

+ 316 - 316
QuickSearchLocation/Classes/Common/PhotoClassifier.swift

@@ -1,316 +1,316 @@
-import Photos
-import Vision
-
-class PhotoClassifier {
-    struct ClassifiedPhotos {
-        var screenshots: [PHAsset] = []
-        var locations: [String: [PHAsset]] = [:] // 按地点分组
-        var people: [String: [PHAsset]] = [:]     // 按人物分组
-        var similarPhotos: [[PHAsset]] = [] // 存储相似照片组
-    }
-    
-    func classifyPhotos(
-            assets: PHFetchResult<PHAsset>,
-            progressHandler: @escaping (String, Float) -> Void,
-            completion: @escaping (ClassifiedPhotos) -> Void
-        ) {
-            // 在后台队列处理
-            DispatchQueue.global(qos: .userInitiated).async {
-                var result = ClassifiedPhotos()
-                let group = DispatchGroup()
-                
-                // 开始处理
-                DispatchQueue.main.async {
-                    progressHandler("正在加载照片...", 0.0)
-                }
-                
-                // 1. 检测截图 (占总进度的 20%)
-                group.enter()
-                self.fetchScreenshots(from: assets) { screenshots in
-                    result.screenshots = screenshots
-                    DispatchQueue.main.async {
-                        progressHandler("正在检测截图...", 0.2)
-                    }
-                    group.leave()
-                }
-                
-                // 2. 检测相似照片 (占总进度的 80%)
-                group.enter()
-                self.detectSimilarPhotos(
-                    assets: assets,
-                    progressHandler: { stage, progress in
-                        // 将相似照片检测的进度映射到 20%-100% 的范围
-                        let mappedProgress = 0.2 + (progress * 0.8)
-                        DispatchQueue.main.async {
-                            progressHandler(stage, mappedProgress)
-                        }
-                    }
-                ) { similarPhotos in
-                    result.similarPhotos = similarPhotos
-                    group.leave()
-                }
-                
-                // 等待所有处理完成
-                group.notify(queue: .main) {
-                    progressHandler("分类完成", 1.0)
-                    completion(result)
-                }
-            }
-        }
-    
-    private func detectSimilarPhotos(
-            assets: PHFetchResult<PHAsset>,
-            progressHandler: @escaping (String, Float) -> Void,
-            completion: @escaping ([[PHAsset]]) -> Void
-        ) {
-            var similarGroups: [[PHAsset]] = []
-            let group = DispatchGroup()
-            var imageFeatures: [(asset: PHAsset, feature: VNFeaturePrintObservation)] = []
-            
-            // 创建处理队列
-            let processingQueue = DispatchQueue(label: "com.app.similarPhotos", qos: .userInitiated)
-            let semaphore = DispatchSemaphore(value: 5)
-            
-            // 1. 提取所有图片的特征
-            let totalAssets = assets.count
-            var processedAssets = 0
-            
-            progressHandler("正在加载照片...", 0.0)
-            
-            for i in 0..<assets.count {
-                let asset = assets[i]
-                group.enter()
-                semaphore.wait()
-                
-                let options = PHImageRequestOptions()
-                options.deliveryMode = .highQualityFormat
-                options.isSynchronous = false
-                options.resizeMode = .exact
-                
-                PHImageManager.default().requestImage(
-                    for: asset,
-                    targetSize: CGSize(width: 448, height: 448),
-                    contentMode: .aspectFit,
-                    options: options
-                ) { image, _ in
-                    defer {
-                        semaphore.signal()
-                    }
-                    
-                    guard let image = image,
-                          let cgImage = image.cgImage else {
-                        group.leave()
-                        return
-                    }
-                    
-                    processingQueue.async {
-                        do {
-                            let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
-                            let request = VNGenerateImageFeaturePrintRequest()
-                            try requestHandler.perform([request])
-                            
-                            if let result = request.results?.first as? VNFeaturePrintObservation {
-                                imageFeatures.append((asset, result))
-                                
-                                // 更新特征提取进度
-                                processedAssets += 1
-                                let progress = Float(processedAssets) / Float(totalAssets)
-                                progressHandler("正在提取特征...", progress * 0.6)
-                            }
-                        } catch {
-                            print("特征提取失败: \(error)")
-                        }
-                        group.leave()
-                    }
-                }
-            }
-            
-            // 2. 比较特征相似度并分组
-            group.notify(queue: processingQueue) {
-                progressHandler("正在比较相似度...", 0.6)
-                
-                // 近似度
-                let similarityThreshold: Float = 0.7
-                var processedComparisons = 0
-                let totalComparisons = (imageFeatures.count * (imageFeatures.count - 1)) / 2
-                var processedIndices = Set<Int>()
-                
-                for i in 0..<imageFeatures.count {
-                    if processedIndices.contains(i) { continue }
-                    
-                    var similarGroup: [PHAsset] = [imageFeatures[i].asset]
-                    processedIndices.insert(i)
-                    
-                    for j in (i + 1)..<imageFeatures.count {
-                        if processedIndices.contains(j) { continue }
-                        
-                        do {
-                            var distance: Float = 0
-                            try imageFeatures[i].feature.computeDistance(&distance, to: imageFeatures[j].feature)
-                            
-                            let similarity = 1 - distance
-                            if similarity >= similarityThreshold {
-                                similarGroup.append(imageFeatures[j].asset)
-                                processedIndices.insert(j)
-                            }
-                            
-                            // 更新比较进度
-                            processedComparisons += 1
-                            let compareProgress = Float(processedComparisons) / Float(totalComparisons)
-                            progressHandler("正在比较相似度...", 0.6 + compareProgress * 0.4)
-                        } catch {
-                            print("相似度计算失败: \(error)")
-                        }
-                    }
-                    
-                    if similarGroup.count > 1 {
-                        similarGroups.append(similarGroup)
-                    }
-                }
-                
-                // 按照照片数量降序排序
-                similarGroups.sort { $0.count > $1.count }
-                
-                DispatchQueue.main.async {
-                    completion(similarGroups)
-                }
-            }
-        }
-    
-    // 按地点分类
-    private func classifyByLocation(assets: PHFetchResult<PHAsset>,
-                                  completion: @escaping ([String: [PHAsset]]) -> Void) {
-        var locationGroups: [String: [PHAsset]] = [:]
-        let group = DispatchGroup()
-        let geocodeQueue = DispatchQueue(label: "com.app.geocoding")
-        let semaphore = DispatchSemaphore(value: 10) // 限制并发请求数
-        
-        assets.enumerateObjects { asset, _, _ in
-            if let location = asset.location {
-                group.enter()
-                semaphore.wait()
-                
-                geocodeQueue.async {
-                    let geocoder = CLGeocoder()
-                    geocoder.reverseGeocodeLocation(location) { placemarks, error in
-                        defer {
-                            semaphore.signal()
-                            group.leave()
-                        }
-                        
-                        if let placemark = placemarks?.first {
-                            let locationName = self.formatLocationName(placemark)
-                            DispatchQueue.main.async {
-                                if locationGroups[locationName] == nil {
-                                    locationGroups[locationName] = []
-                                }
-                                locationGroups[locationName]?.append(asset)
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        
-        // 等待所有地理编码完成后回调
-        group.notify(queue: .main) {
-            completion(locationGroups)
-        }
-    }
-
-    // 格式化地点名称(只返回城市名)
-    private func formatLocationName(_ placemark: CLPlacemark) -> String {
-        if let city = placemark.locality {
-            return city
-        }
-        return "其他"
-    }
-    
-    // 按人物分类
-    private func classifyByPeople(assets: PHFetchResult<PHAsset>,
-                                completion: @escaping ([String: [PHAsset]]) -> Void) {
-        var peopleGroups: [String: [PHAsset]] = [:]
-        let group = DispatchGroup()
-        
-        // 创建一个数组来存储检测到人脸的照片
-        var facesArray: [PHAsset] = []
-        
-        // 遍历所有照片
-        assets.enumerateObjects { asset, _, _ in
-            group.enter()
-            
-            // 获取照片的缩略图进行人脸检测
-            let options = PHImageRequestOptions()
-            options.isSynchronous = false
-            options.deliveryMode = .fastFormat
-            
-            PHImageManager.default().requestImage(
-                for: asset,
-                targetSize: CGSize(width: 500, height: 500), // 使用较小的尺寸提高性能
-                contentMode: .aspectFit,
-                options: options
-            ) { image, _ in
-                guard let image = image else {
-                    group.leave()
-                    return
-                }
-                
-                // 使用 Vision 框架检测人脸
-                guard let ciImage = CIImage(image: image) else {
-                    group.leave()
-                    return
-                }
-                
-                let request = VNDetectFaceRectanglesRequest()
-                let handler = VNImageRequestHandler(ciImage: ciImage)
-                
-                do {
-                    try handler.perform([request])
-                    if let results = request.results, !results.isEmpty {
-                        // 检测到人脸,添加到数组
-                        DispatchQueue.main.async {
-                            facesArray.append(asset)
-                        }
-                    }
-                } catch {
-                    print("人脸检测失败: \(error)")
-                }
-                
-                group.leave()
-            }
-        }
-        
-        // 等待所有检测完成后更新结果
-        group.notify(queue: .main) {
-            if !facesArray.isEmpty {
-                peopleGroups["包含人脸的照片"] = facesArray
-            }
-            completion(peopleGroups)
-        }
-    }
-    
-    // 识别截图
-    private func fetchScreenshots(from assets: PHFetchResult<PHAsset>,
-                                completion: @escaping ([PHAsset]) -> Void) {
-        var screenshots: [PHAsset] = []
-        
-        // 获取系统的截图智能相册
-        let screenshotAlbums = PHAssetCollection.fetchAssetCollections(
-            with: .smartAlbum,
-            subtype: .smartAlbumScreenshots,
-            options: nil
-        )
-        
-        // 从截图相册中获取所有截图
-        screenshotAlbums.enumerateObjects { collection, _, _ in
-            let fetchOptions = PHFetchOptions()
-            let screenshotAssets = PHAsset.fetchAssets(in: collection, options: fetchOptions)
-            
-            screenshotAssets.enumerateObjects { asset, _, _ in
-                screenshots.append(asset)
-            }
-        }
-        
-        completion(screenshots)
-    }
-} 
+//import Photos
+//import Vision
+//
+//class PhotoClassifier {
+//    struct ClassifiedPhotos {
+//        var screenshots: [PHAsset] = []
+//        var locations: [String: [PHAsset]] = [:] // 按地点分组
+//        var people: [String: [PHAsset]] = [:]     // 按人物分组
+//        var similarPhotos: [[PHAsset]] = [] // 存储相似照片组
+//    }
+//    
+//    func classifyPhotos(
+//            assets: PHFetchResult<PHAsset>,
+//            progressHandler: @escaping (String, Float) -> Void,
+//            completion: @escaping (ClassifiedPhotos) -> Void
+//        ) {
+//            // 在后台队列处理
+//            DispatchQueue.global(qos: .userInitiated).async {
+//                var result = ClassifiedPhotos()
+//                let group = DispatchGroup()
+//                
+//                // 开始处理
+//                DispatchQueue.main.async {
+//                    progressHandler("正在加载照片...", 0.0)
+//                }
+//                
+//                // 1. 检测截图 (占总进度的 20%)
+//                group.enter()
+//                self.fetchScreenshots(from: assets) { screenshots in
+//                    result.screenshots = screenshots
+//                    DispatchQueue.main.async {
+//                        progressHandler("正在检测截图...", 0.2)
+//                    }
+//                    group.leave()
+//                }
+//                
+//                // 2. 检测相似照片 (占总进度的 80%)
+//                group.enter()
+//                self.detectSimilarPhotos(
+//                    assets: assets,
+//                    progressHandler: { stage, progress in
+//                        // 将相似照片检测的进度映射到 20%-100% 的范围
+//                        let mappedProgress = 0.2 + (progress * 0.8)
+//                        DispatchQueue.main.async {
+//                            progressHandler(stage, mappedProgress)
+//                        }
+//                    }
+//                ) { similarPhotos in
+//                    result.similarPhotos = similarPhotos
+//                    group.leave()
+//                }
+//                
+//                // 等待所有处理完成
+//                group.notify(queue: .main) {
+//                    progressHandler("分类完成", 1.0)
+//                    completion(result)
+//                }
+//            }
+//        }
+//    
+//    private func detectSimilarPhotos(
+//            assets: PHFetchResult<PHAsset>,
+//            progressHandler: @escaping (String, Float) -> Void,
+//            completion: @escaping ([[PHAsset]]) -> Void
+//        ) {
+//            var similarGroups: [[PHAsset]] = []
+//            let group = DispatchGroup()
+//            var imageFeatures: [(asset: PHAsset, feature: VNFeaturePrintObservation)] = []
+//            
+//            // 创建处理队列
+//            let processingQueue = DispatchQueue(label: "com.app.similarPhotos", qos: .userInitiated)
+//            let semaphore = DispatchSemaphore(value: 5)
+//            
+//            // 1. 提取所有图片的特征
+//            let totalAssets = assets.count
+//            var processedAssets = 0
+//            
+//            progressHandler("正在加载照片...", 0.0)
+//            
+//            for i in 0..<assets.count {
+//                let asset = assets[i]
+//                group.enter()
+//                semaphore.wait()
+//                
+//                let options = PHImageRequestOptions()
+//                options.deliveryMode = .highQualityFormat
+//                options.isSynchronous = false
+//                options.resizeMode = .exact
+//                
+//                PHImageManager.default().requestImage(
+//                    for: asset,
+//                    targetSize: CGSize(width: 448, height: 448),
+//                    contentMode: .aspectFit,
+//                    options: options
+//                ) { image, _ in
+//                    defer {
+//                        semaphore.signal()
+//                    }
+//                    
+//                    guard let image = image,
+//                          let cgImage = image.cgImage else {
+//                        group.leave()
+//                        return
+//                    }
+//                    
+//                    processingQueue.async {
+//                        do {
+//                            let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
+//                            let request = VNGenerateImageFeaturePrintRequest()
+//                            try requestHandler.perform([request])
+//                            
+//                            if let result = request.results?.first as? VNFeaturePrintObservation {
+//                                imageFeatures.append((asset, result))
+//                                
+//                                // 更新特征提取进度
+//                                processedAssets += 1
+//                                let progress = Float(processedAssets) / Float(totalAssets)
+//                                progressHandler("正在提取特征...", progress * 0.6)
+//                            }
+//                        } catch {
+//                            print("特征提取失败: \(error)")
+//                        }
+//                        group.leave()
+//                    }
+//                }
+//            }
+//            
+//            // 2. 比较特征相似度并分组
+//            group.notify(queue: processingQueue) {
+//                progressHandler("正在比较相似度...", 0.6)
+//                
+//                // 近似度
+//                let similarityThreshold: Float = 0.7
+//                var processedComparisons = 0
+//                let totalComparisons = (imageFeatures.count * (imageFeatures.count - 1)) / 2
+//                var processedIndices = Set<Int>()
+//                
+//                for i in 0..<imageFeatures.count {
+//                    if processedIndices.contains(i) { continue }
+//                    
+//                    var similarGroup: [PHAsset] = [imageFeatures[i].asset]
+//                    processedIndices.insert(i)
+//                    
+//                    for j in (i + 1)..<imageFeatures.count {
+//                        if processedIndices.contains(j) { continue }
+//                        
+//                        do {
+//                            var distance: Float = 0
+//                            try imageFeatures[i].feature.computeDistance(&distance, to: imageFeatures[j].feature)
+//                            
+//                            let similarity = 1 - distance
+//                            if similarity >= similarityThreshold {
+//                                similarGroup.append(imageFeatures[j].asset)
+//                                processedIndices.insert(j)
+//                            }
+//                            
+//                            // 更新比较进度
+//                            processedComparisons += 1
+//                            let compareProgress = Float(processedComparisons) / Float(totalComparisons)
+//                            progressHandler("正在比较相似度...", 0.6 + compareProgress * 0.4)
+//                        } catch {
+//                            print("相似度计算失败: \(error)")
+//                        }
+//                    }
+//                    
+//                    if similarGroup.count > 1 {
+//                        similarGroups.append(similarGroup)
+//                    }
+//                }
+//                
+//                // 按照照片数量降序排序
+//                similarGroups.sort { $0.count > $1.count }
+//                
+//                DispatchQueue.main.async {
+//                    completion(similarGroups)
+//                }
+//            }
+//        }
+//    
+//    // 按地点分类
+//    private func classifyByLocation(assets: PHFetchResult<PHAsset>,
+//                                  completion: @escaping ([String: [PHAsset]]) -> Void) {
+//        var locationGroups: [String: [PHAsset]] = [:]
+//        let group = DispatchGroup()
+//        let geocodeQueue = DispatchQueue(label: "com.app.geocoding")
+//        let semaphore = DispatchSemaphore(value: 10) // 限制并发请求数
+//        
+//        assets.enumerateObjects { asset, _, _ in
+//            if let location = asset.location {
+//                group.enter()
+//                semaphore.wait()
+//                
+//                geocodeQueue.async {
+//                    let geocoder = CLGeocoder()
+//                    geocoder.reverseGeocodeLocation(location) { placemarks, error in
+//                        defer {
+//                            semaphore.signal()
+//                            group.leave()
+//                        }
+//                        
+//                        if let placemark = placemarks?.first {
+//                            let locationName = self.formatLocationName(placemark)
+//                            DispatchQueue.main.async {
+//                                if locationGroups[locationName] == nil {
+//                                    locationGroups[locationName] = []
+//                                }
+//                                locationGroups[locationName]?.append(asset)
+//                            }
+//                        }
+//                    }
+//                }
+//            }
+//        }
+//        
+//        // 等待所有地理编码完成后回调
+//        group.notify(queue: .main) {
+//            completion(locationGroups)
+//        }
+//    }
+//
+//    // 格式化地点名称(只返回城市名)
+//    private func formatLocationName(_ placemark: CLPlacemark) -> String {
+//        if let city = placemark.locality {
+//            return city
+//        }
+//        return "其他"
+//    }
+//    
+//    // 按人物分类
+//    private func classifyByPeople(assets: PHFetchResult<PHAsset>,
+//                                completion: @escaping ([String: [PHAsset]]) -> Void) {
+//        var peopleGroups: [String: [PHAsset]] = [:]
+//        let group = DispatchGroup()
+//        
+//        // 创建一个数组来存储检测到人脸的照片
+//        var facesArray: [PHAsset] = []
+//        
+//        // 遍历所有照片
+//        assets.enumerateObjects { asset, _, _ in
+//            group.enter()
+//            
+//            // 获取照片的缩略图进行人脸检测
+//            let options = PHImageRequestOptions()
+//            options.isSynchronous = false
+//            options.deliveryMode = .fastFormat
+//            
+//            PHImageManager.default().requestImage(
+//                for: asset,
+//                targetSize: CGSize(width: 500, height: 500), // 使用较小的尺寸提高性能
+//                contentMode: .aspectFit,
+//                options: options
+//            ) { image, _ in
+//                guard let image = image else {
+//                    group.leave()
+//                    return
+//                }
+//                
+//                // 使用 Vision 框架检测人脸
+//                guard let ciImage = CIImage(image: image) else {
+//                    group.leave()
+//                    return
+//                }
+//                
+//                let request = VNDetectFaceRectanglesRequest()
+//                let handler = VNImageRequestHandler(ciImage: ciImage)
+//                
+//                do {
+//                    try handler.perform([request])
+//                    if let results = request.results, !results.isEmpty {
+//                        // 检测到人脸,添加到数组
+//                        DispatchQueue.main.async {
+//                            facesArray.append(asset)
+//                        }
+//                    }
+//                } catch {
+//                    print("人脸检测失败: \(error)")
+//                }
+//                
+//                group.leave()
+//            }
+//        }
+//        
+//        // 等待所有检测完成后更新结果
+//        group.notify(queue: .main) {
+//            if !facesArray.isEmpty {
+//                peopleGroups["包含人脸的照片"] = facesArray
+//            }
+//            completion(peopleGroups)
+//        }
+//    }
+//    
+//    // 识别截图
+//    private func fetchScreenshots(from assets: PHFetchResult<PHAsset>,
+//                                completion: @escaping ([PHAsset]) -> Void) {
+//        var screenshots: [PHAsset] = []
+//        
+//        // 获取系统的截图智能相册
+//        let screenshotAlbums = PHAssetCollection.fetchAssetCollections(
+//            with: .smartAlbum,
+//            subtype: .smartAlbumScreenshots,
+//            options: nil
+//        )
+//        
+//        // 从截图相册中获取所有截图
+//        screenshotAlbums.enumerateObjects { collection, _, _ in
+//            let fetchOptions = PHFetchOptions()
+//            let screenshotAssets = PHAsset.fetchAssets(in: collection, options: fetchOptions)
+//            
+//            screenshotAssets.enumerateObjects { asset, _, _ in
+//                screenshots.append(asset)
+//            }
+//        }
+//        
+//        completion(screenshots)
+//    }
+//} 

+ 1 - 1
QuickSearchLocation/Classes/Pages/QSLMine/QSLAppInfo/QSLAppInfoController.swift

@@ -10,7 +10,7 @@ import YYText
 
 class QSLAppInfoController: QSLBaseController {
     
-    let photoClassifier = PhotoClassifier()
+//    let photoClassifier = PhotoClassifier()
     
     lazy var appIcon: UIImageView = {
         

+ 2 - 0
QuickSearchLocation/Info.plist

@@ -2,6 +2,8 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
+	<key>NSLocationWhenInUseUsageDescription</key>
+	<string>手机关爱定位为了使用定位轨迹功能需要您同意开启持续定位权限</string>
 	<key>ITSAppUsesNonExemptEncryption</key>
 	<false/>
 	<key>NSAppTransportSecurity</key>