ごらくらいふ

プログラミングしたりゲームしたり

FacebookSDK 3.x -> 4.x : FBLoginView無くなったのでFBSDKLoginButtonを使った

Facebook APIバージョン v2.0 が非推奨間近*1のため尻に火が点いている。 消火活動で代替処理がわかったっぽいので記録。

(追記:2016/07/21 22:13) 3.x のログイン(ログアウト)時の処理の認識が間違っていたので修正。 仮にログイン時にNavigationControllerにPushするような実装をしていたら「画面を戻ろうとしているのに戻れない」現象が発生するはず。

改修内容

3.xでの擬似コード

// TheViewController.h

#import <FacebookSDK/FacebookSDK.h>
@interface TheViewController : UIViewController<FBLoginViewDelegate>
@end
// TheViewController.m

@interface TheViewController()
@property (nonatomic) FBLoginView* loginView;

@end

@implementation TheViewController
- (void)viewDidLoad{
    self.loginView = [[FBLoginView alloc] init];
}
- (void)viewDidAppear:(BOOL)animated{
    // viewの位置を真ん中にちょちょいとする
    CGRect bounds = [UIScreen mainScreen].bounds;
    CGRect rect = self.loginView.frame;
    rect.origin.x = (bounds.size.width - rect.size.width) / 2.0;
    rect.origin.y = (bounds.size.height - rect.size.height) / 2.0;
    self.loginView.frame = rect;

    // delegateの指定
    self.loginView.delegate = self;

    // 読み込み権限の指定
    self.loginView.readPermissions = @[@"public_profile", @"read_stream"];

    // 表示
    [self.view addSubView:self.loginView];
}

// FBLoginViewDelegate
-(void)loginViewFetchedUserInfo:(FBLoginView *)loginView user:(id<FBGraphUser>)user{
    // (とくになにもしていなかった……)
}
-(void)loginViewShowingLoggedInUser:(FBLoginView *)loginView{
    // ログインしている状態でLoginViewを表示したときの処理
}
-(void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView{
    // ログアウトしている状態でLoginViewを表示したときの処理
}
@end

4.xでの擬似コード

// TheViewController.h

#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
@interface TheViewController : UIViewController<FBSDKLoginButtonDelegate>
@end
// TheViewController.m

@interface TheViewController()
@property (nonatomic) FBLoginView* loginView;
@property (nonatomic) BOOL isLoggedIN;

@end

@implementation TheViewController
- (void)viewDidLoad{
    self.loginView = [[FBLoginView alloc] init];
}
- (void)viewDidAppear:(BOOL)animated{
    // viewの位置を真ん中にちょちょいとする
    self.fbLoginButton.center = self.view.center;

    // delegateの指定
    self.fbLoginButton.delegate = self;

    // 読み込み権限の指定
    self.fbLoginButton.readPermissions = @[@"public_profile", @"read_stream"];

    // 表示
    [self.view addSubView:self.fbLoginButton];

    // ログイン状態による処理分けはここに移植する
    if([FBSDKAccessToken currentAccessToken]) {
    } else {
    }
}

// FBSDKLoginButtonDelegate

-(BOOL)loginButtonWillLogin:(FBSDKLoginButton *)loginButton{
    // ログイン前処理
    // NOを返すと処理を中止するらしい。APIリファレンスに書いておいてほしい。
    return YES;
}
-(void)loginButton:(FBSDKLoginButton *)loginButton didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error {
    // ログイン処理を完了した時
    if (error) {
        return;
    }    
    if (result.isCancelled) {
        return;
    }
    if ([result.declinedPermissions containsObject:@"required permission"]) {
        return;
    }
    
    // ログイン完了
    // ログイン時の処理
}
-(void)loginButtonDidLogOut:(FBSDKLoginButton *)loginButton{
    // ログアウト完了
    // ログアウト時の処理
}
@end

*1:v2.1が公開されてから2年になるため