Получить PHAsset/localIdentifier изображения, сохраненного в библиотеке фотографий

Я использую UIImageWriteToSavedPhotosAlbum для сохранения изображений в приложении "Фото". Это была единственная функция, которую я нашел, которая позволяет вам сделать это.

Вот мой код:

import UIKit
import Photos

class ViewController: UIViewController {

    /// photo of a cactus
    let photoURL = URL(string: "https://raw.githubusercontent.com/aheze/DeveloperAssets/master/cactus.png")! /// in my app it's actually a local URL, but this also works
    
    func saveToPhotos() {
        DispatchQueue.global().async {
            let data = try? Data(contentsOf: self.photoURL)
            let image = UIImage(data: data!)
            UIImageWriteToSavedPhotosAlbum(image!, self, #selector(self.image(_:didFinishSavingWithError:contextInfo:)), nil)
        }
    }

    /// called when the image saving is complete
    @objc func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {
        print("Finished saving image")
        
        /// how to get localIdentifier of the image?
        let asset = PHAsset() /// obviously this does not work...
        let localIdentifier = asset.localIdentifier
    }
}

Изображение успешно сохранено в приложении «Фотографии». Однако мне нужно сохранить ссылку на него, предпочтительно localIdentifier, чтобы я мог найти его среди других фотографий пользователя в будущем.

Например, когда я позже позвоню fetchAllPhotos, мне нужно найти способ найти фотографию кактуса, которую я сохранил.

var allPhotos: PHFetchResult<PHAsset>?

func fetchAllPhotos() {
    let fetchOptions = PHFetchOptions() /// get all of user's photos
    allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions)
    
    if let photos = allPhotos {
        photos.enumerateObjects { (asset, index, stop) in


            /// I need to find the image!  
            /// So I need to know its localIdentifier back when I saved it.
            if asset.localIdentifier == "cactus" {
                print("photo has been found")
            }
        }
    }
}

Есть ли способ сделать это? Обработчик завершения UIImageWriteToSavedPhotosAlbum ссылается на UIImage, так что, может быть, я могу создать из него PHAsset? Или, может быть, я могу что-то написать в метаданные UIImage, я не уверен.


person aheze    schedule 02.01.2021    source источник
comment
Рефакторинг вашего метода для использования PHAssetChangeRequest, в Интернете есть много примеров, и placeholderForCreatedAsset будет иметь правильный localIdentifier.   -  person Pranav Kasetti    schedule 04.01.2021
comment
@PranavKasetti выглядит очень многообещающе. Спасибо!   -  person aheze    schedule 04.01.2021


Ответы (1)


Попробуйте это для логики сохранения изображения:

try PHPhotoLibrary.shared().performChangesAndWait {
    let imgReq = PHAssetChangeRequest.creationRequestForAsset(from: image)
    self.localID = imgReq.placeholderForCreatedAsset.localIdentifier
 }

Вы можете получить локальный идентификатор следующим образом:

photos.enumerateObjects { (asset, index, stop) in
    if asset.localIdentifier == self.localID {
        print("photo was found")
    }
}
person Pranav Kasetti    schedule 04.01.2021
comment
Работает отлично! Спасибо! - person aheze; 04.01.2021