Mac OSでも楽チン Facebook編 その2 Social.framework

まずは下準備。FBにアプリケーション登録をする。登録画面には、iOSはあるもののOS X用のアプリケーションを登録する場所がない。とりあえず「ネイティブiOSアプリ」を選択しておいて問題ないようだ。次にBundle IDを作成するアプリケーションと同じにしておく。次に詳細設定でApp Typeを「Native/Desktop」にApp Secret in Clientを「いいえ」にする。これで終了。

今まで一度もFBのアプリは作ったことがないのでイマイチ手順が分からないが、とりあえず何かをリクエストしてみる。

	ACAccountStore *accountStore = [[ACAccountStore alloc]init];
	ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
	NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@"取得したAppID",ACFacebookAppIdKey,
					[NSArray arrayWithObjects:@"publish_stream",@"publish_actions",nil],ACFacebookPermissionsKey,nil];
	[accountStore requestAccessToAccountsWithType:accountType options:options completion:^(BOOL granted, NSError *error) {
		if(granted){
			NSArray *accounts = [accountStore accountsWithAccountType:accountType];
			ACAccount *anAccount = [accounts lastObject];
			NSLog(anAccount: %@,[anAccount description]);
		}else{
			NSLog(@"error: %@",[error description]);
		}
	}];

結果は、
The Facebook server could not fulfill this access request: The app must ask for a basic read permission at install time.”

インストールした直後はまず、基本情報のパーミッションをリクエストしないといけないようだ。(install timeってそういうことでいいのかな?)

調べてみると、FBアプリは何の情報の読み書きするかによって、パーミッションが細かく分かれているようだ。

API Reference Permissions

では、ACFacebookPermissionsKey の値を@”email”にして再度リクエスト。これでアクセスできた。

次になにか書き込んでみる
上記を踏まえて、一旦emailでリクエストした後、投稿可能なパーミッションで再度リクエストしてみる。

ACAccountStore *accountStore = [[ACAccountStore alloc]init];
ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSMutableDictionary *options =
	[NSMutableDictionary dictionaryWithObjectsAndKeys:@"取得したAppID",ACFacebookAppIdKey,
	[NSArray arrayWithObjects:@"email",nil],ACFacebookPermissionsKey,
	ACFacebookAudienceOnlyMe,ACFacebookAudienceKey,nil
];

[accountStore requestAccessToAccountsWithType:accountType options:options completion:^(BOOL granted, NSError *error) {
	if(granted){
		NSArray *postPermissions = [NSArray arrayWithObjects:@"publish_stream",@"publish_actions", nil];
		[options setObject:postPermissions forKey:ACFacebookPermissionsKey];
		[accountStore requestAccessToAccountsWithType:accountType options:options completion:^(BOOL granted, NSError *error) {
			if(granted){
				NSArray *accounts = [accountStore accountsWithAccountType:accountType];
				ACAccount *anAccount = [accounts lastObject];
				NSString *urlStr = [NSString stringWithFormat:@"https://graph.facebook.com/%@/feed",[[anAccount valueForKey:@"properties"] valueForKey:@"uid"]];
				NSURL *url = [NSURL URLWithString:urlStr];
				NSDictionary *params = [NSDictionary dictionaryWithObject:@"Hello FB." forKey:@"message"];
				SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodPOST URL:url parameters:params];
				[request setAccount:anAccount];
				[request performRequestWithHandler:^(NSData *response, NSHTTPURLResponse *urlResponse, NSError *error){
					NSLog(@"response:%@",[[NSString alloc]initWithData:response encoding:NSUTF8StringEncoding]);
				}];
			}else{
				NSLog(@"error post:%@",[error description]);
			}
		}];
	}else{
		NSLog(@"error:%@",[error description]);
	}
}];

うまくいったようだ。

FB上でアプリの使用を削除したり、Mac上でアプリからの書き込みを許可しなかったりすると、その後まったくアクセスを受け付けなくなることが何度かあった、帰ってくるエラーも様々。

どこかに再度許可をチェックするところがあるのではと探すと、「環境設定:セキュリティーとプライバシー:プライバシー」にあった。(たぶん。)
一旦、チェックを外して再度チェックすると、聞いてきた。これでFB側の登録アプリにも再度追加された。

このあたりもう少し突っ込まないといけない感じ。

Avatar photo

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です