How can I share files using shared publishing on iOS?

I want to share some files that I have in my application using the Share Sheet functionality in iPhone. I show the file in UIWebview , and when the user clicks on the shared sheet, I want to show the parameters (email, whats app, etc.) to share the file displayed on the UIWebview . I know we can use

 func displayShareSheet(shareContent:String) { let activityViewController = UIActivityViewController(activityItems: [shareContent as NSString], applicationActivities: nil) presentViewController(activityViewController, animated: true, completion: {}) } 

to share the string. How to change this code for document sharing?

Thanks in advance.

+17
source share
3 answers

I want to share my UIActivityViewController solution and share the text as an image file. This solution works for sharing through 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 } 
+30
source

Swift 4.2 and Swift 5

If you already have a file in the directory and want to share it, just add it to 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 create a file :

I use this extension to create files from Data (read the comments in the code to explain how this works):

As in typedef answer, get the current document 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 of 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 any file in the Data format, and as far as I know, almost everything in Swift can be converted to Data , for example 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) 
+11
source

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 } 
+9
source

Source: https://habr.com/ru/post/1244594/


All Articles