아이폰 OS 개발 팁 - PhotoKit

개요

PhotoKit 아이폰 OS 8은 자원 아이폰 OS 9 시작 포기했다 ALAssetsLibrary 표준 라이브러리를 액세스하기 전에 앨범의 시작을 대체하기 위해 도입되어야한다. 물론, ALAssetsLibrary에 관하여는 확장 성, API는 몇 가지 팁 PhotoKit 사용과 쉬운 구덩이에 단계를 논의하기 위해 주로 여기에 사용하고 더 강력한, 그러나 이것은 오늘날의 논의의 초점 아닙니다합니다.

PHImageManager 또는 사용자 정의

이러한 사진 앨범에 대한 액세스와 같은 일반적인 리소스에 액세스 앨범 작업 또는 리소스에 대한 액세스, 당신은 할 수 PHImageManager.default (). RequestImage (XXX) 애플을 당기는 단순한 그림이 아닌 그것에 콜백, 당신은 자신의 유지 보수를 사용하는 것이 좋습니다 PHCachingImageManager이 (특정 사용을 참조하십시오 이름 캐시 자원에서 볼 수 있기 때문에 (PHImageManager 서브 클래스) 하나의 실시 예, PHCachingImageManager을 )은 사용할 수 있기 때문에, 목록을 슬라이딩하는 과정에서 유용 : targetSize가 : 대한 (startCachingImages을 contentMode : 옵션을 : 사전로드 자원의 사용이 필요하지 않은 통화 표시되지 않은 : targetSize가 : contentMode에 대한 stopCachingImages을 ( :) 옵션 은 상위 클래스의 더 많은 기능 사용이 있다는 사실뿐만 아니라, 캐시를 제거합니다.

targetSize가 : contentMode : 대한 requestImage ( 옵션 : resultHandler : 사실 옵션의 방법이 사용하는 모든 사람들에게 쉽게, 그는 종종 자리를 혼동 때문에이 지역 위의 아이 클라우드에 저장되지 않을 수 있지만, 아이폰 OS의 사진 앨범, 지역 미리보기 이미지 만 :

  • isNetworkAccessAllowed : 개방형 네트워크가 아이 클라우드에 최적화 된로드되지 로컬 사진 썸네일, 당신은 네트워크 부하를 열어야합니다, 기본값은 false입니다 만, true로 설정되어있는 비 특별한 경우 네트워크 부하를 해제하지 않는 것이 좋습니다
  • isSynchronous가 : 사진에 대한 동기 획득, 그렇지 않으면 취득 비동기 여부가 아닌 특별한 사정이 스레드를 차단합니다 동기 인수를 사용하지 않는 것이 좋습니다, 기본값은 false입니다
  • 버전 : 자원 사용 버전, 예를 들어, 비디오 획득 과정이 편집하거나 원본 비디오를 얻기 얻을라고, 편집되지 않은에 대한 기본 전류 (아이폰 OS의 사진 앨범 편집이 복원 될 수 있기 때문에, 사실 그것은 편집 정보 포함) 원래 자원 획득은 편집 자원을 편집 획득.
  • deliveryMode는 : 말 그대로 자원이 요청을 개시 한 후 요청 (그러나 아마이 지역 자원에) 제공 할 때 시스템이 얼마나, 전달 모델을 자원, 기본값은 기회 서로 다른 같은 동기 호출이 반환 하나 개의 자원 비동기 호출이 반환에게 다양한 자원 ( 관련 isSynchronous) 위에 말하자면 화상의 크기; highQualityFormat의 어떠한 경우 만 고품질 자원 반환 FastFormat 어떤 경우 리턴 하나만 결과는 낮은 해상도가 아니다 (저화질 영상 일 수있다 그것은 결과 PHImageResultIsDegradedKey resultHandler 정보 필드에 의해 판단 될 수있다) 낮은 정의하지 않습니다.
  • resizeMode : 크기 조정 모드,이 사실이 방법 targetSize가 매개 변수에 관련되어, 기본은 빠른 지역 아트 워크, targetSize가를 사용하여 로컬 썸네일 최적의 사진을 얻을 때 반환되는 원래의 대신하지만, 크기가 targetSize가보다 약간 더있을 수 있습니다 , 대형 (targetSize가 인 경우 PHImageManagerMaximumSize 단순히 무시 이해가되지 않는이 시간에이 속성의 사진을 끌어 것을 주) 없음 사진 크기 반환, 정확한 같은 빠른 하지만 반환 정의지도. 그러나, 비동기 가능하기 때문에의 경우 두 개의 이미지는 다음과 같은 두 가지 사례 소개 약간 다를 수 있습니다.

isSynchronousdeliveryMode , resizeMode의 관계 (전제 isNetworkAccessAllowed 해당 = 네트워크 부하를 열 수있다) :

isSynchronous 진정한 동기로드 =이 점 deliveryMode 무시됩니다에, 그래서 그냥 resizeMode 봐

  • 없음 : 원래 크기로 돌아 가기
  • 빠른 : 사용 축소판에 최적화 된 원본 targetSize가이 targetSize가보다 약간 더 큰 그림을 반환 할 수 있습니다
  • 정확한 : 반환 높은 품질의 사진을 targetSize가

isSynchronous 비동기로드 거짓 = :이 시간이 모두 resizeMode에 deliveryMode 변화를 따라

  • deliveryMode = 편의적

    • 없음 : 먼저 낮은 반환 명확한 사진 한 다음 원래로 돌아
    • 빠른 : 낮은 수익률의 첫 화면이 선명 돌아가서 targetSize가이 targetSize가보다 약간 클 수 있습니다 그림을 최적화 사용
    • 정확한 : 먼저 낮은 반환 명확한 사진 한 다음 지정된 targetSize가 높은 품질의 사진을 반환
  • deliveryMode = highQualityFormat

    • 없음 : 원래로 돌아 가기
    • 고속은 : targetSize가이 그림을 최적화 반환은 targetSize가보다 약간 클 수 있습니다
    • 정확한 : 반환 높은 품질의 사진을 targetSize가
  • deliveryMode = fastFormat

    • 없음 : 낮은 수익 명확한 사진
    • 빠른 : 낮은 수익 명확한 사진
    • 정확한 : 낮은 수익 명확한 사진을

반환 여부 요청이 두 번이나하지 deliveryMode deliveryMode = 기회를 제공 보낸 경우에만 비동기 요청의 반환 결과를 요약 두 결과.

위의 상황은 분명히 쉽게 이해 구덩이에 빠지지 않은 경우 예, 단순히 오픈 네트워크, 당신은 정상적인 상황에서 디폴트 값을 사용할 수 있습니다. 그러나에서 인터넷 연결 후 무슨 일 없다고 말?

어떤 네트워크 케이스 없습니다

그것은 훨씬 더 때문에 네트워크 구성 상황에 말한다? 때문에 PHImageRequestOptions의 기본이 실제로 어떤 네트워크입니다. 다음과 같은 요청을 봐 :

let requestOption = PHImageRequestOptions()
requestOption.resizeMode = .exact
let scale:CGFloat = UIScreen.main.scale
let newSize = CGSize(width: 200.0, height: 200)
PHImageManager.default().requestImage(for: asset, targetSize: newSize, contentMode: .aspectFill, options: requestOption,resultHandler: completeHandler)

첫째, 설정하지 isNetworkAccessAllowed의 속성을 기본 값이 false,이 시간은 상대적으로 고화질 사진 resizeMode = .exact 요청에 의해 다음 모든 네트워크 요청입니다하지 않습니다. 그러나 중요한 문제는이 이미지는 낮은 품질의 이미지도 200에 도달 될 수있다 (200)는, 특히 막연한있을 수 있습니다 예상 축소판.
말했다에 따르면 이전, deliveryMode 디폴트가없는
기회 주의적는 , isSynchronous는 * 디폴트는 비동기 경우, 인쇄 정보 정보 두 개의 결과를 반환합니다이 경우에는 첫 번째, 거짓입니다 :
첫째 :
[AnyHashable ( "PHImageResultIsDegradedKey ") : 1 AnyHashable (" PHImageResultRequestIDKey ") : 1100]
제 :
[AnyHashable ("PHImageResultIsDegradedKey ') : 0, AnyHashable ( "PHImageErrorKey") = NSCocoaErrorDomain 도메인 에러 코드 = -1 "(NULL)'AnyHashable ( "PHImageResultIsInCloudKey") : 1 AnyHashable ( "PHImageResultRequestIDKey") : 1100]

그것은 처음으로 볼 수는 낮은 품질의 이미지, 고해상도가 두 번째 시간입니다,하지만이 시간을 잘못 PHImageResultIsInCloudKey = 1없이 지역의 HD지도,하지만 그들은 PHImageErrorKey 정보를 던지고, 오류에 얻을 수있는 네트워크에 액세스하고,이 수 없기 때문에 반환 된 화상 = 닐, 이것은 결과 때만 저품질 이미지를 참조한다. 위 이외에 명확한 사진을 반환 그래서 여부를 네트워크 요청이 직접적으로 관련이 있도록, 또한 여부 말했다.

특별한 상황을 제외하고 모양을 합산, 개방형 네트워크의 사용은 비동기 요청을 요청하고 두 번 요청을 반환 할 적절한 시간 여부를 결정합니다.

영상 획득

과정은 물론, 할 비디오 경로에 직접하지 PhotoKit 업로드 비디오를하기 때문에이 과정에 익숙하지 가능성이 다음과 같은 방법을 사용하는 경우, 사진과 비디오 자원도 다소 다르다 얻으려면 :

let option = PHVideoRequestOptions()
option.isNetworkAccessAllowed = true
option.version = .current
option.deliveryMode = .highQualityFormat
PHImageManager.default().requestAVAsset(forVideo: phAsset, options: option) { (avAsset, _, _) in
    if let avAsset = avAsset as? AVURLAsset {
        let fileURL = avAsset.url
        // upload by fileURL
    }
}

시스템이 업로드하지 못했습니다 전에이 문제는 가능성 아이폰 OS 10의 코드에서 발생 될 것이다, 또는 당신은 기본적으로 액세스 시스템의 낮은 버전의 URL 경로가 제한 주로 때문에, 성공 후 전달할 수 있습니다.

올바른 자세는 샌드 박스 첫 번째 비디오로 내 보낸 다음 로컬에서 업로드해야한다, 그럼 어떻게 로컬에 복사? 대답은 사용하는 것입니다 PHAssetResourceManager을 이 클래스는, 자원 관리를 촉진하는 것입니다 상대적으로 늦게 아이폰 OS 9가 도입에 나타납니다, 자원은 다음 앨범 샌드 박스를 작성하는 자신의 지역 자원하여 샌드 박스를 업로드 할 수 있습니다.

let resources = PHAssetResource.assetResources(for: phAsset)
let options = PHAssetResourceRequestOptions()
options.isNetworkAccessAllowed = true
PHAssetResourceManager.default().writeData(for: assetResource, toFile: videoURL, options: options, completionHandler: { (error) in
    // upload by videoURL
    
})

하지만이 이야기의 끝이 아니다, 다음 버그는 사용자가 업로드 한 경우이 방법으로 편집 된 자원을 안전 50 년대를 통해 같은 60 년대에 대한 사용자의 비디오 클립으로 (이 편집하기 전에 업로드 찾을 것입니다, 이 방법은 바람직하지 않다 있도록 설정 PHVideoRequestOptions.version에 PHImageManager 요청에 비교 될 수 있기 때문에 그것의 업로드 또는 60)은, 그것은, API에 대한 모습도 친구가있는 경우 사용하는 방법을 알고 (어떤 설정을 사용할 수 없습니다이 정보를 발견 결여 다른 버전의 메시지를 얻을 수있는이 방법은) 말해. 당신의 또 다른이 방법 PHImageManager을 사용할 수 있도록 requestExportSession (XXX)이 비디오에 수출되고 다음 샌드 박스를 업로드,하지만 당신은 원시 비디오를 내보낼 경우 이렇게하면 또 다른 작은 문제에 대한 가능성은, 오직 가능한 멀리 얻을 수 있습니다 높은 HD 비디오.

let videoOption = PHVideoRequestOptions()
videoOption.version = PHVideoRequestOptionsVersion.current
videoOption.isNetworkAccessAllowed = true
PHImageManager.default().requestExportSession(forVideo: phAsset, options: videoOption, exportPreset: AVAssetExportPresetHighestQuality) { (exportSession, info) in
    if let exportSession = exportSession {
        exportSession.outputURL = videoURL
        exportSession.outputFileType = AVFileType.mp4
        exportSession.exportAsynchronously {
        if exportSession.status == AVAssetExportSession.Status.completed {
            // upload by videoURL
        }
    }
}

추천

출처www.cnblogs.com/kenshincui/p/ios-kai-fatipsphotokit.html