Instagramへの画像投稿


アプリからInstagramへ画像を投稿します。サービスへ直接投稿するためのAPIは用意されていないようなので、Instagramアプリに画像を渡します。アプリ間の画像の受け渡しに、UIDocumentInteractionController を使います。

```objc
// 1.
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/image.igo"];
NSURL *fileURL = [NSURL fileURLWithPath:filePath];

// 2.
self.interactionController = [UIDocumentInteractionController interactionControllerWithURL:fileURL];
self.interactionController.UTI = @"com.instagram.exclusivegram";

// 3.
BOOL result = [self.interactionController presentOpenInMenuFromRect:self.view.frame
														 inView:self.view
													   animated:YES];
if (!result) {
	// ファイルを開けるアプリがない
}

```
## 解説

- 1.Instagram用の投稿画像を作る

拡張子".igo"の画像をファイルのNSURLが必要なので、Documentディレクトリに保存しておきます。Instagramアプリは正方形以外の画像も受け取りますが、正方形に収まるように強制リサイズされます。画像の保存は簡単に、

```objc
NSData *imageData = UIImageJPEGRepresentation(image, 0.9);
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/image.igo"];
[imageData writeToFile:filePath atomically:YES];
```
こんな感じで。

- 2.UIDocumentInteractionController を準備する

開きたい画像ファイルのNSURLを使って、UIDocumentInteractionControllerを作ります。

`self.interactionController.UTI = @"com.instagram.exclusivegram";`

はInstagramのみを対象としたい場合の設定です。


- 3.開きます

Instagramのアイコンが表示されるので、タップすると、画像がInstagramに渡されます。

以上で投稿終わりです。

## サンプル実装

例えば、以下のようなクラスを作っておくと便利だと思います。

PostInstagram.h

```objc
#import <Foundation/Foundation.h>

@interface PostInstagram : UIViewController <UIDocumentInteractionControllerDelegate>
{
	UIDocumentInteractionController *interactionCotroller;
}

+ (BOOL)canInstagramOpen;
- (void)setImage:(UIImage *)image;

@property (nonatomic,retain) UIDocumentInteractionController *interactionController;

@end

```
PostInstagram.m

```objc
#import "PostInstagram.h"

@interface PostInstagram()
- (void)closeView;
@end

@implementation PostInstagram

+ (BOOL)canInstagramOpen{
	NSURL *instagramURL = [NSURL URLWithString:@"instagram://app"];
	if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) {
		return YES;
	}
	return NO;
}

- (void)openInstagram {
		
	NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/image.igo"];
	NSURL *fileURL = [NSURL fileURLWithPath:filePath];
	
	self.interactionController = [UIDocumentInteractionController interactionControllerWithURL:fileURL];
	self.interactionController.UTI = @"com.instagram.exclusivegram";
	self.interactionController.delegate = self;
	
	BOOL present = [self.interactionController presentOpenInMenuFromRect:self.view.frame
															 inView:self.view
														   animated:YES];
	if (!present) {
		[self closeView];
	}
}

- (void)setImage:(UIImage *)image
{
	NSData *imageData = UIImageJPEGRepresentation(image, 0.75f);
	NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/image.igo"];
	[imageData writeToFile:filePath atomically:YES];
}

- (void)viewDidAppear:(BOOL)animated
{
	[self openInstagram];
}
- (void)closeView
{
	[self.view removeFromSuperview];
	[self removeFromParentViewController];
	self.interactionController.delegate = nil;
}

#pragma mark - UIDocumentInteractionControllerDelegate

- (void)documentInteractionController:(UIDocumentInteractionController *)controller
		willBeginSendingToApplication:(NSString *)application
{

}

- (void)documentInteractionController:(UIDocumentInteractionController *)controller
		   didEndSendingToApplication:(NSString *)application
{
	[self closeView];
}

- (void) documentInteractionControllerDidDismissOpenInMenu: (UIDocumentInteractionController *) controller
{
	// キャンセルで閉じたとき
	[self closeView];
}
@end
```

## 上記サンプルの使い方

```objc
#import "PostInstagram.h"

// ViewContollerからの呼び出しを想定
if ([PostInstagram canInstagramOpen]) {
	
	UIImage *image; // <- 投稿したい画像を準備しておく

	PostInstagram *instagramViewController = [[PostInstagram alloc] init];
	[instagramViewController setImage:image];
	[self.view addSubview:instagramViewController.view];
	[self addChildViewController:instagramViewController];

} else {
	// Instagramがインストールされていない
}

```

## 参考
- iPhone Hooks（公式ドキュメント） http://instagram.com/developer/iphone-hooks/