iOS将文件导入我的应用程序

时间:2016-04-13 16:14:24

标签: ios swift ios-extensions ios-sharesheet

我正在创建一个iOS应用程序,用户可以通过该应用程序在其设备上打印文件。从我的应用程序中,我可以通过其他应用程序(如iCloud Drive,Dropbox等)提供的DocumentPicker访问设备上的文件。

现在,我想添加一个功能,用户可以通过其他应用程序与我的应用程序共享该文件。我为此创建了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"
    }
}

有没有办法可以创建共享文件的zip?

1 个答案:

答案 0 :(得分:3)

您的主要问题是您盲目地将image.debugDescription添加到期望文件路径的数组中。 image.debugDescription的输出根本不是有效的文件路径。您需要在image上使用适当的函数来获取实际的文件路径。

image声明的类型为NSSecureCoding。根据{{​​1}}的输出,似乎image.debugDescription实际上属于image类型。因此,您需要使用以下行代码将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语句以外的任何内容。它的输出只是一些字符串,可以包含任何信息,输出可以从一个iOS版本更改为下一个版本。