通过您自己的 iOS 应用程序将照片上传到 Instagram
Posted
技术标签:
【中文标题】通过您自己的 iOS 应用程序将照片上传到 Instagram【英文标题】:Uploading photos to Instagram via your own iOS app 【发布时间】:2013-08-14 21:26:30 【问题描述】: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 新闻提要中看到了这张照片。这种类型的共享非常类似于 Facebook 和 Twitter 共享。它具有相同的概念。 如何才能做到这一点?如何才能在他们的应用程序中复制这一精确过程?在我的应用程序中拍摄的照片是 612 像素 x 612 像素,因此它们与在 Instagram 上拍摄的照片的尺寸兼容。我已经实现了到 Facebook 和 Twitter 的共享,但我想像 Oggl 那样实现上传到 Instagram。这可能吗?
有许多 iOS 开发人员可以从对此问题的详细规范答案中受益。
谢谢
【问题讨论】:
我看不出你在哪里问过问题。 @Jason 我编辑了我的问题。感谢您注意到我的错误。 嗨@noahandthewhale 你实现了这个功能吗?我也想要这个。你能推荐我吗? @Kittu,我们最终做的是调用 Instagram 应用程序并在那里传递我们的媒体。这有点糟糕 :( 因为用户必须离开我们的应用程序才能发布到 Instagram,而且他们无法回到我们的应用程序。对于像上面这样的直接共享,您需要获得白名单访问权限。这意味着您要么需要与 Instagram 上的人成为好朋友,要么等到他们发布公共 api 以直接发布。同时,请遵循此处的文档:instagram.com/developer/mobile-sharing 这个QA有点老了。您当然不应该尝试直接发布到 Instagram 等内容。这是非常非苹果的。 (InstagramHipsta 这样做很愚蠢......将来他们会阻止它。)你只需使用一行代码启动一个UIActivityViewController
就可以了。
【参考方案1】:
Hipstamatic 是少数通过 Instagram 的 API 获得写入权限的应用之一。
Instagram 没有用于发布照片的公共 API,它可以让您获取他们的数据,但不能编写自己的数据。
Hipstamatic 和其他几款应用与 Instagram 达成了特殊协议,允许他们使用 write API 并直接发布照片。
对于所有其他开发者,您需要使用 iOS 挂钩通过切换到他们的应用程序来分享到 Instagram。
据我所知,让 Instagram 允许你写访问权限并不容易——你需要拥有一个具有高质量内容的***应用,并与合适的人友好:)
【讨论】:
使用UIDocumentInteractionController
启动带有您选择的照片和标题的 Instagram 应用程序。 (不过,用户可以在 Instagram 应用程序中编辑标题)。【参考方案2】:
您不能直接在 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;
【讨论】:
这段代码 sn-p 似乎不完整且自相矛盾。 self.dic 被分配了两次,在定义 dic 之前分配了 UTI 属性。图像本身是如何使用的?大概您正在从当前视图生成图像,但该代码也丢失了。【参考方案3】:您正在尝试做的是通过 Instagram API http://instagram.com/developer/ 实现的。您还可以使用 Instagram 应用程序执行一些类似的操作。这些记录在iPhone Hooks 下。如果您使用的是 Ruby Motion,那么您将能够使用official framework。不幸的是,没有官方支持的 Objective-C iOS API,但有一些开源替代方案可用,例如 NRGramKit。
实现与 Instagram API 交互的确切方法超出了 Stack Overflow 的答案,但如果您熟悉 iOS 编程,上面的链接应该可以为您提供一个很好的起点。
【讨论】:
感谢您的回复,我现在就去调查一下,让您知道我的进展情况。 这是一个相当高级的应用程序,所以我建议你一块一块地实现它。不要试图一次攻击整个事情。 :) 如果你觉得这解决了你的问题,我会很感激你接受这个答案。【参考方案4】:Instagram API 文档中的逐字记录:
https://instagram.com/developer/endpoints/media/
目前,无法通过 API 上传。我们有意识地选择不添加它,原因如下:
Instagram 是关于您在旅途中的生活 - 我们希望鼓励在应用内拍摄照片。 我们要打击垃圾邮件和低质量照片。一旦我们允许从其他来源上传,就很难控制进入 Instagram 生态系统的内容。尽管如此,我们正在努力确保用户在我们的平台上获得一致的高质量体验。
【讨论】:
正如 Rowan 所说,只有一小部分应用程序被授予了图片上传权限。【参考方案5】:如果您只想发送图像而不进行剪辑,则应将图像大小设置为 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
【讨论】:
在您设置的图像大小扩展newImage
中是可选的,但您返回的是 UIImage 的非可选实例。 let newImage = UIGraphicsGetImageFromCurrentImageContext()!
会工作【参考方案6】:
您可能还想查看the "Document Interaction" section of Instagram's API documentation for iPhone Hooks。这可以用来做你想做的事情,这可能是 Oggl 的方式。
【讨论】:
【参考方案7】:我使用以下代码在 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];
【讨论】:
【参考方案8】:您也可以简单地使用 UIActivityViewController,
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"instagram://app"]]) //check for App is install or not
NSArray * activityItems = [NSArray arrayWithObjects:newImage, nil];
UIActivityViewController * activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
activityController.excludedActivityTypes = [NSArray arrayWithObjects:UIActivityTypePostToWeibo, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, nil];
[self presentViewController:activityController animated:YES completion:nil];
//after sent
[activityController setCompletionWithItemsHandler:^(NSString *act, BOOL done, NSArray *returnedItems, NSError *activityError)
if (done)
UIAlertController *alert;
UIAlertAction* ok = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action)
[alert dismissViewControllerAnimated:YES completion:nil];
];
alert = [UIAlertController alertControllerWithTitle:@"Successfully Posted!" preferredStyle:UIAlertControllerStyleAlert];
[alert addAction: ok];
[self presentViewController:alert animated:YES completion:nil];
[self dismissViewControllerAnimated:YES completion:nil];
];
【讨论】:
以上是关于通过您自己的 iOS 应用程序将照片上传到 Instagram的主要内容,如果未能解决你的问题,请参考以下文章