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.
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
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).
Here is a reusable class with swift 4+. Working in Xcode 10.1.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With