29

Instagram 最近对其 API 政策进行了更改,允许开发人员通过他们自己的应用程序将图片发布到 Instagram 平台。我们以前使用过的其他几种技术来执行此操作。其中之一是调用 Instagram 应用程序,该应用程序本质上将打开 Instagram 并从那里进行共享。可以在此处查看有关如何完成此操作的教程:如何将图像从您自己的 iOS 应用程序共享到 Instagram

然而,有几个应用程序允许直接共享到 Instagram 平台,而无需调用 Instagram 应用程序。Hipstamatic 的 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 开发人员可以从对这个问题的详细规范答案中受益。

谢谢你

4

8 回答 8

27

Hipstamatic 是少数通过 Instagram 的 API 获得写入权限的应用程序之一。

Instagram 没有用于发布照片的公共 API,它可以让您获取他们的数据,但不能编写自己的数据。

Hipstamatic 和其他几个应用程序已经与 Instagram 协商了特殊交易,允许他们使用 write API 并直接发布照片。

对于所有其他开发人员,您需要使用 iOS 挂钩通过切换到他们的应用程序来分享到 Instagram。

据我所知,让 Instagram 允许您写入访问权限并不容易——您需要拥有一个具有高质量内容的顶级应用程序并与合适的人友好:)

于 2013-11-25T23:15:30.800 回答
8

您不能直接在 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;
}
于 2015-04-21T14:08:51.977 回答
4

Instagram API 文档中的逐字记录:

https://instagram.com/developer/endpoints/media/

目前,无法通过 API 上传。我们有意识地选择不添加它,原因如下:

  1. Instagram 是关于你在旅途中的生活——我们希望鼓励从应用程序中拍摄照片。
  2. 我们要打击垃圾邮件和低质量的照片。一旦我们允许从其他来源上传,就很难控制进入 Instagram 生态系统的内容。尽管如此,我们正在努力确保用户在我们的平台上获得一致且高质量的体验。
于 2015-04-21T21:15:06.930 回答
4

您正在尝试做的是通过 Instagram API http://instagram.com/developer/实现的。您还可以使用 Instagram 应用程序执行一些类似的操作。这些都记录在iPhone Hooks下。如果您使用的是 Ruby Motion,那么您将能够使用官方框架。不幸的是,没有官方支持的 Objective-C iOS API,但有一些开源替代品可用,例如NRGramKit

实现与 Instagram API 交互的确切方法超出了 Stack Overflow 的答案,但如果您熟悉 iOS 编程,上面的链接应该会给您一个很好的起点。

于 2013-08-15T17:55:01.583 回答
4

如果您只想发送图像而不进行剪辑,则应将图像大小设置为 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 获取 shapshot 的扩展

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
    }
}
于 2015-05-04T10:57:12.077 回答
1

您可能还想查看Instagram 的 iPhone Hooks API 文档的“文档交互”部分。这可以用来做你想做的事情,这可能是 Oggl 的方式。

于 2013-12-27T00:53:45.047 回答
0

您也可以简单地使用 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];
            }
        }];
}
于 2020-12-01T06:18:19.410 回答
0

我使用下面的代码在 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];
    }
    

于 2015-10-23T13:13:44.480 回答