How do I share files using share sheet in iOS?

后端 未结 3 1507
悲哀的现实
悲哀的现实 2020-12-24 12:32

I want to share some files I have locally in my app using Share Sheet functionality on iPhone. I display the file in a UIWebView and when the user clicks the sh

相关标签:
3条回答
  • 2020-12-24 13:11

    Swift 4.2 and Swift 5

    If you already have a file in a directory and want to share it, just add it's URL into activityItems:

    let fileURL = NSURL(fileURLWithPath: "The path where the file you want to share is located")
    
    // Create the Array which includes the files you want to share
    var filesToShare = [Any]()
    
    // Add the path of the file to the Array
    filesToShare.append(fileURL)
    
    // Make the activityViewContoller which shows the share-view
    let activityViewController = UIActivityViewController(activityItems: filesToShare, applicationActivities: nil)
    
    // Show the share-view
    self.present(activityViewController, animated: true, completion: nil)
    

    If you need to make the file:

    I'm using this extension to make files from Data (read the comments in the code for explanation how it works):

    As in the typedef's answer, get the current documents directory:

    /// Get the current directory
    ///
    /// - Returns: the Current directory in NSURL
    func getDocumentsDirectory() -> NSString {
        let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let documentsDirectory = paths[0]
        return documentsDirectory as NSString
    }
    

    Extension for Data:

    extension Data {
    
        /// Data into file
        ///
        /// - Parameters:
        ///   - fileName: the Name of the file you want to write
        /// - Returns: Returns the URL where the new file is located in NSURL
        func dataToFile(fileName: String) -> NSURL? {
    
            // Make a constant from the data
            let data = self
    
            // Make the file path (with the filename) where the file will be loacated after it is created
            let filePath = getDocumentsDirectory().appendingPathComponent(fileName)
    
            do {
                // Write the file from data into the filepath (if there will be an error, the code jumps to the catch block below)
                try data.write(to: URL(fileURLWithPath: filePath))
    
                // Returns the URL where the new file is located in NSURL
                return NSURL(fileURLWithPath: filePath)
    
            } catch {
                // Prints the localized description of the error from the do block
                print("Error writing the file: \(error.localizedDescription)")
            }
    
            // Returns nil if there was an error in the do-catch -block
            return nil
    
        }
    
    }
    

    Examples how to use:

    Share image-files:

    // Your image
    let yourImage = UIImage()
    

    in png-file

    // Convert the image into png image data
    let pngImageData = yourImage.pngData()
    
    // Write the png image into a filepath and return the filepath in NSURL
    let pngImageURL = pngImageData?.dataToFile(fileName: "nameOfYourImageFile.png")
    
    // Create the Array which includes the files you want to share
    var filesToShare = [Any]()
    
    // Add the path of png image to the Array
    filesToShare.append(pngImageURL!)
    
    // Make the activityViewContoller which shows the share-view
    let activityViewController = UIActivityViewController(activityItems: filesToShare, applicationActivities: nil)
    
    // Show the share-view
    self.present(activityViewController, animated: true, completion: nil)
    

    in jpg-file

    // Convert the image into jpeg image data. compressionQuality is the quality-compression ratio in % (from 0.0 (0%) to 1.0 (100%)); 1 is the best quality but have bigger filesize
    let jpgImageData = yourImage.jpegData(compressionQuality: 1.0)
    
    // Write the jpg image into a filepath and return the filepath in NSURL
    let jpgImageURL = jpgImageData?.dataToFile(fileName: "nameOfYourImageFile.jpg")
    
    // Create the Array which includes the files you want to share
    var filesToShare = [Any]()
    
    // Add the path of jpg image to the Array
    filesToShare.append(jpgImageURL!)
    
    // Make the activityViewContoller which shows the share-view
    let activityViewController = UIActivityViewController(activityItems: filesToShare, applicationActivities: nil)
    
    // Show the share-view
    self.present(activityViewController, animated: true, completion: nil)
    

    Share text-files:

    // Your String including the text you want share in a file
    let text = "yourText"
    
    // Convert the String into Data
    let textData = text.data(using: .utf8)
    
    // Write the text into a filepath and return the filepath in NSURL
    // Specify the file type you want the file be by changing the end of the filename (.txt, .json, .pdf...)
    let textURL = textData?.dataToFile(fileName: "nameOfYourFile.txt")
    
    // Create the Array which includes the files you want to share
    var filesToShare = [Any]()
    
    // Add the path of the text file to the Array
    filesToShare.append(textURL!)
    
    // Make the activityViewContoller which shows the share-view
    let activityViewController = UIActivityViewController(activityItems: filesToShare, applicationActivities: nil)
    
    // Show the share-view
    self.present(activityViewController, animated: true, completion: nil)
    

    Other files:

    You can make a file from anything which is in Data format and as far as I know, almost everything in Swift can be converted into Data like String, Int, Double, Any...:

    // the Data you want to share as a file
    let data = Data()
    
    // Write the data into a filepath and return the filepath in NSURL
    // Change the file-extension to specify the filetype (.txt, .json, .pdf, .png, .jpg, .tiff...)
    let fileURL = data.dataToFile(fileName: "nameOfYourFile.extension")
    
    // Create the Array which includes the files you want to share
    var filesToShare = [Any]()
    
    // Add the path of the file to the Array
    filesToShare.append(fileURL!)
    
    // Make the activityViewContoller which shows the share-view
    let activityViewController = UIActivityViewController(activityItems: filesToShare, applicationActivities: nil)
    
    // Show the share-view
    self.present(activityViewController, animated: true, completion: nil)
    
    0 讨论(0)
  • I want to share my solution of UIActivityViewController and sharing text as a image file. This solution works for sharing via Mail and even Save to Dropbox.

    @IBAction func shareCsv(sender: AnyObject) {
        //Your CSV text
        let str = self.descriptionText.text!
        filename = getDocumentsDirectory().stringByAppendingPathComponent("file.png")
    
        do {
            try str.writeToFile(filename!, atomically: true, encoding: NSUTF8StringEncoding)
    
            let fileURL = NSURL(fileURLWithPath: filename!)
    
            let objectsToShare = [fileURL]
            let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
    
            self.presentViewController(activityVC, animated: true, completion: nil)
    
        } catch {
            print("cannot write file")
            // failed to write file – bad permissions, bad filename, missing permissions, or more likely it can't be converted to the encoding
        }
    
    }
    
    func getDocumentsDirectory() -> NSString {
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        let documentsDirectory = paths[0]
        return documentsDirectory
    }
    
    0 讨论(0)
  • 2020-12-24 13:26

    Here's the Swift 3 version:

    let dictToSave: [String: Any] = [
        "someKey": "someValue"
    ]
    
    let jsonData = try JSONSerialization.data(withJSONObject: dictToSave, options: .prettyPrinted)
    
    let filename = "\(self.getDocumentsDirectory())/filename.extension"
    let fileURL = URL(fileURLWithPath: filename)
    try jsonData.write(to: fileURL, options: .atomic)
    
    let vc = UIActivityViewController(activityItems: [fileURL], applicationActivities: [])
    
    self.present(vc, animated: true)
    
    
    func getDocumentsDirectory() -> String {
        let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let documentsDirectory = paths[0]
        return documentsDirectory
    }
    
    0 讨论(0)
提交回复
热议问题