カメラアプリに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をダウンロード
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スキームでアプリに戻ってきます。
そのための設定。
- Info.plistに項目を追加。
- keyの"Information Property List"の下に"URL types"を追加
- 続いて"URL types" > "Item0" > "URL Schemes" > "Item0"、なければこのように追加していく
- 最後の"Item0"の valueに "fb[appId]"を追加、appIdはいつも通り
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が用意されてるので簡単ですね。
サンプルコードは週末にアップする予定です。