2012-01-13 23 views
8

私はFacebookのObjective-C SDKの最終版を使って、私のアプリで完璧に動作するFacebookのSSOを持っています。 ユーザーが「何か」を行う場合は、アプリ内で余分な許可を求める必要があります。iOS Facebook SDK - 許可を確認する

if([facebook checkPermission:@"email"]) { 
:私はので、私はこのようにそれを使用することができます

のFacebook SDKに方法があるはず、私は推測する、
-(BOOL) checkPermission:(NSString*) permission; 

をユーザーが前に私にそれを与えた場合に許可を求める必要があり、そうしないでください

これを行う方法はありますか?

答えて

22

この質問は少し古くなっていますが、グラフ要求を行わずにアクティブなセッションのアクセス許可を確認できるようになりました。ここでは、HelloFacebookSampleで行うの方法です:

if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound) { 
    // permission does not exist 
} else { 
    // permission exists 
} 

ただ、「電子メール」と「publish_actions」を交換してください。

+0

'[FBSession activeSession]。permissions'は要求したアクセス権を返します。少なくとも、それは私が見たものです。下の私の答えを見てください。あなたは '[FBRequestConnection startWithGraphPath:@"/me/permissions "completionHandler:...]'が必要です。 –

+1

私は今テストすることができませんが、ドキュメンテーションに別途記載されています: "認証フロー中にアクセストークンに付与されたアクセス権。" https://developers.facebook.com/docs/reference/ios/current/class/FBSession/ –

+0

今日、私は自分のFacebook SDKポッドを3.9.0から3.15.1に更新しました。そして今度は[FBSession activeSession] .permissions'が返します。適切な権限と '[FBRequestConnection startWithGraphPath:@"/me/permissions "completionHandler:...]'はもうそれらを返しません(今度は{status:granted、permission:installed}を返します)。 –

7

SDKは、特定の権限をチェックするための直接的な方法を提供していないが、ユーザがGraph API

GET https://graph.facebook.com/me/permissions 

同じことがpermissions table

FQLクエリを達成することができるで user objectpermissions接続を確認することで、アプリケーションに権限を付与されたかどうかをチェックすることができます
SELECT email FROM permissions WHERE uid = me() 
+1

は、あなたの答えに基づいて、ありがとう、私が使用してみましたメソッド[facebook requestWithGraphPath:@ "me/permissions" andDelegate:self]; '。デリゲートメソッドを実装すると、完全に機能します。もう一度ありがとうございます –

+1

電子メールのアクセス許可が有効かどうかを判断する方法のコードを追加できますか?許可が与えられた場合、「メール」は何ですか? – Smikey

0

重要:これは、古いバージョンのFacebook SDK(例:3.9.0)に当てはまります。 3.15.0では、この方法ではもう動作しません。 RaphaëlAgneauが答えた通りに[session.permissions]を使用してください。

[FBSession activeSession].permissionsは、実際の要求ではなく要求したアクセス許可を返すように思われるため、次の方法を使用する必要があります。

[FBRequestConnection startWithGraphPath:@"/me/permissions" 
         completionHandler:^(FBRequestConnection *c, id result, NSError *error) { 
    if (!error) { 
    NSDictionary *permissions= [(NSArray *)[result data] objectAtIndex:0]; 
    if (![permissions objectForKey:@"publish_actions"]) { 
     // Ok, continue with your logic 
    } else { 
     // Permission not found, maybe request it (see below) 
    } 
    } else { 
    // Treat error 
    } 
}]; 

は、詳細はこちらをご覧ください:

[session requestNewPublishPermissions:PERMISSIONS_YOU_WANT 
         defaultAudience:FBSessionDefaultAudienceFriends 
        completionHandler:^(FBSession* session, NSError* error) { 

    // Try again the /me/permissions above 
}]; 
0

ここに私のコードはFBSDK 4.2のためだ:許可が見つからない

https://developers.facebook.com/docs/facebook-login/ios/v2.0#permissions-checking

場合はこのようにそれを要求することもできます.0アクセス許可をチェックします。渡される文字列は、許可の名前です(例: "publish_actions" SDKについては

- (void) checkForPermission:(NSString *)permission granted:(void (^)(void))sBlock denied:(void (^)(void))fBlock { 

    if ([FBSDKAccessToken currentAccessToken]) { 

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me/permissions" parameters:nil] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 

     BOOL hasPermission = NO; 

     if (!error) { 

      NSArray *permissions = [result objectForKey:@"data"]; 

      for (NSDictionary *dict in permissions) { 

       if ([[dict objectForKey:@"permission"] isEqualToString:permission]) { 

        if ([[dict objectForKey:@"status"] isEqualToString:@"granted"]) { 

         hasPermission = YES; 
        } 
       } 
      } 
     } 

     if (hasPermission) { 

      (sBlock) ? sBlock() : sBlock; 

     } else { 

      (fBlock) ? fBlock() : fBlock; 
     } 
    }]; 

    } else { 

    (fBlock) ? fBlock() : fBlock; 
} 
} 
0

4+あなたが許可を得て、これらの2つの方法があります。

[[FBSDKAccessToken currentAccessToken] hasGranted:@"user_photos"] 

または

[[[FBSDKAccessToken currentAccessToken] permissions] containsObject:@"user_photos"] 
関連する問題