Publique UIImage a Instagram usando Swift similar a SLComposeViewController

Tengo un proyecto iOS Xcode 7 Swift 2 en el que estoy trabajando. La aplicación publica fotos en Facebook y Twitter usando:

 var shareToFacebook: SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeFacebook) 

y

 var shareToTwitter: SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeTwitter) 

Me encanta lo fácil y simple que es publicar una foto en estos dos medios sociales. No necesitaba ni quería las API para ellos.

Quiero hacer algo similar y simple para Instagram . ¿Cuál es la mejor manera de hacerlo sin tener que lidiar con Instagram API ? ¿O no tengo otra opción?

Mis data fotos se guardan utilizando NSCoding , no en el NSCoding DocumentDirectory . Miré aquí para la integración pero esto es para una foto guardada en el directory la aplicación.

Simplemente algo simple como lo que ya tengo para Facebook y Twitter.

Miré aquí y encontré una solución:

NSObject un 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 shanetworkingManager: 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.shanetworkingApplication().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() } } } 

Luego en mi @IBAction utilicé:

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

Esto abre un menu con el estilo "abierto" y el usuario puede abrir la aplicación en Instagram (si está instalado).

Actualizado para 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 shanetworkingManager: 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.shanetworking.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, prefernetworkingStyle: .alert) } } } 

y luego en el ViewController que desea llamarlo …

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

Esto abre la function 'abrir-en' si Instagram está instalado