如何提取 zip 文件并在 Swift 中的共享扩展中获取提取的组件

How to extract a zip file and get the extracted components in a Share Extension in Swift

我需要做以下事情-

  1. 我有另一个应用程序,我将在其中以 zip 格式导出用户配置 (.txt) 和联系人 (.vcf)。

  2. 在第二个应用程序中,我有一个共享扩展名来获取导出的 zip,在共享扩展名中,我需要提取 zip 文件并获取 txt 和 vcf 文件,然后将它们上传到解析服务器。

我已经完成了,直到在共享扩展中打开导出的 zip。但我无法提取 zip。 我在网上找不到答案。

这是我的 ShareViewController

import UIKit
import Social
import Parse
import MobileCoreServices
import SSZipArchive

class ShareViewController: SLComposeServiceViewController {

    var requird_data : NSData!
    var path : URL!

    override func viewDidLoad() {
        super.viewDidLoad()
        //Parse.setApplicationId("cGFyc2UtYXBwLXdob3N1cA==", clientKey: "")
        initUI()
        getURL()
        textView.delegate = self
        textView.keyboardType = .numberPad
    }

//    override func viewWillAppear(_ animated: Bool) {
//        super.viewWillAppear(true)
//
//    }

    func initUI()
    {

        navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
        title = "upup"

        navigationController?.navigationBar.tintColor = .white
        navigationController?.navigationBar.backgroundColor = UIColor(red:0.97, green:0.44, blue:0.12, alpha:1.00)
        placeholder = "Please enter your Phone number"
    }

    private func getURL() {
        let extensionItem = extensionContext?.inputItems.first as! NSExtensionItem
        let itemProvider = extensionItem.attachments?.first as! NSItemProvider
        let zip_type = String(kUTTypeZipArchive)
        if itemProvider.hasItemConformingToTypeIdentifier(zip_type) {
            itemProvider.loadItem(forTypeIdentifier: zip_type, options: nil, completionHandler: { (item, error) -> Void in
                guard let url = item as? NSURL else { return }
                print("\(item.debugDescription)")
                OperationQueue.main.addOperation {
                    self.path = url as URL
                    SSZipArchive.unzipFile(atPath: url.path!, toDestination: url.path!)
                }
            })
        } else {
            print("error")
        }
    }

    override func isContentValid() -> Bool {
        // Do validation of contentText and/or NSExtensionContext attachments here
        return true
    }

    override func didSelectPost() {
        // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.

        // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
        self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
    }

    override func configurationItems() -> [Any]! {
        // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
        return []
    }

    override func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool
    {
        let length = ((textView.text)?.characters.count)! + text.characters.count - range.length
        let allowedset : CharacterSet = CharacterSet(charactersIn: "0123456789+").inverted as CharacterSet
        let filtered  = (text.components(separatedBy: allowedset)).joined(separator: "")

        return (length<17) && (text == filtered)
    }

}

我使用 SSZipAchive 提取文件。 Link : https://github.com/ZipArchive/ZipArchive

我 运行 Xcode 9 beta 1 中的应用程序。我使用模拟器中的新 Files 应用程序来共享 zip。 下面是我的分享扩展 Info.Plist

我是共享扩展的新手,所以我不太了解它。以上所有代码均来自以下教程的点点滴滴和一些谷歌搜索。

1.https://www.appcoda.com/ios8-share-extension-swift/

2.https://hackernoon.com/how-to-build-an-ios-share-extension-in-swift-4a2019935b2e

请指导我。 我用 swift 3.

我找到了解决办法。将提取的项目的目标文件路径与源文件路径相同是我的错误。将其更改为应用程序的文档目录后,我开始工作了。

let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
SSZipArchive.unzipFile(atPath: url.path!, toDestination: documentsPath)