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年になるため