Swift PHAsset PHAssetChangeRequest добавить / удалить ключевые слова - PullRequest
0 голосов
/ 23 апреля 2020

Я хотел бы программно добавлять / удалять ключевые слова из фотографий в библиотеке фотографий в приложении iOS. Я написал и протестировал приведенный ниже код, чтобы переключить любимую настройку на данной фотографии, но я не смог найти ничего в документации по ключевым словам. Фотографии явно содержат метаданные, которые содержат ключевые слова.

Вот простая функция для переключения «избранных» на последнюю фотографию в библиотеке, и этот код завершается, как и ожидалось.

class ViewController: UIViewController {
    @IBOutlet weak var myImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        photoAuthorization()
        toggleFavorite()
    }

    private func loadImage() -> UIImage? {

        let manager = PHImageManager.default()
        let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions())

        var image: UIImage? = nil
        manager.requestImage(for: fetchResult.object(at: 0), targetSize: CGSize(width: 800, height: 600), contentMode: .aspectFill, options: requestOptions() ) {img, err in
            guard let img = img else { return }
            image = img
        }
        return image

    }//load Image

    private func fetchOptions() -> PHFetchOptions {
        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
        return fetchOptions
    }//fetch options

    private func requestOptions() -> PHImageRequestOptions {
        let requestOptions = PHImageRequestOptions()
        requestOptions.isSynchronous = true
        requestOptions.deliveryMode = .highQualityFormat
        return requestOptions
    }//request options

    private func photoAuthorization() {
        let status = PHPhotoLibrary.authorizationStatus()

        switch status {
        case .authorized:
            myImageView.image = loadImage()
        case .restricted, .denied:
            print("put up alert for auth restricted or denied")
        case .notDetermined:
            PHPhotoLibrary.requestAuthorization { (status) in
                switch status {
                case .authorized:
                    DispatchQueue.main.async {
                        self.myImageView.image = self.loadImage()
                    }
                case .restricted, .denied:
                    print("in notDetermined put up alert for auth restricted or denied")
                case .notDetermined:
                    break
                @unknown default:
                    fatalError("fatal error inside request authorization (inner loop)")
                }
            }
        @unknown default:
            fatalError("fatal error authorized switch (outer loop)")
        }
    }//photo authorization

    private func toggleFavorite() {

        let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: fetchOptions())
        guard let firstAsset = fetchResult.firstObject else { return }

        PHPhotoLibrary.shared().performChanges({
            let changeRequest = PHAssetChangeRequest(for: firstAsset)
            changeRequest.isFavorite = !firstAsset.isFavorite

            //want to add keyword instead of toggling favorite
            //changeRequest.setValue("jumping", forKey: "keywords")
            //
        }) { (success, error) in
            print(success ? "Successfully updated favorite" : "\(error ?? "error did not work either" as! Error)")
        }
    }//toggle favorite

}//class

Любое руководство будет быть оцененным Xcode 11.4.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...