LoginSignup
95

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-03-17

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
95