アクセス許可の管理(iOS)

基本ログイン時に、アプリは利用者の公開プロフィールにアクセスできます。その他のプロフィール情報にアクセスしたり、利用者に代わって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エクスプローラを使用してアクセス許可を取り消す

テストのため、アプリを使用せずに取り消しアクセス許可を未承認にすることもできます。そのためには、グラフAPIエクスプローラを使用します。

  1. グラフAPIエクスプローラにアクセスします。
  2. アプリを選択します。
  3. [Get Token] > [Get Access Token]をクリックします。
  4. [Clear]をクリックして、選択したアプリのアクセス許可を取り消します。

1つのアクセス許可を取り消すには:

  1. パス入力フィールドを/me/permissions/{permission-name}に設定します。{permission-name}には、取り消したいアクセス許可(emailなど)を指定します。
  2. GETからDELETEに切り替えます。
  3. [Submit]ボタンをクリックします。
グラフAPIエクスプローラ