Accounts.frameworkを使ってFacebookのアクセストークンとか、メールアドレスを取得する

More than 5 years have passed since last update.

Facebookログインができるアプリが増えてきましたね。

そんなときに、Facebookのアクセストークンをサーバーに投げてログイン処理を行ったり、メールアドレスのみ取得してログイン処理を行ったり、いろいろあると思います。

今回はその両方のデータの取得をメモします。

(Facebook SDKを使っても同じことはできますが、その場合はSafariが立ち上がったり、Facebookアプリが起動したり画面遷移するのでちょっと微妙です)


Accounts.frameworkを使う

TwitterでシェアやFacebookでシェアなどはSocial.frameworkを使えば簡単にできますが、今回の用途ではAccounts.frameworkを使います。

#import <Accounts/Accounts.h>


@property (nonatomic) ACAccountStore *accountStore;

FacebookのACAccountTypeを取得します。

if (self.accountStore == nil) {

self.accountStore = [ACAccountStore new];
}

ACAccountType *accountType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; // Facebookを指定

次にユーザーにFacebookアカウント情報にアクセスしても良いか、という許可をもらいます。

NSDictionary *options = @{ ACFacebookAppIdKey : YOUR_FACEBOOK_APP_ID,

ACFacebookAudienceKey : ACFacebookAudienceOnlyMe,
ACFacebookPermissionsKey : @[@"email"] };


  • ACFacebookAppIdKey … Facebookアプリ設定のApp IDを入れます(NSString)

  • ACFacebookAudienceKey … 公開範囲の設定です


    • ACFacebookAudienceEveryone … 全体

    • ACFacebookAudienceFrends … 友達のみ

    • ACFacebookAudienceOnlyMe … 非公開・自分のみ



  • ACFacebookPermissionsKey … パーミッション Permissions with Facebook Login

[self.accountStore 

requestAccessToAccountsWithType:accountType
options:options
completion:^(BOOL granted, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (granted) {
// ユーザーがFacebookアカウントへのアクセスを許可した
NSArray *facebookAccounts = [self.accountStore accountsWithAccountType:accountType];
if (facebookAccounts.count > 0) {
ACAccount *facebookAccount = [facebookAccounts lastObject];

// メールアドレスを取得する
NSString *email = [[facebookAccount valueForKey:@"properties"] objectForKey:@"ACUIDisplayUsername"];

// アクセストークンを取得する
ACAccountCredential *facebookCredential = [facebookAccount credential];
NSString *accessToken = [facebookCredential oauthToken];

NSLog(@"email:%@, token:%@", email, accessToken);

// ここでログイン処理などをする
}
} else {
if([error code]== ACErrorAccountNotFound){
// iOSに登録されているFacebookアカウントがありません。
NSLog(@"iOSにFacebookアカウントが登録されていません。設定→FacebookからFacebookアカウントを追加してください。");
} else {
// ユーザーが許可しない
// 設定→Facebook→アカウントの使用許可するApp→YOUR_APPをオンにする必要がある
NSLog(@"Facebookが有効になっていません。");
}
}
});
}];

iOSがビルドインしてくれたおかげで、結構簡単に書くことができます。


参考文献

Facebook APIへのアクセス、投稿画面表示(iOS 6対応)

ios - Get Facebook access token from Social.framework(iOS6) - Stack Overflow

ios - ACAccountStore Error 6 and 8 - Stack Overflow