2017-10-26 19 views
1

PHAssetイメージを電子メールで送信しようとしています。私はまず、基底ケースをサンドボックスアプリケーションに入れようとしています。そして、最終的にPHAssetsの配列を繰り返し処理したいと考えています。以下は私のサンドボックスコードです。それに続くいくつかの質問/問題があります。 (このコードスニペットの一部はthis SO postから来ました。)これはTLPHAssetsと呼ばれるマルチアセット・ピッカーを実装しようとしている部分の1つで、this list on another SO postから現在のSwift-4/PHAssetの最新バージョンです。Swift 3 PHAssetを電子メールで送信

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") 
     } 
    }) 

つの質問(私は基本的に何か欠けている場合、私は謝罪ので、スウィフトにかなり新しいです):

  1. を私が今までに実行を取得するために、トラブルコードのresultHandlerブロックを取得を抱えています。私はtargetSizeをPHImageManagerMaximumSizeに設定しましたが、別のポストの勧告で400x400に変更しました(ちなみに私はカメラのロールからイメージを選んでいますが、PHAssetのmediaTypeが '私は正しいアセットリクエストハンドラを確実に呼び出すためにswitch文を追加します)。なぜPHImageManagerMaximumSizeが機能しないのですか?そして、私がシミュレータでアプリケーションを実行し、5つの缶詰めの画像のうちの1つを選択すると、resultHandlerコードブロックに入ることはできません(これらはすべてmediaType 'image'です)。 resultHandlerの呼び出しを妨げているrequestImage呼び出しで何が間違っているのでしょうか?

  2. 最終的に私のカメラのロールからイメージを取得し、targetSizeで400x400でresultHandlerコードを呼び出すようにしました。しかし、結果resultHandlerの中で、私のサンドボックスアプリは、 "2017-10-26 15:35:26.604997-0700 MultiAssetPicker [15766:4904592]と" let imageData:NSData ... "という行にクラッシュしています。オプションの値をアンラップする "。

ご協力いただきありがとうございます。

答えて

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") 
          } 
         }) 
        } 
関連する問題