[iOS] Facebook Error: The Facebook server could not fulfill this access request: The app must ask for a basic read permission at install time.

Tadashi Shigeoka ·  Wed, May 22, 2013

I encountered an error when implementing Facebook authentication with Facebook iOS SDK version 3.5.1.

Error Log

error:Error Domain=com.facebook.sdk Code=2 “The operation couldn’t be completed. (com.facebook.sdk error 2.)” UserInfo=0x1e8b2740 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:SystemLoginCancelled, com.facebook.sdk:ErrorInnerErrorKey=Error Domain=com.apple.accounts Code=7 “The Facebook server could not fulfill this access request: The app must ask for a basic read permission at install time.” UserInfo=0x1ddf1eb0 {NSLocalizedDescription= The Facebook server could not fulfill this access request: The app must ask for a basic read permission at install time. }, com.facebook.sdk:ErrorSessionKey=<FBSession: 0x1ddabd90, state: FBSessionStateClosedLoginFailed, loginHandler: 0x0, appID: 336861069774973, urlSchemeSuffix: , tokenCachingStrategy:<FBSessionTokenCachingStrategy: 0x1dd91670>, expirationDate: (null), refreshDate: (null), attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(null)>}

Initially, I was trying to get only publish_actions using openActiveSessionWithPublishPermissions as follows, but according to the error message “The app must ask for a basic read permission at install time.”, you need to first request basic profile information.

+ (void)connectWithCompletionHandler:(void(^)(FBSession *session, FBSessionState status, NSError *error))handler {
    NSLog(@"Connection");
    if ([[FBSession activeSession] isOpen]) {
        NSLog(@"Logout");
        [[FBSession activeSession] closeAndClearTokenInformation];
    }

    // Request publish permissions
    NSArray *publishPermissions = [NSArray arrayWithObjects:@"publish_actions", nil];
    [FBSession openActiveSessionWithPublishPermissions:publishPermissions
                                       defaultAudience:FBSessionDefaultAudienceFriends
                                          allowLoginUI:YES
                                     completionHandler:handler];
}

So, you can fix this by first calling openActiveSessionWithReadPermissions as shown below:

+ (void)connectWithCompletionHandler:(void(^)(FBSession *session, FBSessionState status, NSError *error))handler {
    NSLog(@"Connection");
    if ([[FBSession activeSession] isOpen]) {
        NSLog(@"Logout");
        [[FBSession activeSession] closeAndClearTokenInformation];
    }

    // Request basic profile information
    // 基本情報で必要なものがある場合、指定する
    // NSArray *readPermissions = [NSArray arrayWithObjects:@"email", @"user_birthday", nil];
    NSArray *readPermissions = nil;
    [FBSession openActiveSessionWithReadPermissions:readPermissions
                                       allowLoginUI:NO
                                  completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
                                      /* handle success + failure in block */
                                  }];

    // Request publish permissions
    NSArray *publishPermissions = [NSArray arrayWithObjects:@"publish_actions", nil];
    [FBSession openActiveSessionWithPublishPermissions:publishPermissions
                                       defaultAudience:FBSessionDefaultAudienceFriends
                                          allowLoginUI:YES
                                     completionHandler:handler];
}

[Reference]

Facebook iOS SDK3.5で投稿処理を行う際の流れ(その2) - assaulter’s diary

That’s all from the Gemba.