Photos.framework에서 iCloud 저장된 이미지를 로드할 수 없는 문제 해결

이것은 iOS Advent Calendar 2017 18 일째 게시물입니다.
어제 17일째는 k0mach1씨의 Firebase Authentication의 idToken을 서버 인증에 사용자 서비스의 User와 연결한 이야기(iOS편)이었습니다.

가정 기능



다음과 같은 앱 중 하나의 기능을 생각해보십시오.


  • 카메라 롤에서 이미지를로드하고 UICollectionView에서 표시
  • 선택하면 상단 미리보기 표시
  • 이 때 원본 이미지로로드

  • 원본 이미지를 사용하여 다음 처리로 진행

  • 빠는거리



    다음 복합 요소로 빠졌습니다 ...
  • iCloud 설정에서 iPhoneのストレージ最適化 (Optimize iPhone Strage) 켜기
  • 원래 크기로 얻기위한 크기 상수 PHImageManagerMaximumSize 지정

  • iCloud 설정에서 iPhone의 스토리지 최적화(Optimize iPhone Strage)를 켭니다.



    다음 設定 > iCloud > 写真에서 스토리지 최적화 옵션을 선택한 경우입니다.


    이 경우 요청 옵션에 다음을 지정하여 iCloud의 사진을 가져올 수도 있습니다.
    let requestOptions = PHImageRequestOptions()
    requestOptions.isNetworkAccessAllowed = true
    

    그러나 이것만으로는 다음 조건에서 문제가 여전히 문제가 남아 있습니다.
    (반대로 말하면, 이것만으로 취득할 수 있던 조건도 있었습니다.)

    원래의 사이즈로 취득하기 위한 사이즈 정수 PHImageManagerMaximumSize 를 지정


    PHImageManagerMaximumSize에는 다음 설명이 포함되어 있습니다.
    // Size to pass when requesting the original image or the largest rendered image available (resizeMode will be ignored)
    @available(iOS 8.0, *)
    public let PHImageManagerMaximumSize: CGSize
    

    원래 이미지를 얻으려면 원래 크기를 모르기 때문에이 상수를 지정하십시오.

    무엇이 문제였는가



    이번과 같은 요건을 제대로 채우기 위해서는 isNetworkAccessAllowed = true 뿐만이 아니라, progressHandler 의 처리도 필요했습니다.

    이번에 당황한 원인은
    CollectionView에서 표시하고 있는 이미지와 같이, 사이즈를 지정해 리퀘스트하면 취득할 수 있고, 썸네일상은 취득되어 있는 것처럼 보여 버렸던 점
    입니다.

    그리고, 스토리지의 최적화의 대상이 되고 있는 화상은, 오리지날로 로드해 볼 때까지, 외관상은 판별할 수 없습니다.

    답변



    그래서 해결 된 코드입니다.
    let requestOptions = PHImageRequestOptions()
    requestOptions.version = .current
    requestOptions.deliveryMode = .highQualityFormat
    requestOptions.isSynchronous = false
    requestOptions.isNetworkAccessAllowed = true
    requestOptions.progressHandler = { [weak self](progress, error, stop, info) in
        print("Loading image from iCloud")
    }
    PHImageManager.default().requestImage(for: photoAsset.asset,
                                          targetSize: PHImageManagerMaximumSize,
                                          contentMode: .aspectFill,
                                          options: requestOptions,
                                          resultHandler: { [weak self](image, _) in
                                              guard let image = image else { return }
                                              self?.selectedImage = image
    })
    

    요약



    시간의 제약 때문에, 은근하게 밖에 문서를 조사할 수 없었습니다만, Photos.framework 에 대한 설명은 적고, stack overflow에서도 소량의 정보 밖에 발견되지 않았습니다.
    이 부분을 다루는 문서를 알고 계시다면 꼭 알려주세요.

    참고

    좋은 웹페이지 즐겨찾기