How to extract zip file and get extracted components in Share extension in Swift

I need to do the following:

  • I have another application where I will be exporting user config (.txt) and contacts (.vcf) in zip format.

  • In the second app I have an extension to get the exported zip and in the share extension, I need to extract the zip file and get both txt and vcf files and then upload them to the parser server.

I did before opening the exported zip in the share extension. but I couldn't get the extracted zip code. I couldn't get an answer online.

Here is my 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 -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)
    }

}

      

I am using SSZipAchive to extract the file. Link: https://github.com/ZipArchive/ZipArchive

I ran the app in Xcode 9 beta. I used a new app Files

from the simulator to share zip. Below is a list of Share.plist extensions

Share Extension Info.plist

I'm a newbie to share an extension so I don't know much about it. All of the above codes refer to bits and pieces from the following tutorials and a little search.

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

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

Please help me. I am using fast 3.

+4


source to share


1 answer


I found a solution. I made the mistake of giving the destination file path for the extracted items the same as the path for the source files. After changing it to the application documents directory, I got it working.



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

      

0


source







All Articles