3

ユーザーが自分のデバイスでファイルを印刷できる iOS アプリケーションを作成しています。私のアプリケーションから、DocumentPickeriCloud Drive、Dropbox などの他のアプリが提供するデバイス上のファイルにアクセスできます。

ここで、ユーザーが他のアプリケーションを介して自分のアプリケーションとファイルを共有できる機能を追加したいと考えています。そのために作成しAction Extensionました。たとえば、写真アプリケーションで画像を選択し、[Share共有] シートで [拡張子を取得] を選択すると、それを選択すると、ファイルの URL も取得されます。次に、このファイルの zip ファイルを作成して、サーバーに送信します。しかし問題は、zip ファイルが常に空であることです。私が使用しているコードは次のとおりです。

In Action 拡張機能の 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"
    }
}

共有ファイルの zip を作成する方法はありますか?

4

1 に答える 1

3

あなたの主な問題はimage.debugDescription、ファイルパスを期待しているアレイにやみくもに追加していることです。の出力はimage.debugDescription有効なファイル パスではありません。image実際のファイル パスを取得するには、 で適切な関数を使用する必要があります。

しかしimage、 の型を持つと宣言されていNSSecureCodingます。の出力に基づくとimage.debugDescriptionimageは実際には のタイプのようNSURLです。したがって、次のような行を使用してに変換imageする必要があります。NSURL

if let photoURL = image as? NSURL {
}

を取得したらNSURL、プロパティを使用しpathて実際に必要なパスを取得できます。

したがって、コードは次のようになります。

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

ヒント:ステートメントdebugDescription以外には使用しないでください。printその出力は、ほぼすべての情報を含む可能性のある単なる文字列であり、その出力は iOS のバージョンごとに変わる可能性があります。

于 2016-04-25T15:08:21.560 に答える