2017-10-26 14 views
1

이메일을 통해 PHAsset 이미지를 보내려고합니다. 우선 샌드 박스 앱을 사용하는 기본 사례를 얻으려고합니다. 그런 다음 결국 PHAssets 배열을 반복합니다. 아래는 내 샌드 박스 코드이며, 몇 가지 질문/문제가 있습니다. (이 코드 스 니펫 중 일부는 this SO post에서 가져온 것입니다.) 그리고 이것은 this list on another SO post에서 가장 Swift-4/PHAsset 최신 버전 인 것으로 보인 TLPHAssets이라는 다중 자산 선택 도구를 구현하려는 노력의 일부입니다. 모두 실행하는Swift 3 PHAs 세트를 이메일로 보내십시오.

  1. 내가 문제 코드의 resultHandler 블록을 얻는 데 :

    func dismissPhotoPicker(withTLPHAssets: [TLPHAsset]) { 
        // use selected order, fullresolution image 
    
        self.selectedAssets = withTLPHAssets 
    
        let mail = MFMailComposeViewController() 
        mail.mailComposeDelegate = self; 
        mail.setToRecipients(["emailaddress.com"]) 
        // Put the rest of the email together and present the draft to the user 
        mail.setSubject("Subject") 
    
        let options = PHImageRequestOptions() 
        options.isNetworkAccessAllowed = true 
        options.version = .current 
        options.deliveryMode = .opportunistic 
        options.resizeMode = .fast 
        let asset : PHAsset = self.selectedAssets[0].phAsset! as PHAsset 
        PHImageManager.default().requestImage(for: asset, targetSize: CGSize(width : 400, height : 400), contentMode: .aspectFit, options: options, resultHandler: {(result: UIImage!, info) in 
         if let image = result 
         { 
          let imageData: NSData = UIImageJPEGRepresentation(image, 1.0)! as NSData 
          mail.addAttachmentData(imageData as Data, mimeType: "image/jpg", fileName: "BeforePhoto.jpg") 
         } 
        }) 
    

    두 가지 질문 (I 기본 뭔가를 누락하면 나는 사과 있도록 스위프트에 아주 새로운 해요) . targetSize를 PHImageManagerMaximumSize로 설정했지만 다른 포스트의 권장 사항에서 400x400으로 변경했습니다. (그런데 카메라 롤에서 이미지를 선택하고 PHAsset의 mediaType이 ' 이미지 '로 표시되지만 라이브 사진이나 비디오 작업은하지 않습니다. 그 다음 단계로 넘어가겠습니다. 적절한 애셋 요청 처리기를 호출하기 위해 switch 문을 추가합니다. PHImageManagerMaximumSize가 작동하지 않는 이유는 무엇입니까? 그리고 시뮬레이터에서 응용 프로그램을 실행하고 다섯 개의 캔틴 이미지 중 하나를 선택하면 코드의 resultHandler 블록 (및 모든 mediaType 'image')이 표시되지 않습니다. 내 요청에 무슨 문제가 있을지 모르겠다. 결과를 방해하고있는 이미지 호출 .Handler는 호출되지 않습니까?

  2. 결국 내 카메라 롤에서 이미지를 가져 와서 targetSize와 함께 400x400에서 resultHandler 코드를 호출하게했습니다. 하지만 이제 resultHandler 내에서 샌드 박스 응용 프로그램이 "2017-10-26 15 : 35 : 26.604997-0700 MultiAssetPicker [15766 : 4904592]와 함께"let imageData : NSData ... "행에 충돌합니다. 예기치 않게 nil이 예기치 않게 발견되었습니다. 선택적 값의 래핑 해제 ".

무엇보다도 모든 도움을 주셨습니다.

답변

0

나는 그것을 알아 냈다. 핵심은 PHImageRequestOptions에서 isSynchronous를 true로 설정하는 것이 었습니다. 이 문제를 해결해 준 최신 코드는 아래에 있지만, 아직 생산이라고하지는 않습니다 (테스트가 더 필요합니다).

    // Set up the image-request options 
        let options = PHImageRequestOptions() 
        options.isNetworkAccessAllowed = true 
        options.version = .current 
        options.deliveryMode = .opportunistic 
        options.isSynchronous = true 
        options.resizeMode = .fast 

        // For each photo asset the user selected 
        for i in 0..<self.selectedAssets.count { 

         // Convert to a PHAsset 
         let asset : PHAsset = self.selectedAssets[i].phAsset! as PHAsset 

         // Request the underlying asset as an image 
         PHImageManager.default().requestImage(for: asset, targetSize: CGSize(width : 400, height : 400), contentMode: .aspectFill, options: options, resultHandler: {(result: UIImage!, info) in 

          // If the asset is in fact an image, attach it to the email being composed 
          switch self.selectedAssets[i].phAsset?.mediaType { 
          case .image?: 
           print("Image \(i)") 
           let imageData: NSData = UIImageJPEGRepresentation(result!, 0.9)! as NSData 
           mail.addAttachmentData(imageData as Data, mimeType: "image/jpg", fileName: "Attachment\(i).jpg") 
          case .video?: 
           print("Video not supported.") 
          case .audio?: 
           print("Audio not supported") 
          default: 
           print("Unknown") 
          } 
         }) 
        }