29

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

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

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

ここに画像の説明を入力

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

ここに画像の説明を入力 ここに画像の説明を入力

Oggl を承認すると、Instagram にアップロードできるようになり、数秒以内に Instagram のニュース フィードに写真が表示されました。このタイプの共有は、Facebook や Twitter の共有に非常に似ています。同じコンセプトです。どうすればこれを行うことができますか?アプリでこの正確なプロセスをどのように再現できますか? 私のアプリケーションで撮影した写真は612px x 612 pxであるため、Instagram で撮影した写真のサイズと互換性があります。Facebook や Twitter への共有は既に実装していますが、Oggl のように Instagram へのアップロードも実装したいと考えています。これは可能ですか?

この質問に対する十分に詳細な標準的な回答から恩恵を受けることができる多くの iOS 開発者がそこにいます。

ありがとうございました

4

8 に答える 8

27

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

Instagram には、写真を投稿するための公開 API がありません。データを取得することはできますが、自分で書き込むことはできません。

Hipstamatic と他のいくつかのアプリは、書き込み API を使用して写真を直接投稿できるようにする特別な取引を Instagram と交渉しました。

他のすべての開発者については、アプリに切り替えて、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

クリッピングせずに画像を送信したい場合は、画像サイズを 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
    }
}
于 2015-05-04T10:57:12.077 に答える
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 との対話を実装する正確な方法は、スタック オーバーフローの回答を超えていますが、iOS プログラミングに精通している場合は、上記のリンクを参考にしてください。

于 2013-08-15T17:55:01.583 に答える
1

また、Instagram の iPhone Hooks に関する API ドキュメントの「Document Interaction」セクションも参照してください。これは、あなたがやろうとしていることを行うために活用することができ、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 に答える