web-dev-qa-db-ja.com

独自のiOSアプリを介してInstagramに写真をアップロードする

Instagramは最近、APIポリシーを変更し、開発者が自分のアプリを介してInstagramプラットフォームに写真を投稿できるようにしました。これを行うために以前に採用された他のいくつかの手法。それらの1つは、Instagramアプリケーションを呼び出して、Instagramを本質的に開き、そこから共有することでした。これを行う方法に関するチュートリアルは、ここで見ることができます: 独自のiOSアプリからInstagramに画像を共有する方法

ただし、Instagramアプリケーションを起動せずにInstagramプラットフォームに直接共有できるアプリケーションがいくつかあります。 HipstamaticのOggl は、Instagramを呼び出さずにInstagramと直接共有できるようにします。以下に、プロセスのスクリーンショットをいくつか掲載しました。

写真を撮ると、Ogglは写真を共有できる他のソーシャルネットワークをいくつか提供してくれました。 FacebookとInstagramを選択しました。

enter image description here

Instagramを選択した後、Safariが開き、次の2つのページに移動してOgglがInstagramに投稿することを許可しました。 Instagramの認証情報を入力すると、認証ページに移動しました。

enter image description hereenter image description here

Ogglを承認すると、Instagramにアップロードでき、数秒でInstagramニュースフィードで写真を見ました。このタイプの共有は、FacebookやTwitterの共有に非常に似ています。同じ概念を持っています。 これを行うにはどうすればよいですか?アプリでこの正確なプロセスを複製するにはどうすればよいですか?私のアプリケーションで撮影された写真は612px x 612pxなので、Instagramで撮影された写真の寸法と互換性があります。 FacebookとTwitterへの共有は既に実装していますが、Ogglと同じようにInstagramへのアップロードを実装したいと思います。これは可能ですか?

多くのiOS開発者が、この質問に対する非常に詳細な標準的な回答の恩恵を受けることができます。

ありがとうございました

29
noahandthewhale

Hipstamaticは、InstagramのAPIを介して書き込みアクセスが許可されている数少ないアプリの1つです。

Instagramには写真を投稿するためのパブリックAPIがありません。Instagramはデータを取得できますが、自分で作成することはできません。

Hipstamaticおよび他のいくつかのアプリは、Instagramとの特別な取り決めを交渉しており、これにより、書き込みAPIを使用して写真を直接投稿できます。

他のすべての開発者については、iOSフックを使用して、アプリに切り替えてInstagramと共有する必要があります。

私が知る限り、Instagramで書き込みアクセスを許可するのは簡単ではありません。高品質のコンテンツを備えた最高のアプリが必要で、適切な人と親しくなる必要があります:)

26
Rowan

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;
}
9
Faran Ghani

クリッピングせずに画像を送信する場合は、640 x 640の画像サイズを設定する必要があります。そうしないと、アプリケーションがクラッシュします

このmy Swift code

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

iviewからシェイプショットを取るための拡張子

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
    }
}
4
Beslan Tularov

instagram APIドキュメントから逐語的に:

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

現時点では、APIを介したアップロードはできません。次の理由により、これを追加しないように意識的に選択しました。

  1. Instagramは外出先でのあなたの人生に関するものです。アプリ内からの写真を奨励したいと考えています。
  2. スパムや低品質の写真と戦いたいです。他のソースからのアップロードを許可すると、Instagramのエコシステムに入るものを制御するのが難しくなります。これらすべてが言われているように、私たちはユーザーが私たちのプラットフォーム上で一貫した高品質の体験を持つことを確実にする方法に取り組んでいます。
4
NiloVelez

あなたがやろうとしているのは、Instagram API http://instagram.com/developer/ によって実装されています。 Instagramアプリを使用して、同様のアクションを実行することもできます。これらは iPhoneフック で文書化されています。 Ruby Motionを使用している場合、 公式フレームワーク を使用できます。残念ながら、公式にサポートされているObjective-C iOS APIはありませんが、いくつかのオープンソース NRGramKit のような代替手段が利用可能です。

Instagram APIとの相互作用を実装する正確な方法は、Stack Overflowの答えを超えていますが、iOSプログラミングに精通している場合、上記のリンクは良い出発点になるはずです。

4
allprog

iPhoneフックに関するInstagramのAPIドキュメントの「ドキュメントインタラクション」セクション も確認してください。これは、あなたがやろうとしていることを行うために活用される可能性があり、Ogglがそれを行う方法かもしれません。

1
omdel

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];
    }
    
0
Nirzar Gandhi