Instagram最近改变了他们的API政策,允许开发人员通过他们自己的应用程序将图片发布到Instagram平台。我们之前使用的其他几种技术来做到这一点。其中一个是调用Instagram应用程序,它实际上会打开Instagram并从那里进行共享。关于如何做到这一点的教程可以在这里看到:How to share image to Instagram from your own iOS app
然而,有几个应用程序允许直接共享到Instagram平台而无需调用Instagram应用程序。 Hipstamatic's Oggl允许直接共享到Instagram而无需调用Instagram。下面我发布了一些过程的屏幕截图。
拍完照片后,Oggl给了我其他几个社交网络,我可以分享我的照片。我选择了Facebook和Instagram。
在我选择Instagram后,它打开了Safari,它带我到以下两页授权Oggl发布到Instagram。我输入了我的Instagram凭据,然后它将我带到了授权页面。
一旦我授权Oggl,我就可以上传到Instagram,几秒钟后,我在Instagram新闻Feed中看到了这张照片。这种类型的共享非常类似于Facebook和Twitter共享。它有相同的概念。怎么可以这样做呢?如何在他们的应用程序中复制这个确切的过程?在我的应用程序中拍摄的照片是612像素×612像素,因此它们与Instagram上拍摄的照片尺寸兼容。我已经实现了对Facebook和Twitter的共享,但我想像Oggl那样实现上传到Instagram。这可能吗?
有许多iOS开发人员可以从这个问题的详细规范答案中受益。
谢谢
Hipstamatic是少数通过Instagram API提供写入权限的应用程序之一。
Instagram没有用于发布照片的公共API,它可以让您获取数据,但不能自己编写。
Hipstamatic和其他几个应用程序已与Instagram达成特殊协议,允许他们使用写API并直接发布照片。
对于所有其他开发人员,您需要使用iOS挂钩通过切换到他们的应用程序来共享到Instagram。
据我所知,让Instagram写入访问权限并不容易 - 你需要拥有一个高质量内容的顶级应用程序,并与合适的人友好:)
你不能直接在Instagram上发布图像。您必须使用UIDocumentInteractionController重定向图像。使用下面的代码,希望它会有所帮助
@property (nonatomic, retain) UIDocumentInteractionController *dic;
CGRect rect = CGRectMake(0 ,0 , 0, 0);
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIGraphicsEndImageContext();
NSString *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/test.igo"];
NSURL *igImageHookFile = [[NSURL alloc] initWithString:[[NSString alloc] initWithFormat:@"file://%@", jpgPath]];
self.dic.UTI = @"com.instagram.photo";
self.dic = [self setupControllerWithURL:igImageHookFile usingDelegate:self];
self.dic=[UIDocumentInteractionController interactionControllerWithURL:igImageHookFile];
[self.dic presentOpenInMenuFromRect: rect inView: self.view animated: YES ];
-(UIDocumentInteractionController *) setupControllerWithURL: (NSURL*) fileURL usingDelegate: (id <UIDocumentInteractionControllerDelegate>) interactionDelegate {
UIDocumentInteractionController *interactionController = [UIDocumentInteractionController interactionControllerWithURL: fileURL];
interactionController.delegate = interactionDelegate;
return interactionController;
}
你想要做的是通过Instagram API http://instagram.com/developer/实现。您还可以使用Instagram应用程序执行类似的操作。这些记录在iPhone Hooks下。如果您使用的是Ruby Motion,那么您将能够使用official framework。不幸的是,没有官方支持的Objective-C iOS API,但有一些开源替代品可供使用,例如NRGramKit。
实现与Instagram API的交互的确切方式超出了Stack Overflow的答案,但如果您熟悉iOS编程,上面的链接应该为您提供一个良好的起点。
来自Instagram API文档的逐字:
https://instagram.com/developer/endpoints/media/
目前,无法通过API上传。我们有意识地选择不添加此内容,原因如下:
- Instagram是关于你在旅途中的生活 - 我们希望鼓励应用程序内的照片。
- 我们想要打击垃圾邮件和低质量的照片。一旦我们允许从其他来源上传,就很难控制Instagram生态系统中的内容。所有这些,我们正在努力确保用户在我们的平台上获得一致和高质量的体验。
如果您只想发送图像而不剪切,则应将图像大小设置为640 x 640或应用程序崩溃
这是我的快捷代码
var instagramURL = NSURL(string: "instagram://app")!
if UIApplication.sharedApplication().canOpenURL(instagramURL) {
var documentDirectory = NSHomeDirectory().stringByAppendingPathComponent("Documents")
var saveImagePath = documentDirectory.stringByAppendingPathComponent("Image.igo")
var imageData = UIImagePNGRepresentation(self.bestScoreShareView.takeSnapshot(W: 640, H: 640))
imageData.writeToFile(saveImagePath, atomically: true)
var imageURL = NSURL.fileURLWithPath(saveImagePath)!
docController = UIDocumentInteractionController()
docController.delegate = self
docController.UTI = "com.instagram.exclusivegram"
docController.URL = imageURL
docController.presentOpenInMenuFromRect(CGRectZero, inView: self.view, animated: true)
} else {
println("instagram not found")
}
从uiview获取快照的扩展
extension UIView {
func takeSnapshot(#W: CGFloat, H: CGFloat) -> UIImage {
var cropRect = CGRectMake(0, 0, 600, 600)
UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.mainScreen().scale)
drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
image.imageWithNewSize(CGSizeMake(W, H))
return image
}
}
设置图像大小的扩展名
extension UIImage {
func imageWithNewSize(newSize:CGSize) ->UIImage {
UIGraphicsBeginImageContext(newSize)
self.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
let newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage
}
}
您可能还想看看the "Document Interaction" section of Instagram's API documentation for iPhone Hooks。这可以用来做你想要做的事情,这可能是Oggl做的事情。
我使用下面的代码在Instagram上分享照片。
NSURL *instagramURL = [NSURL URLWithString:@"instagram://app"];
if([[UIApplication sharedApplication] canOpenURL:instagramURL]) //check for App is install or not
{
NSData *imageData = UIImagePNGRepresentation(image); //convert image into .png format.
NSFileManager *fileManager = [NSFileManager defaultManager];//create instance of NSFileManager
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //create an array and store result of our search for the documents directory in it
NSString *documentsDirectory = [paths objectAtIndex:0]; //create NSString object, that holds our exact path to the documents directory
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"insta.igo"]]; //add our image to the path
[fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; //finally save the path (image)
NSLog(@"image saved");
CGRect rect = CGRectMake(0 ,0 , 0, 0);
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIGraphicsEndImageContext();
NSString *fileNameToSave = [NSString stringWithFormat:@"Documents/insta.igo"];
NSString *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:fileNameToSave];
NSLog(@"jpg path %@",jpgPath);
NSString *newJpgPath = [NSString stringWithFormat:@"file://%@",jpgPath];
NSLog(@"with File path %@",newJpgPath);
NSURL *igImageHookFile = [[NSURL alloc]initFileURLWithPath:newJpgPath];
NSLog(@"url Path %@",igImageHookFile);
self.documentController.UTI = @"com.instagram.exclusivegram";
// self.documentController = [self setupControllerWithURL:igImageHookFile usingDelegate:self];
self.documentController=[UIDocumentInteractionController interactionControllerWithURL:igImageHookFile];
NSString *caption = @"#Your Text"; //settext as Default Caption
self.documentController.annotation=[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%@",caption],@"InstagramCaption", nil];
[self.documentController presentOpenInMenuFromRect:rect inView: self.view animated:YES];
}
else
{
UIAlertView *errMsg = [[UIAlertView alloc] initWithTitle:@"Warning" message:@"No Instagram Available" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[errMsg show];
}