This article might be too old.
前回 で SDK を使用して、実際にコーディングする準備ができました。今回は、実際にログイン機能の作成をしてみます。Facebook ログインを実装するには、Facebook が用意してくれたログインボタンを使用する方法と、API を呼びカスタム UI を使用する方法があるのですが、今回はその前者を使います。
一番の基本となる FBLoginView というクラスは、ユーザーがログインしているか等のステータスを管理し、それに合わせてボタンにログイン/ログアウトといった情報を自動で表示してくれます。
UI コントロールの追加
この記事では、主に Interface Builder を使用しての view の追加を見ていきます。もちろんプログラムによる方法もあります。詳しくは公式ドキュメントで。
まずは、 “View” オブジェクトをレイアウト上に設置します。これがログイン、ログアウトのボタンになります。Identity inspector にて、クラスプロパティを FBLoginView に変更します。
そして、AppDelegate クラスに以下のコードを追加。これにより、FBLoginViewクラスがviewが表示される前にロードされるようになります。
1 2 3 4 5 6 7 8 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. [FBLoginView class]; ... return YES; } |
Facebook からレスポンスの処理
このメソッドを AppDelegate クラスに追加。
1 2 3 4 5 6 7 8 9 10 11 12 | - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // Call FBAppCall's handleOpenURL:sourceApplication to handle Facebook app responses BOOL wasHandled = [FBAppCall handleOpenURL:url sourceApplication:sourceApplication]; // You can add your app-specific url handling code here if needed return wasHandled; } |
パーミッションの取得
次にユーザーから Facebook の機能を使用するために、パーミッションを取得する必要があります。ここで注意しておきたいのは、私達のアプリから Facebook へ投稿する許可は、このアプリにログインする際に取得しない方がよいということです。ユーザーはアプリから勝手に投稿されることに大変センシティブなので、まずここでは、ユーザの基本情報に関するパーミッションを得ておき、のちのちユーザーが何かこのアプリからFacebookに投稿したい時に、パーミッションを取った方が良いです。
先ほど view を設置したレイアウトに対応した viewController のヘッダーファイルに
1 | @property (weak, nonatomic) IBOutlet FBLoginView *loginView; |
と宣言し、Interface Builder と接続します。
そして、viewDidLoad メソッドにて、
1 | self.loginView.readPermissions = @[@"public_profile", @"email", @"user_friends”]; |
とすることで、public_profile, email, user_friends のパーミッションを取ります。
認証コールバックの実装
もう Facebook ログインの機能を使用することができます。FBLoginView はログイン状況を管理する以外にも、Facebook の情報を取得する役割もあります。FBLoginViewDelegate を実装することで、ログインした際、情報を取得した際など、特定にイベントに対する通知を受け取ることが出来ます。
そのために、先ほどの viewController で、delegate を実装することを宣言します。
1 | @interface LoginUIViewController : UIViewController <FBLoginViewDelegate |
そして、viewDidLoad においても、delegate プロパティを設定。
1 2 | self.loginView.readPermissions = @[@"public_profile", @"email", @"user_friends"]; self.loginView.delegate = self; |
ここから Facebook の情報を活用した本格的なコーディングです。
この delegate メソッドは、FBLoginView がユーザーのFacebookの情報を受信した時に呼ばれます。
1 2 3 4 5 | // This method will be called when the user information has been fetched - (void)loginViewFetchedUserInfo:(FBLoginView *)loginView user:(id<FBGraphUser>)user { NSLog(@"%@", user.name); } |
これは、ログインが成功した時に呼ばれます。
1 2 3 4 | // Logged-out user experience - (void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView { NSLog(@"You're not logged in!"); } |
これは、ログアウトした時。
1 2 3 4 5 | // Logged-out user experience - (void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView { NSLog(@"You're not logged in!"); } |
そして、最後に loginView:handleError: delegate メソッドを実装することにより、エラー処理をします。詳しいエラーの情報は https://developers.facebook.com/docs/graph-api/using-graph-api/v2.0#errors にあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | // Handle possible errors that can occur during login - (void)loginView:(FBLoginView *)loginView handleError:(NSError *)error { NSString *alertMessage, *alertTitle; // If the user should perform an action outside of you app to recover, // the SDK will provide a message for the user, you just need to surface it. // This conveniently handles cases like Facebook password change or unverified Facebook accounts. if ([FBErrorUtility shouldNotifyUserForError:error]) { alertTitle = @"Facebook error"; alertMessage = [FBErrorUtility userMessageForError:error]; // This code will handle session closures that happen outside of the app // You can take a look at our error handling guide to know more about it // https://developers.facebook.com/docs/ios/errors } else if ([FBErrorUtility errorCategoryForError:error] == FBErrorCategoryAuthenticationReopenSession) { alertTitle = @"Session Error"; alertMessage = @"Your current session is no longer valid. Please log in again."; // If the user has cancelled a login, we will do nothing. // You can also choose to show the user a message if cancelling login will result in // the user not being able to complete a task they had initiated in your app // (like accessing FB-stored information or posting to Facebook) } else if ([FBErrorUtility errorCategoryForError:error] == FBErrorCategoryUserCancelled) { NSLog(@"user cancelled login"); // For simplicity, this sample handles other errors with a generic message // You can checkout our error handling guide for more detailed information // https://developers.facebook.com/docs/ios/errors } else { alertTitle = @"Something went wrong"; alertMessage = @"Please try again later."; NSLog(@"Unexpected error:%@", error); } if (alertMessage) { [[[UIAlertView alloc] initWithTitle:alertTitle message:alertMessage delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; } } |