2016-04-13 12 views
3

ユーザーがデバイス上でファイルを印刷できるiOSアプリケーションを作成しています。私のアプリケーションからは、iCloudドライブ、Dropboxなどの他のアプリで提供されているDocumentPickerにアクセスしてデバイス上のファイルにアクセスできます。iOSからアプリケーションにファイルをインポートする

ここで、ユーザーは自分のアプリケーションとファイルを共有できます他のアプリケーション。私はAction Extensionを作成しました。 たとえば、写真アプリケーションで画像を選択してShareを選択した場合、共有シートに自分の内線番号が表示されます。選択すると、そのファイルのURLも表示されます。次に、このファイルのzipファイルを作成してサーバーに送信します。しかし、問題は、zipファイルが常に空であることです。 )アクション拡張ののviewDidLoad(で

if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) { 
    itemProvider.loadItemForTypeIdentifier(kUTTypeImage as String, options: nil, 
     completionHandler: { (image, error) in 
      NSOperationQueue.mainQueue().addOperationWithBlock { 
       print("Image: \(image.debugDescription)") 
       //Image: Optional(file:///Users/guestUser/Library/Developer/CoreSimulator/Devices/00B81632-041E-47B1-BACD-2F15F114AA2D/data/Media/DCIM/100APPLE/IMG_0004.JPG) 
       print("Image class: \(image.dynamicType)") 
       //Image class: Optional<NSSecureCoding> 
       self.filePaths.append(image.debugDescription) 
       let zipPath = self.createZip(filePaths) 
       print("Zip: \(zipPath)") 
      } 
     }) 
} 

そして、次のように私のcreateZip機能は次のとおりです:私は使用していたコードは以下の通りである

func createZipWithFiles(filePaths: [AnyObject]) -> String { 
    let zipPath = createZipPath() //Creates an unique zip file name 

    let success = SSZipArchive.createZipFileAtPath(zipPath, withFilesAtPaths: filePaths) 

    if success { 
     return zipPath 
    } 
    else { 
     return "zip prepation failed" 
    } 
} 

は、私ができる方法はあります共有ファイルのジップを作成しますか?

+0

'SSZipArchive'はエラーを返していますか?あなたは 'zipPath'への書き込みアクセス権と' filePaths'のすべてのパスへの読み取りアクセス権を持っていますか? – JAL

+0

いいえ、間違いはありません。 'zipPath'にzipファイルを作成するので、' zipPath'に書き込みアクセス権があります。そして、 'filePaths'中のファイルは、デフォルトのPhotosアプリケーションからの画像ファイルです。ログにはファイルが前述の位置に存在しないと言われていますが、端末をナビゲートするとファイルが表示されます(シミュレータ用)。 –

+0

'image.debugDescription'の使用は、画像へのファイルパスを取得する方法ではありません。最初に、完了ハンドラの実際のイメージタイプは何ですか? 'image.debugDescription'の出力は何ですか? – rmaddy

答えて

3

主な問題は、ファイルパスが予想されるアレイに盲目的にimage.debugDescriptionを追加していることです。 image.debugDescriptionの出力は、有効なファイルパスではありません。実際のファイルパスを取得するには、imageで適切な機能を使用する必要があります。

しかし、imageは、タイプがNSSecureCodingと宣言されています。 image.debugDescriptionの出力に基づいて、imageは実際にはタイプNSURLのようです。だから、のような行を使用してNSURLimageを変換する必要があります:あなたはNSURLを持っていたら、あなたが実際に必要なパスを取得するにはpathプロパティを使用することができます

if let photoURL = image as? NSURL { 
} 

だからあなたのコードは次のようになります。

if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) { 
    itemProvider.loadItemForTypeIdentifier(kUTTypeImage as String, options: nil, 
     completionHandler: { (image, error) in 
      if let photoURL = image as? NSURL { 
       NSOperationQueue.mainQueue().addOperationWithBlock { 
        let photoPath = photoURL.path 
        print("photoPath: \(photoPath)") 
        self.filePaths.append(photoPath) 
        let zipPath = self.createZip(filePaths) 
        print("Zip: \(zipPath)") 
       } 
      } 
    }) 
} 

ヒントprint声明以外の何のためにdebugDescriptionは絶対に使用しないでください。その出力はちょうどあらゆる情報を含むことができるちょっとした文字列であり、その出力はあるiOSバージョンから次のバージョンに変更することができます。

+0

ありがとうございました。これを回避するには、回避策として、アプリケーションのサンドボックスにNSDataを使用して一時イメージを作成し、そのイメージをzipファイルにコピーしてサーバーにアップロードするよりも、しかし、あなたの方法は、余分なイメージを作成する際の処理とメモリオーバーヘッドを節約します。 –

関連する問題