iOS 13 - PHImageManager возвращает уменьшенное изображение для фотографий My Photo Stream - PullRequest
0 голосов
/ 02 февраля 2020

Начиная с iOS 13 Я не могу получить исходные версии фотографий в My Photo Stream с помощью PhotoKit. У меня было несколько жалоб от пользователей за последние несколько месяцев, так что это не что-то конкретное c для моего собственного устройства или учетной записи. Следующий код всегда получает очень маленькие изображения (например, 360 x 480).

PHPhotoLibrary.requestAuthorization({ status in
    DispatchQueue.main.async {
        if status == .authorized {

            // if iCloud Photo Library is disabled and Photo Stream is enabled this will give you My Photo Stream
            let photoStream = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumMyPhotoStream, options: nil)
            if let photoStreamCollection = photoStream.firstObject {

                let res = PHAsset.fetchAssets(in: photoStreamCollection, options: nil)
                if let asset = res.firstObject {

                    let opts = PHImageRequestOptions()
                    opts.deliveryMode = .highQualityFormat
                    opts.isSynchronous = true
                    opts.isNetworkAccessAllowed = true
                    opts.resizeMode = .exact

                    print("asset size: \(asset.pixelWidth) x \(asset.pixelHeight)")

                    PHImageManager.default().requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .default, options: opts) { (img, info) in
                        if let img = img {
                            print("image size: \(img.size.width * img.scale) x \(img.size.height * img.scale)")
                        }
                    }

                    PHImageManager.default().requestImageDataAndOrientation(for: asset, options: opts) { (imgData, dateUTI, orientation, info) in
                        if let imgData = imgData {
                            if let img = UIImage(data: imgData) {
                                print("image size: \(img.size.width * img.scale) x \(img.size.height * img.scale)")
                            }
                        }
                    }
                }
            }
        }
    }
})

Консоль:
Размер актива: 1536 x 2048
2020-02-02 08:18: 44.452620-0700 photostreamphoto [7370: 2576203] [ImageManager] [RM]: 1-1-0 Не удалось декодировать изображение
2020-02-02 08: 18: 44.468675-0700 photostreamphoto [7370: 2576203] [ImageManager] [ RM]: 1-1-0 Не удалось декодировать изображение
2020-02-02 08: 18: 44.479691-0700 photostreamphoto [7370: 2576203] [ImageManager] [RM]: 1-1-0 Не удалось декодировать изображение
размер изображения: 360,0 x 480,0
2020-02-02 08: 18: 44.485069-0700 photostreamphoto [7370: 2576203] [ImageManager] [RM]: 1-2-0 Не удалось загрузить изображение с URL: file: ///var/mobile/Media/PhotoStreamsData/267078714/100APPLE/IMG_0001.JPG
2020-02-02 08: 18: 44.490447-0700 photostreamphoto [7370: 2576203] [ImageManager] [RM]: 1-2- 0 Не удалось загрузить изображение с URL: file: ///var/mobile/Media/PhotoStreamsData/267078714/100APPLE/IMG_0001.JPG
2020-02-02 08: 18: 44.501745-0700 photostreamphoto [7370: 2576203] [7370: 2576203] [ Образ Менеджер] [RM]: 1-2-0 Не удалось загрузить изображение с URL: file: ///var/mobile/Media/PhotoStreamsData/267078714/100APPLE/IMG_0001.JPG
размер изображения: 360,0 x 480,0

Я испробовал все мыслимые комбинации опций в PHRequestOptions. Обратите внимание, что если я установлю opts.version = .original, это даст мне ноль изображения и ноль данных изображения.

Я также попытался asset.requestContentEditingInput(...), чтобы попытаться получить прямой доступ к URL-адресу изображения:

let editingOpts = PHContentEditingInputRequestOptions()
editingOpts.isNetworkAccessAllowed = true
editingOpts.canHandleAdjustmentData = { data in
    return true
}
asset.requestContentEditingInput(with: editingOpts) { input, info in
    if let input = input, let url = input.fullSizeImageURL {
        let path = url.path
        let fm = FileManager.default
        if fm.fileExists(atPath: path) {
            // doesn't reach this
        }
    }
}

Консоль:

2020-02-02 08: 26: 49.641787-0700 photostreamphoto [7416: 2578984] [PhotoKit] URL-адрес файла ресурса ресурса недоступен, возможно, был удален, будет пытаться запросить изменение доступности

Интересно, что UIImagePicker действительно получает исходное изображение (например, 1536 x 2048). Приложение «Фото» также показывает изображение в полном разрешении. Я sh Я знал, какие черные маги c они используют.

Если кто-нибудь знает об обходном пути, пожалуйста, поделитесь.

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