Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード

2011-03-14

Facebook iOS SDK を使用して近況の投稿やプロフィール取得を実装する


先日書いた記事『カメラアプリにFacebookへの写真投稿機能をつける』では、SDKのダウンロードから、OAuth認証の実装方法、画像投稿APIのたたき方、まで書きました。


その後『EncountMe』でもFacebook対応することになり、プロフィールの取得や近況の投稿などを実装したので、そのやり方などを書いておきます。



準備

  • 先日の記事の通りに認証を済ませておきます。permissionsにはuser_about_me、publish_streamを設定します。
NSArray *permissions = [NSArray arrayWithObjects:@"user_about_me",
						@"publish_stream",nil];

[appDelegate.facebook authorize:permissions delegate:self];
  • ヘッダで<FBRequestDelegate>への準拠を宣言し、レスポンス受信時、成功時、失敗時のデリゲートメソッドを実装しておきます。
- (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];
	}
	NSLog(@"result:%@",result);
};

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {
	NSLog(@"error:%@", [error localizedDescription]);
};


プロフィールの基本データを取得する

[facebook requestWithGraphPath:@"me" andDelegate:self];

※facebookというのはFacebook iOS SDKのFacebookクラスのインスタンスです。(詳しくは先日の記事をご参照ください)


(実行結果)

result:{
    education =     (
                {
            school =             {
                id = {xxx};
                name = {xxx};
            };
            type = College;
        }
    );
    "first_name" = {xxx};
    gender = male;
    id = {xxx};
    "last_name" = {xxx};
    link = "http://www.facebook.com/profile.php?id=100000563263951";
    locale = "ja_JP";
    name = "\U5824\U4fee\U4e00";
    timezone = 9;
    "updated_time" = "2010-12-31T06:00:26+0000";
    verified = 1;
    work =     (
                {
            employer =             {
                id = 100460806674287;
                name = "\U30ab\U30e4\U30c3\U30af";
            };
            "start_date" = "2010-02";
        }
    );
}


fqlを用いてユーザーデータを取得する

Facebook SDK内のデモにあったもの。下記コードではfqlを使って、userテーブルからuidとnameを取得しています。

NSMutableDictionary * params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
		@"SELECT uid,name FROM user WHERE uid=4", @"query",nil];
[facebook requestWithMethodName:@"fql.query"
					   andParams:params
				   andHttpMethod:@"POST"
					 andDelegate:self];

(実行結果)

result:{
    name = "Mark Zuckerberg";
    uid = 4;
}

fqlのリファレンスはこちら

http://developers.facebook.com/docs/reference/fql/


userテーブルにどんなカラムがあるかはこちらから調べられます。

http://developers.facebook.com/docs/reference/fql/user/



投稿(ダイアログあり)

ヘッダでFBDialogDelegateへの準拠を宣言し、完了時のデリゲートメソッドを実装しておきます。


- (void)dialogDidComplete:(FBDialog *)dialog {
	NSLog(@"publish successfully");
}

下記のようにdialog:メソッドを実行すると、


NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
	@"Share on Facebook",  @"user_message_prompt",nil];

[facebook dialog:@"feed"
		andParams:params
	  andDelegate:self];	

こういうダイアログが出てきます。

f:id:shu223:20110313211532p:image:w240


paramsに"user_message_prompt"というキーで渡した内容がテキストフィールド上部に表示されています。



投稿(ダイアログなし)

ダイアログを出さず、アプリが決めたテキストを投稿する場合は下記のようになります。

NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
						   @"this is auto post", @"message",
						   nil];

[facebook requestWithMethodName:@"stream.publish"
							  andParams:params
						  andHttpMethod:@"POST"
							andDelegate:self];

こちらを実行すると、


こんな感じで投稿されます。


f:id:shu223:20110313211621p:image:w460




2011-02-23

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

1年前に作った「頭身カメラ」というアプリに、

Facebookへの投稿機能をつけてみました。


f:id:shu223:20110223074848j:image


(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が用意されてるので簡単ですね。

サンプルコードは週末にアップする予定です。




2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 |