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

iOS import files into my application

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

现在,我想添加一项功能,用户可以通过其他应用程序与我的应用程序共享文件。我为此创建了一个 Action Extension。 例如,如果我 select 照片应用程序中的图像和 select Share 我在共享 sheet 中得到我的扩展,当我 select 它时,我也得到文件的URL。接下来,我正在创建此文件的 zip 文件以将其发送到我的服务器。但问题是,zip 文件总是空的。我使用的代码如下:

在 Action Extension 的 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 文件?

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

但是 image 被声明为 NSSecureCoding 类型。根据 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 用于除print 语句以外的任何内容。它的输出只是一些可以包含任何信息的字符串,并且输出可以从一个 iOS 版本更改为下一个版本。