通过您自己的iOS应用程序将照片上传到Instagram

问题描述 投票:28回答:7

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开发人员可以从这个问题的详细规范答案中受益。

谢谢

ios instagram
7个回答
25
投票

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

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

Hipstamatic和其他几个应用程序已与Instagram达成特殊协议,允许他们使用写API并直接发布照片。

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

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


9
投票

你不能直接在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;
}

4
投票

你想要做的是通过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上传。我们有意识地选择不添加此内容,原因如下:

  1. Instagram是关于你在旅途中的生活 - 我们希望鼓励应用程序内的照片。
  2. 我们想要打击垃圾邮件和低质量的照片。一旦我们允许从其他来源上传,就很难控制Instagram生态系统中的内容。所有这些,我们正在努力确保用户在我们的平台上获得一致和高质量的体验。

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获取快照的扩展

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
    }
}

1
投票

您可能还想看看the "Document Interaction" section of Instagram's API documentation for iPhone Hooks。这可以用来做你想要做的事情,这可能是Oggl做的事情。


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];
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.