iOS Facebook SDK - ตรวจสอบสิทธิ์

ฉันมี Facebook SSO ที่ทำงานได้อย่างสมบูรณ์แบบบนแอพของฉัน โดยใช้ Facebook Objective-C SDK รุ่นล่าสุด ฉันต้องขออนุญาตเพิ่มเติมภายในแอปหากผู้ใช้ทำ "บางสิ่ง" ฉันไม่จำเป็นต้องขออนุญาตนั้นหากผู้ใช้ให้ฉันมาก่อน ดังนั้นฉันเดาว่าใน Facebook SDK น่าจะมีวิธี

-(BOOL) checkPermission:(NSString*) permission;

ดังนั้นฉันจึงสามารถใช้มันได้ดังนี้:

if( [facebook checkPermission:@"email"] ) {

มีวิธีการทำเช่นนี้หรือไม่?


person Giorgio Marziani de Paolis    schedule 13.01.2012    source แหล่งที่มา


คำตอบ (5)


คำถามนี้ค่อนข้างเก่า แต่ตอนนี้คุณสามารถตรวจสอบได้ว่าเซสชันที่ใช้งานอยู่มีสิทธิ์ใดบ้างโดยไม่ต้องขอกราฟ นี่คือวิธีการทำใน HelloFacebookSample :

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

เพียงแทนที่ "publish_actions" ด้วย "email"

person Raphaël Agneau de Selve    schedule 03.07.2013
comment
[FBSession activeSession].permissions ส่งคืนสิทธิ์ที่คุณร้องขอ ไม่ใช่สิทธิ์ที่ใช้งานอยู่ หรืออย่างน้อยนั่นคือสิ่งที่ฉันเห็น ดูคำตอบของฉันด้านล่าง คุณต้องการ [FBRequestConnection startWithGraphPath:@"/me/permissions" completionHandler:...] - person Ferran Maylinch; 02.07.2014
comment
ฉันไม่สามารถทดสอบได้ในขณะนี้ แต่เอกสารระบุเป็นอย่างอื่น: การอนุญาตที่มอบให้กับโทเค็นการเข้าถึงระหว่างขั้นตอนการตรวจสอบสิทธิ์ developers.facebook.com/docs/reference/ios/current/class / - person Raphaël Agneau de Selve; 04.07.2014
comment
วันนี้ฉันอัปเดตพ็อด Facebook SDK ของฉันจาก 3.9.0 เป็น 3.15.1 และตอนนี้ [FBSession activeSession].permissions ส่งคืนการอนุญาตที่ถูกต้อง และ [FBRequestConnection startWithGraphPath:@"/me/permissions" completionHandler:...] จะไม่ส่งคืนอีกต่อไป (ตอนนี้จะส่งคืน {status:granted, สิทธิ์:installed}) - person Ferran Maylinch; 07.07.2014

SDK ไม่ได้ให้วิธีการโดยตรงในการตรวจสอบสิทธิ์เฉพาะเจาะจง แต่คุณสามารถตรวจสอบได้ว่าผู้ใช้ให้สิทธิ์แก่แอปพลิเคชันของคุณหรือไม่โดยตรวจสอบการเชื่อมต่อ permissions ของ user object ใน Graph API

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

สามารถทำได้เช่นเดียวกันกับ FQL แบบสอบถามใน permissions ตาราง

SELECT email FROM permissions WHERE uid = me()
person Juicy Scripter    schedule 13.01.2012
comment
ขอบคุณตามคำตอบของคุณ ฉันลองใช้วิธี [facebook requestWithGraphPath:@"me/permissions" andDelegate:self]; การใช้วิธีมอบหมายก็ทำงานได้อย่างสมบูรณ์ ขอขอบคุณอีกครั้ง - person Giorgio Marziani de Paolis; 13.01.2012
comment
คุณสามารถเพิ่มรหัสสำหรับวิธีการของคุณเพื่อตรวจสอบว่าการอนุญาตอีเมลนั้นทำงานอยู่หรือไม่? 'อีเมล' จะเป็นอย่างไรหากได้รับอนุญาต - person Smikey; 29.02.2012

สิ่งสำคัญ: ดูเหมือนว่าจะเป็นจริงสำหรับ Facebook SDK เวอร์ชันเก่า (เช่น 3.9.0) ใน 3.15.0 มันจะไม่ทำงานในลักษณะนี้อีกต่อไป คุณควรใช้ [session.permissions] ตามที่ Raphaël Agneau พูดในคำตอบของเขา

คุณต้องใช้วิธีการต่อไปนี้ เนื่องจาก [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
  }
}];

ดูข้อมูลเพิ่มเติมที่นี่:

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

หากไม่พบการอนุญาต คุณอาจต้องการขอด้วยวิธีนี้:

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

    // Try again the /me/permissions above
}];
person Ferran Maylinch    schedule 02.07.2014

นี่คือโค้ดของฉันสำหรับ FBSDK 4.2.0 เพื่อตรวจสอบสิทธิ์ สตริงที่ส่งผ่านคือชื่อของการอนุญาต เช่น "เผยแพร่_การกระทำ"

- (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;
}
}
person Tyler White    schedule 01.07.2015

สำหรับ SDK 4+ คุณมีวิธีรับสิทธิ์ 2 วิธีดังนี้:

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

or

[[[FBSDKAccessToken currentAccessToken] permissions] containsObject:@"user_photos"]
person Pochi    schedule 24.06.2016