読者です 読者をやめる 読者になる 読者になる

Keep It Real BLOG

ソフトウェアエンジニア。1児の父。 酒、ラーメン、サッカー好き。旅行も好きですが、普段は出不精で大抵たまプラーザ界隈に居ます。

iOSのFacebookログインで気をつけること

iOS-Objective-C iOS

f:id:naohide_a:20151202195340j:plain iOSのFacebook SDKを使ってログインさせようと思ったのですが、なかなか手こずったので、メモ。 意外と色々なドキュメントが乱立しているので、注意が必要かと。

AppDelegate.h

#import <FacebookSDK/FacebookSDK.h>

AppDelegate.m

- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url
{
    return [FBSession.activeSession handleOpenURL:url];
}

Login.h

#import "AppDelegate.h"

Login.m

- (IBAction)facebookLoginButtonClickHandler:(id)sender
        NSArray *permissions = [[NSArray alloc] initWithObjects:
                                @"email", @"read_stream", @"user_about_me", @"user_birthday",
                                nil];

        // should close fbsession every time cause solving to repeat login and logout
        [FBSession.activeSession close];

        // make fbsession
        [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:true completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {

            if (status == FBSessionStateClosedLoginFailed || status == FBSessionStateCreatedOpening) {
                //
            } else if (!session.isOpen) {
                //
            } else {
                [[FBRequest requestForMe] startWithCompletionHandler:
                 ^(FBRequestConnection *connection, NSDictionary *user, NSError *error) {
                     if (!error) {
                         NSLog("%@", session.accessTokenData.accessToken);
                     } else {
                         [[FBSession activeSession] closeAndClearTokenInformation];
                         [FBSession setActiveSession:nil];
                     }
                }];
            }
        }];

気をつけたいのは、AppDelegate.mとLogin.m。 AppDelegate.mの関数は入れないと上手く動かなかったです。 Login.mでは、Facebookのセッションを発行する前に、[FBSession.activeSession close];を入れないとログインとログアウトを繰り返した際に、以下のようなエラーが起きちゃいます。

[FBSession release]: message sent to deallocated instance 0x115a65140