基本ログイン時に、アプリは利用者の公開プロフィールにアクセスできます。その他のプロフィール情報にアクセスしたり、利用者に代わってFacebookでコンテンツを公開したりするには、さらにアクセス許可をリクエストする必要があります。Facebookログインでのアクセス許可をご覧ください。
アプリでは次のようにアクセス許可を管理する必要があります。
グラフAPIリクエスト - グラフAPIリクエストを送信する前に、必要なアクセス許可があるか確認し、必要な場合はリクエストする必要があります。
不足しているアクセス許可と取り消されたアクセス許可 - 不足しているアクセス許可と取り消されたアクセス許可に関してFacebookから発行されるエラーに対応する必要があります。たとえば、アクセス許可をリクエストして再試行します。エラー処理(iOS SDK)をご覧ください。
リクエストのタイミング - すべてのアクセス許可を要求せず、必要な場合にのみリクエストして機能を提供すると、コンバージョンが向上します。
FBSDKLoginButton
でのログインでアクセス許可をリクエストするには、permissions
プロパティを設定します。
let loginButton = FBLoginButton() loginButton.permissions = ["public_profile", "email"]
カスタムログインボタンをFBSDKLoginButton
の代わりに使用している場合は、LoginManager
を使用してログインを行うことができます。
override func viewDidLoad() { super.viewDidLoad() ... loginButton.addTarget(self, action: #selector(loginButtonClicked), for: .touchUpInside) } @objc func loginButtonClicked() { let loginManager = LoginManager() loginManager.logIn(permissions: ["email"], from: self) { result, error in // Process result or error } }
loginManager
を呼び出す前に、既存のトークンが使用可能かどうかを確認する必要があります。iOS用Facebookログインをご覧ください。
現在のアクセス許可を確認するには、FBSDKAccessToken
を調べます。
if ([[FBSDKAccessToken currentAccessToken] hasGranted:@"email"]) { // TODO: publish content. } else { FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init]; [loginManager logInWithPublishPermissions:@[@"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { //TODO: process error or result. }]; }
利用者がアクセス許可のリクエストを却下したかどうかを確認するには、FBSDKLoginManager
コールバックまたはFBSDKLoginButton
デリゲートに対して返されたFBSDKLoginResult
を調べます。
FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init]; [loginManager logInWithPublishPermissions:@[@"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { if ([result.declinedPermissions containsObject:@”email”]) { // TODO: do not request permissions again immediately. Consider providing a NUX // describing why the app want this permission. } else { // ... } }];
グラフAPIリクエストを行うときに、NSError
オブジェクトをチェックして、アクセス許可エラーがあるかどうかを確認できます。
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me/feed" parameters:@{ @"message" : @"This is a status update" } HTTPMethod:@"POST"] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { if ([error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] isEqual:@200]) { NSLog(@"permission error"); } }];
詳しくは、エラー処理(iOS SDK)をご覧ください。
FBSDKLoginManager
を使用して、追加のアクセス許可をリクエストするか、logInWith*:
メソッドを使って以前却下されたアクセス許可をリクエストします。FBSDKLoginManager
は、[FBSDKAccessToken currentAcccessToken]
が使用可能かどうかによって、再リクエストかどうかを確認します。
以前アプリに付与された特定のアクセス許可を利用者が削除(取り消し)できるようにすることができます。たとえば、利用者が特定の機能を無効にできる設定ページをアプリに含めることができます。
アクセス許可を取り消すには、グラフAPIエンドポイントを呼び出します。
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me/permissions/email" parameters:nil HTTPMethod:@"DELETE"] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { // ... }];
すべてのアクセス許可を削除するグラフAPI呼び出しを実行することにより、アプリのすべてのアクセス許可を取り消すことができます。アクセス許可の取り消しのコードを使用して、リクエストのパスを/me/permissions
に変更します。
テストのため、アプリを使用せずに取り消しアクセス許可を未承認にすることもできます。そのためには、グラフAPIエクスプローラを使用します。
Get Token
] > [Get Access Token
]をクリックします。Clear
]をクリックして、選択したアプリのアクセス許可を取り消します。1つのアクセス許可を取り消すには:
/me/permissions/{permission-name}
に設定します。{permission-name}
には、取り消したいアクセス許可(email
など)を指定します。GET
からDELETE
に切り替えます。Submit
]ボタンをクリックします。