その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

カメラアプリにFacebookへの写真投稿機能をつける

1年前に作った「頭身カメラ」というアプリに、
Facebookへの投稿機能をつけてみました。



(AppBankさんへの寄稿記事)
http://www.appbank.net/2010/07/15/iphone-application/140803.php


(AppStore)
http://itunes.apple.com/jp/app/id379198789?mt=8



1. facebook iOS SDKをダウンロード

https://github.com/facebook/facebook-ios-sdk

2. FBConnectヘッダを自分のプロジェクトに追加する

src/facebook-ios-sdk.xcodeproj を開き、
FBConnectフォルダを自分のプロジェクトにドラッグ&ドロップする。

3. FBConnectヘッダをインポート

Facebookの機能を使いたいクラスでヘッダインポート。

#import "FBConnect.h"

この時点でビルド可能。

4. Facebookでアプリケーションを登録する

http://www.facebook.com/developers/createapp.php
appID(アプリID)を控えておきます


(ここまでの手順はSDKのREADMEに書かれています。)

5. カスタムURLスキームを設定する

Facebookアプリでは認証をsafariで行い、カスタムURLスキームでアプリに戻ってきます。
そのための設定。

  1. Info.plistに項目を追加。
  2. keyの"Information Property List"の下に"URL types"を追加
  3. 続いて"URL types" > "Item0" > "URL Schemes" > "Item0"、なければこのように追加していく
  4. 最後の"Item0"の valueに "fb[appId]"を追加、appIdはいつも通り

(参考ページ)http://d.hatena.ne.jp/tkwn/20101215/1292402660

6. Facebookクラス初期化

3でFBConnect.hをインポートしたクラスで、
xxxx.h

Facebook *facebook;

xxxx.m

facebook = [[Facebook alloc] initWithAppId:appId];

7. カスタムURLスキームで戻ってくる際に呼ばれるデリゲートメソッドを実装

AppDelegateに。viewControllerは6でFacebookクラスオブジェクトを持たせたクラスのインスタンス。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
	return [[viewController facebook] handleOpenURL:url];
}

8. 認証処理の実装

6でFacebookクラスオブジェクトを持たせたクラスで、

NSArray *permissions = [NSArray arrayWithObjects:@"publish_stream", @"offline_access",nil];
[facebook authorize:permissions delegate:self];


ログイン処理完了後に呼ばれるデリゲートメソッドを実装。
(ヘッダでFBSessionDelegateプロトコルへの準拠を宣言しておく)

- (void)fbDidLogin {
	NSLog(@"login");
}

-(void)fbDidNotLogin:(BOOL)cancelled {
	NSLog(@"did not login");
}

9. 写真投稿処理の実装

カメラアプリなので UIImageView 型の resultImageView というインスタンス変数を持っているとして、

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
							   resultImageView.image, @"picture",
							   nil];
[facebook requestWithMethodName:@"photos.upload"
					   andParams:params
				   andHttpMethod:@"POST"
					 andDelegate:self];


投稿処理完了後に呼ばれるデリゲートメソッドを実装。

- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response {
	NSLog(@"received response");
};

- (void)request:(FBRequest *)request didLoad:(id)result {
	if ([result isKindOfClass:[NSArray class]]) {
		result = [result objectAtIndex:0];
	}
	if ([result objectForKey:@"owner"]) {
		NSLog(@"Photo upload Success");
	} else {
		NSLog(@"result name:%@",[result objectForKey:@"name"]);
	}
};

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {
	NSLog(@"didFailWithError:");
};


以上!SDKが用意されてるので簡単ですね。
サンプルコードは週末にアップする予定です。