skip to Main Content

I have an iOS Xcode 7 Swift 2 project I’m working on. The app posts photos to Facebook and Twitter using:

var shareToFacebook: SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeFacebook)

and

var shareToTwitter: SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeTwitter)

Love how easy and simple for just posting a photo to these two social medias. I didn’t need or want the APIs for them.

I want to do something similar and simple for Instagram. What is the best way to do this without having to deal with Instagram API? Or do I have no choice?

My photo data is saved using NSCoding, not in the DocumentDirectory. I looked here for integration but this is for a photo saved in the app directory.

Just something simple like what I already have for Facebook and Twitter.

3

Answers


  1. Chosen as BEST ANSWER

    I looked here and found a solution:

    I created an NSObject:

    import UIKit
    import Foundation
    
    class InstagramManager: NSObject, UIDocumentInteractionControllerDelegate {
    
        private let kInstagramURL = "instagram://app"
        private let kUTI = "com.instagram.exclusivegram"
        private let kfileNameExtension = "instagram.igo"
        private let kAlertViewTitle = "Error"
        private let kAlertViewMessage = "Please install the Instagram application"
    
        var documentInteractionController = UIDocumentInteractionController()
    
        // singleton manager
        class var sharedManager: InstagramManager {
            struct Singleton {
                static let instance = InstagramManager()
            }
            return Singleton.instance
        }
    
        func postImageToInstagramWithCaption(imageInstagram: UIImage, instagramCaption: String, view: UIView) {
            // called to post image with caption to the instagram application
    
            let instagramURL = NSURL(string: kInstagramURL)
            if UIApplication.sharedApplication().canOpenURL(instagramURL!) {
                let jpgPath = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent(kfileNameExtension)
                UIImageJPEGRepresentation(imageInstagram, 1.0)!.writeToFile(jpgPath, atomically: true)
                let rect = CGRectMake(0,0,612,612)
                let fileURL = NSURL.fileURLWithPath(jpgPath)
                documentInteractionController.URL = fileURL
                documentInteractionController.delegate = self
                documentInteractionController.UTI = kUTI
    
                // adding caption for the image
                documentInteractionController.annotation = ["InstagramCaption": instagramCaption]
                documentInteractionController.presentOpenInMenuFromRect(rect, inView: view, animated: true)
            } else {
    
                // alert displayed when the instagram application is not available in the device
                UIAlertView(title: kAlertViewTitle, message: kAlertViewMessage, delegate:nil, cancelButtonTitle:"Ok").show()
            }
        }
    
    }
    

    Then in my @IBAction I used:

    let image = self.photoImageView.image
    InstagramManager.sharedManager.postImageToInstagramWithCaption(image!, instagramCaption: "(self.description)", view: self.view)
    

    This opens bring a menu up with the 'open-in' style and the user can open the app in Instagram (if installed).


  2. Updated for Swift 3

    import UIKit
    import Foundation
    
    class InstagramManager: NSObject, UIDocumentInteractionControllerDelegate {
    
        private let kInstagramURL = "instagram://app"
        private let kUTI = "com.instagram.exclusivegram"
        private let kfileNameExtension = "instagram.igo"
        private let kAlertViewTitle = "Error"
        private let kAlertViewMessage = "Please install the Instagram application"
    
        var documentInteractionController = UIDocumentInteractionController()
    
        // singleton manager
        class var sharedManager: InstagramManager {
            struct Singleton {
                static let instance = InstagramManager()
            }
            return Singleton.instance
        }
    
        func postImageToInstagramWithCaption(imageInstagram: UIImage, instagramCaption: String, view: UIView) {
            // called to post image with caption to the instagram application
    
            let instagramURL = NSURL(string: kInstagramURL)
    
            if UIApplication.shared.canOpenURL(instagramURL! as URL) {
    
                let jpgPath = (NSTemporaryDirectory() as NSString).appendingPathComponent(kfileNameExtension)
    
                do {
                    try UIImageJPEGRepresentation(imageInstagram, 1.0)?.write(to: URL(fileURLWithPath: jpgPath), options: .atomic)
    
                } catch {
    
                    print(error)
                }
    
                let rect = CGRect(x: 0, y: 0, width: 612, height: 612)
                let fileURL = NSURL.fileURL(withPath: jpgPath)
                documentInteractionController.url = fileURL
                documentInteractionController.delegate = self
                documentInteractionController.uti = kUTI
    
                // adding caption for the image
                documentInteractionController.annotation = ["InstagramCaption": instagramCaption]
                documentInteractionController.presentOpenInMenu(from: rect, in: view, animated: true)
            } else {
    
                /// display some message about how it didn't work
                /// Like: UIAlertController(title: kAlertViewTitle, message: kAlertViewMessage, preferredStyle: .alert)
            }
        }
    }
    

    and then in the ViewController you want to call it in…

    InstagramManager.sharedManager.postImageToInstagramWithCaption(imageInstagram: <YOUR IMAGE>, instagramCaption: shareText, view: self.view)
    

    This opens the ‘open-in’ function if Instagram is installed

    Login or Signup to reply.
  3. Here is a reusable class with swift 4+. Working in Xcode 10.1.

    1. Make swift empty file.
    2. copy and paste the below code into the file.

      import UIKit
      import Foundation
      
      class InstagramHelper: NSObject, UIDocumentInteractionControllerDelegate {
      
          private let kInstagramURL = "instagram://den3079"
          private let kUTI = "com.instagram.exclusivegram"
          private let kfileNameExtension = "instagram.igo"
          private let kAlertViewTitle = "Error"
          private let kAlertViewMessage = "Please install the Instagram application"
      
          var documentInteractionController = UIDocumentInteractionController()
      
          // singleton manager
          class var sharedManager: InstagramHelper {
              struct Singleton {
                  static let instance = InstagramHelper()
              }
              return Singleton.instance
          }
      
      
          func postImageToInstagramWithCaption(imageInstagram: UIImage, instagramCaption: String, controller: UIViewController) {
              // called to post image with caption to the instagram application
      
              let instagramURL = URL(string: kInstagramURL)
      
              DispatchQueue.main.async {
      
                  if UIApplication.shared.canOpenURL(instagramURL!) {
      
                      let jpgPath = (NSTemporaryDirectory() as NSString).appendingPathComponent(self.kfileNameExtension)
                      if let jpegData = UIImageJPEGRepresentation(imageInstagram, 1.0) {
                          do {
                              try jpegData.write(to: URL(fileURLWithPath: jpgPath), options: .atomicWrite)
      
                          } catch {
                              print("write image failed")
                          }
                      }else {
                          let jpegData = UIImagePNGRepresentation(imageInstagram)
                          do {
                              try jpegData?.write(to: URL(fileURLWithPath: jpgPath), options: .atomicWrite)
      
                          } catch {
                              print("write image failed")
                          }
                      }
                      let fileURL = NSURL.fileURL(withPath: jpgPath)
                      self.documentInteractionController.url = fileURL
                      self.documentInteractionController.delegate = self
                      self.documentInteractionController.uti = self.kUTI
      
                      // adding caption for the image
                      self.documentInteractionController.annotation = ["InstagramCaption": instagramCaption]
                      self.documentInteractionController.presentOpenInMenu(from: controller.view.frame, in: controller.view, animated: true)
      
                  } else {
      
                      // alert displayed when the instagram application is not available in the device
                      self.showAlert("", message: self.kAlertViewMessage, controller: controller)
                  }
              }
          }
       func showAlert(_ title: String, message: String, controller : UIViewController){
      
          let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
          let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: { action -> Void in
              //Just dismiss the action sheet
              let selector: Selector = NSSelectorFromString("alertOkButtonHandler")
              if controller.responds(to: selector){
                  _ = controller.perform(selector)
              }
          })
          alert.addAction(okAction)
          controller.present(alert, animated: true, completion: nil)
      }}
      

    And use of this function in ViewController class.

    InstagramHelper.sharedManager.postImageToInstagramWithCaption(imageInstagram: img!, instagramCaption: "www.google.com", controller: self)
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search