Search code examples
swiftuiactivityviewcontroller

Add Instagram to UIActivityViewController


I'm trying to share an image using standard UIActivityViewController, it's fine to share on Facebook, Twitter and Save Image using this code:

let firstActivityItem = "foo text"
let secondActivityItem : UIImage = image!

let activityViewController : UIActivityViewController = UIActivityViewController(
    activityItems: [firstActivityItem, secondActivityItem], applicationActivities: nil)

activityViewController.excludedActivityTypes = [
    UIActivityTypePostToWeibo,
    UIActivityTypePrint,
    UIActivityTypeAssignToContact,
    UIActivityTypeAddToReadingList,
    UIActivityTypePostToVimeo,
    UIActivityTypePostToTencentWeibo
]

self.presentViewController(activityViewController, animated: true, completion: nil)

I need one more thing, Instagram:

If UIApplication.sharedApplication().canOpenURL(instagramURL!) {
            // Success
            var img = image!

            var savePath: String = NSHomeDirectory().stringByAppendingPathComponent("Documents/Test.igo")
            UIImageJPEGRepresentation(img, 1).writeToFile(savePath, atomically: true)
            var imgURL = NSURL(string: NSString(format: "file://%@", savePath) as! String)
            docController = UIDocumentInteractionController(URL: imgURL!) // 1
            docController.UTI = "com.instagram.exclusivegram" // 2
            docController.delegate = self
            docController.annotation = ["InstagramCaption":"testsss"] // 3
            docController.presentOpenInMenuFromRect(self.view.frame, inView: self.view, animated: true) // 4
        } else {
            // Error
        }    

Both these codes work fine separately, how can I add Instagram to the UIActivityViewController? Is it possible at all?


Solution

  • I think it would be very easier to add other social shares to the code you wrote for Instagram. The ".igo" extension is exclusive for Instagram so other apps will not support it. Just change this extension from ".igo" to ".ig" and other apps will read it:

    var savePath: String = NSHomeDirectory().stringByAppendingPathComponent("Documents/Test.ig")
    

    But Instagram also have an exclusive UTI to avoiding other apps to appear in the same Document Interaction View. So you will also need to change it from "exclusivegram" to "photo":

    docController.UTI = "com.instagram.photo"
    

    I have an app with a similar functionality and this is my original code:

    @IBAction func shareOnIntagram(sender: UIButton) {
    
            let finalImage: UIImage = UIImage.imageWithView(photoView)
            let instagramURL = NSURL(string: "instagram://app")
            if (UIApplication.sharedApplication().canOpenURL(instagramURL!)) {
    
                let imageData = UIImageJPEGRepresentation(finalImage, 1)
                let captionString = "caption"
                let writePath = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("instagram.ig")
                if imageData?.writeToFile(writePath, atomically: true) == false {
    
                    return
    
                } else {
    
                    let fileURL = NSURL(fileURLWithPath: writePath)
                    self.documentController = UIDocumentInteractionController(URL: fileURL)
                    self.documentController.delegate = self
                    self.documentController.UTI = "com.instagram.photo"
                    self.documentController.annotation = NSDictionary(object: captionString, forKey: "InstagramCaption")
                    self.documentController.presentOpenInMenuFromRect(self.view.frame, inView: self.view, animated: true)
                }
    
            } else {
                print(" Instagram is not installed ")
            }
        }
    

    To make this code work, don't forget to add UIDocumentInteractionControllerDelegate in the UIViewController class.