2012-01-13 61 views
8

我有一個Facebook SSO在我的應用程序上完美工作,使用Facebook Objective-C SDK的最新版本。 如果用戶做「某事」,我需要在應用程序內請求額外的權限。我不需要問這個權限,如果用戶之前把它給我,所以,我想,在Facebook的SDK應該有一個方法iOS Facebook的SDK - 檢查權限

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

這樣我就可以這樣使用它:

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

有沒有辦法做到這一點?

回答

22

這個問題有點老,但你現在可以檢查活動會話沒有發出圖形請求的權限。以下是HelloFacebookSample中的完成方法:

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

只需將「publish_actions」替換爲「email」即可。

+0

'[FBSession activeSession]。權限「將返回您請求的權限,而不是活動權限。或者至少這是我所看到的。請參閱下面的答案。你需要'[FBRequestConnection startWithGraphPath:@「/ me/permissions」completionHandler:...]'。 – 2014-07-02 19:50:51

+1

我現在無法測試,但文檔中另有說明:「在身份驗證流程中授予訪問令牌的權限。」 https://developers.facebook.com/docs/reference/ios/current/class/FBSession/ – 2014-07-04 15:31:17

+0

今天我將我的Facebook SDK pod從3.9.0更新到3.15.1,現在'[FBSession activeSession] .permissions'返回正確的權限和'[FBRequestConnection startWithGraphPath:@「/ me/permissions」completionHandler:...]'不再返回它們(現在它返回{status:granted,permission:installed})。 – 2014-07-07 11:48:59

7

SDK不檢查特定權限提供了直接的方法,但你可以檢查用戶是否通過檢查Graph APIuser objectpermissions聯繫獲准申請

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

同樣可以FQL查詢上permissions table

實現
SELECT email FROM permissions WHERE uid = me() 
+1

謝謝你,根據你的答案,我嘗試使用方法'[facebook requestWithGraphPath:@「me/permissions」andDelegate:self];'。實現委託方法,它完美的工作。再次感謝您 – 2012-01-13 11:24:32

+1

您可以爲您的方法添加代碼以確定電子郵件許可是否有效?如果授予許可,將會發送什麼電子郵件? – Smikey 2012-02-29 13:47:15

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 
    } 
}]; 

這裏看到更多的信息:

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 
}]; 
0

這裏是我的代碼FBSDK 4.2 .0用於檢查權限。傳入的字符串是權限的名稱,例如「publish_actions」

- (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

對於SDK 4+你獲得權限,這些2種方式:

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

[[[FBSDKAccessToken currentAccessToken] permissions] containsObject:@"user_photos"]