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