본문으로 바로가기

Facebook SDK가 언제가 업데이트 되면서,
iOS의 설정에 있는 Facebook 계정을 통하지 않고, Facebook 앱을 통해서 인증이 되는 상황이 되었다.

분명히 초기 SDK 버전에는 설정의 Facebook 계정을 통해서 인증을 했던 것 같은데, 도무지 알 수가 없었다.

"FBSessionLoginBehavior"라고 define 되어있는 녀석을 활용하면 되는데,
"FBSessionLoginBehaviorUseSystemAccountIfPresent" 이것이 핵심이다.

completionHandler에 해당하는 부분은 미리 선언하고, 다음과 같이 코드를 작성한다.

    if ([FBSession activeSession].state == FBSessionStateCreatedTokenLoaded) {
        // we have a cached token, so open the session
        [[FBSession activeSession] openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
                                  completionHandler:completionHandler];
    } else {
        [FBSession.activeSession closeAndClearTokenInformation];
        [FBSession renewSystemCredentials:^(ACAccountCredentialRenewResult result, NSError *error) {
            NSLog(@"%@", error);
        }];
        [FBSession setActiveSession:nil];
        
        // create a new facebook session
//        FBSession *fbSession = [[FBSession alloc] initWithPermissions:@[@"read_friendlists"]];
        FBSession *fbSession = [[FBSession alloc] initWithAppID:nil
                                                    permissions:@[@"read_friendlists"]
                                                defaultAudience:FBSessionDefaultAudienceEveryone
                                                urlSchemeSuffix:nil
                                             tokenCacheStrategy:[FBSessionTokenCachingStrategy nullCacheInstance]];

        [FBSession setActiveSession:fbSession];
        [fbSession openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
                  completionHandler:completionHandler];
    }

위의 코드에서 FBSession을 새로 생성해주는 부분이 있는데
주석 처리한 코드를 사용하게 될 때 퍼미션에는 읽기 권한만을 넣어야 한다.

설명에는 읽기 또는 쓰기 한 종류의 퍼미션만 사용할 수 있다고 되어 있는데
막상 쓰기 권한을 넣으면 앱이 죽어버린다.

아무래도 이유는 Facebook API가 2.0으로 업데이트 되면서 쓰기 권한에 대한 공개 설정 여부가 업데이트 된 것 같다.
그래서 defaultAudience에 대한 조건을 주는 메소스가 존재해야 되는데 인증 부분에서는 그 부분이 필요하지만,
SDK에는 관련 부분이 업데이트 되지 않아서 발생하는 문제로 보여진다.

최종적으로 이렇게 코드를 작성하면 먼저 iOS의 설정에 있는 Facebook 계정으로 인증을 시도하고,
그 값이 없으면 Facebook 앱, 앱이 설치 되어 있지 않다면 사파리로 인증을 하게 된다.