Facebook SDK 3.1 for iOS 프로젝트에 적용하기

Facebook에서는 iOS6에서 사용가능한 SDK 3.1을 몇 일 전 내놓았다.
이를 적용하기 위한 방법이 Facebook Document에 명시는 되어있지만 상세하게 나와있지 않아 조금 헤메었는데 그에 대한 내용을 적어본다.

우선 Facebook SDK for iOS 를 다운로드 받는다. pkg 파일로 패키징되어 있어 이를 다운로드하여 실행하면 “도큐멘트”에 FacebookSDK라는 디렉토리명으로 저장된다.

다음으로 이를 프로젝트에 포함시킨다.
포함시키는 방법은 FacebookSDK 디렉토리 내에 있는 FacebookSDK.framework를 프로젝트에 드래그 앤 드롭하거나 파일 추가로 포함시키면 된다.

추가적으로 포함시킬 프레임워크가 있는데 이는 “AdSupport.framework”, “Social.framework”, “Accounts.framework”이다.
여기서 첫 번째 문제가 생긴다. AdSupport와 Social은 iOS6에서 추가된 framework로 iOS6 미만 버전에는 없는 framework이다.
따라서 추가할 때는 옵션을 설정하여 준다.

일반적으로 framework를 추가하게 되면 위 화면 오른쪽 끝에서 볼 수 있듯이 “Required”로 설정이 되는데 AdSupport와 Social은 “Optional”로 설정해준다.

Deployment Target이 5.0 미만이라면 Accounts 역시 Optional로 설정한다.

그리고 Project의 Build Settings의 Other Linker Flags에 -lsqlite3.0을 추가한다.

다음으로 info.plist에 FacebookAppID와 URL Scheme을 등록해준다.
이는 기존의 방법과 같다.

다음은 AppDelegate의 헤더. 즉, AppDelegate.h에 아래와 같이 헤더와 FBSessionStateChangeNotification을 정의한다.

#import <FacebookSDK/FacebookSDK.h>
extern NSString *const FBSessionStateChangedNotification;

다음은 AppDelegate의 구현 파일. AppDelegate.m에 아래의 내용을 추가하여 준다.

NSString *const FBSessionStateChangedNotification = @"com.sample.app:FBSessionStateChangedNotification";

여기서 com.sample.app 이라고 정의한 부분은 프로젝트의 Bundle Identifier로 명시한다.
이 Bundle Identifier는 역시 Facebook App에서도 동일하게 설정이 되어야 한다.
(‘Facebook으로 로그인’하기를 사용하기 위해서는 Facebook Login 항목도 Enabled 해준다.)

그리고 이전 방법에서도 사용했듯이 – application:openURL:sourceApplication:annotation 메소드에 아래와 같이 입력한다.

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation
{
    return [FBSession.activeSession handleOpenURL:url];
}

또한 추가적으로 아래 메소드 역시 추가하여 준다.

#pragma mark - Facebook related methods

- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState)state
                      error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
            if (!error) {
                // We have a valid session
                NSLog(@"User session found");
            }
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
            [FBSession.activeSession closeAndClearTokenInformation];
            break;
        default:
            break;
    }

    [[NSNotificationCenter defaultCenter] postNotificationName:FBSessionStateChangedNotification
       object:session];

    if (error) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
                       message:error.localizedDescription
                       delegate:nil
                       cancelButtonTitle:@"OK"
                       otherButtonTitles:nil];
        [alertView show];
    }
}

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    return [FBSession openActiveSessionWithReadPermissions:nil
                      allowLoginUI:allowLoginUI
                      completionHandler:^(FBSession *session,FBSessionState state,NSError *error) {

        [self sessionStateChanged:session state:state error:error];
    }];
}

여기까지 마쳤으면 기본 세팅은 완료된 셈이다.

추가적으로 로그인을 하는 방법을 살펴보자면, 로그인을 수행하길 원하는 ViewController에서 아래와 같이 호출한다.
물론, 해당 ViewController에  #import “AppDelegate.h” 는 필수.

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate openSessionWithAllowLoginUI:YES];

iOS6 미만에서는 Facebook 앱 혹은 Safari를 갔다오면서 세션이 성립된다.
하지만 iOS6에서는 아래와 같이 바로 Dialog가 뜨면서 OK를 누르면 세션이 성립된다.
(단, 시스템 설정에서 이미 Facebook 계정이 설정되었을 경우만 나타나며, 계정이 없을 경우 iOS6 미만과 같이 Facebook 앱 혹은 Safari로 갔다가 온다.)

사실 Facebook의 문서와 거의 유사한 설명이지만,
iOS6 혹은 5에서 추가된 Framework의 경우 optional로 설정하는 부분과 Facebook App 설정에서 Bundle ID를 설정해주는 부분은 설명이 없어서 잠깐 혼란스러웠다. 

 

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.