[Facebook-Tweaks] 간단하게 살펴보기.

Tweaks Framework by FB

이틀 전 (May.24.2014) 페이스북에서 iOS 프래임워크 하나를 Github에 올리면서 공개를 했다. 해당 프래임워크의 주 기능은 간단하다. 완성된 output의 사소한 속성들을 변경하고 싶을 때 개발자의 손에 걸치지 않고 Runtime으로 수정 가능한 기능을 제공해 준다는 것이다. (아마 무슨 뜻인지 이해가 가질 않을 것으로 생각된다.)

 

“Why do I need it?”

예를 들어 개발자가 애니메이션의 Duration을 정해서 컴파일을 할 것이다. 그런데 모션 그래픽 디자이너라든지 기획자가 보기에 너무 길다던가 맘에 안들 수 있다. 그런데 일일이 개발자 옆에 앉아서 테스트 해보거나 혹은 Bug Tracking System 같은 경로를 통해서 이와 같은 다양한 주문을 시도할 것이다. 하지만 이런 과정은 프로젝트 전체를 보았을 때 상당히 값이 비싼 비용이다. 개발자와 디자이너와 신경전을 한 두번 해본 개발자라면 이 프래임워크의 큰 가치를 깨달을 것이다.

 

“What is ‘Tweaks’?”

Tweaks는 이런 문제점을 해결해주는 좋은 대안이 될 수 있다. 프래임워크를 사용하여 디자이너 혹은 기획자가 직접 UI의 속성을 바꿔가면서 테스트해볼 수 있는 대안이 생겼기 때문이다.

from github

위 gif 이미지를 잠시 보자. ‘Tweaks’라는 UILabel 객체가 화면에 있다. 그런데 어떤 이유에서든지 디자이너가 색상이 맘에 들지 않아서 이를 변경하고자 한다. 일반적으로 디자이너는 개발자에게 이메일을 보내거나 가끔은 자리에 찾아와 색상 변경을 요구하며 이것 저것을 테스트 해보길 요구할 것이다. 이럴 때에 개발자에게 있어서는 얼마나 방해가 되는 일인지 모르며 이런 작은 방해들이 점점 모여서 프로젝트의 비용을 점점 비싸게 만드는 것이다. 그런데 (개발하기 나름이겠지만… ) 본 프래임워크를 적용해서 폰을 흔들면 UI 속성을 바꿀수 있는 TableView가 나온다. 그럼 해당 UI의 속성을 바꿈으로 개발자의 손을 빌리지 않고 이것 저것 tweaking을 할 수 있는 길이 생긴 것이다.

 

“How to use?”

github 페이지에 설치 방법 부터 사용 방법이 잘 나와 있다. 가장 간단히 설치할 수 있는 방법은 CocoaPod를 사용하는 것이다. 소스코드의 순서를  간단하게 보면 다음과 같을 것이다.

  1. 프래임워크 Import 함.
  2. FBTweakViewController를 화면에 뿌릴수 있는 장치를 만듬.
  3. UI 객체 인스턴스의 속성에 바인딩 혹은, ‘FBTweaksValue’를 통해  설정 값 할당 함.

 

프래임워크 Import 하기

  1. #import <FBTweak/FBTweak.h> //FBTweak 기본 헤더파일
  2. #import <FBTweak/FBTweakShakeWindow.h> //폰을 흔들어 FBTweaksViewController를 열고 싶을 때 사용하기
  3. #import <FBTweak/FBTweakInline.h> //FBTweakInline 객체 사용할 때 필요
  4. #import <FBTweak/FBTweakViewController.h> //FBTweakViewController를 presentViewController:animated:completion:을 통해 열때 필요

 

FBTweakViewController를 화면에 뿌릴 장치

변경 가능한 UI 속성을 제어할 UITableView를 화면에 나타내주기 위해서 크게 두 가지 방법이 있을 것이다. 첫 번째는 폰을 흔들어서 나타나게 하는 방법과 임시의 버튼을 만들어서 presentViewController:animated:completion: 메서드를 사용하여 FBTweakViewController 객체를 화면서 나타나게 하는 방법이다. 둘 중에 편한 방법으로 사용하면 될 것이라고 생각 되어진다.

 

UI 속성 바인딩 혹은 설정 값을 Tweaks 함수를 통해 할당

이제 자신이 디자이너들이나 타인들에게 Runtime 때에 변경 가능한 UI 속성을 주고자 하는 코드에 FBTweakValue 함수를 통해서 값을 할당 하든지, FBTweakBind 함수를 통해서 값을 바인딩하면 된다.

  1. //#. Binding 예
  2. UILabel *_label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, _window.bounds.size.width, _window.bounds.size.height * 0.75)];
  3. _label.textAlignment = NSTextAlignmentCenter;
  4. _label.numberOfLines = 0;
  5. _label.userInteractionEnabled = YES;
  6. _label.backgroundColor = [UIColor clearColor];
  7. _label.textColor = [UIColor blackColor];
  8.  
  9. //1-a
  10. _label.font = [UIFont systemFontOfSize:FBTweakValue(@"Content", @"Text", @"Size", 60.0)];
  11.  
  12. //1-b. UILabel 객체의 텍스트 속성을 동적인 값으로 바인딩
  13. FBTweakBind(_label, text, @"Content", @"Text", @"String", @"Tweaks");
  14.  
  15. //1-c. UILabel 객체의 알파 속성을 동적인 값으로 바인딩
  16. FBTweakBind(_label, alpha, @"Content", @"Text", @"Alpha", 0.5, 0.0, 1.0);

‘FBTweakBind’ 함수 사용법은 다음과 같다.

  1. FBTweakBind(object_, property_, category_, collection_, name_, …)

  • object: UI 오브젝트 인스턴스
  • property: 객체 속성명
  • category: TableView에 나올 TableViewCell 명
  • collection: grouped tableView에 표시 될 그룹 명
  • name: 해상 TableViewCell에 표시 될 title 명
  • …: 기본 설정 값

‘FBTweakValue’ 함수 사용법은 다음과 같다

  1. FBTweakValue(category_, collection_, name_, …)

  • category: TableView에 나올 TableViewCell 명
  • collection: grouped tableView에 표시 될 그룹 명
  • name: 해상 TableViewCell에 표시 될 title 명
  • …: 기본 설정 값

그리고 나서 뒤에 오는 값들은 기본 설정 값이다. 이 기본 설정에 따라 TableViewCell에 나타날 설정 가능하도록 해주는 UI가 결정이 된다. 1-b에는 NSString인 ‘Tweaks’로 설정되어 있고, 1-c에서는 세개의 값이 있다. 첫 번째 값인 0.5는 디폴트 값이며, 두번째는 설정 가능한 가장 낮은 값, 세번째 값은 설정 가능한 가장 큰 값이다. 이렇게 설정을 하면 UIStepper를 통해 설정이 가능하게 해준다. 만약에 이 값에 YES와 같은 Bool 값이 들어오면 Toggle 가능한 UISwitch가 들어 올 것이다.

Where to go next?

github에 올라온 소스를 자신의 컴퓨터에 클론하여 예제 앱을 사용해 보면 자신의 프로젝트에 어떻게 사용할지 쉽게 알게 될 것이다. 위에 설명한 것들은 정말 기본적이고 쉬운 것들이고, 더 advance한 사용은 github에 나와있는 설명과 stackoverflow를 통해 알아보기 바란다. 혹자도 기존 프로젝트에 적용해보고 추가할 내용이 생기면 추후에 본 블로그를 더 업데이트 하겠다.

[관찰] Quiet Time with Facebook SDK -Part 1-2. Authentication (Session)-

Screen Shot 2013-09-03 at 11.11.11 AM

안녕하세요. 바티입니다. 오늘은 Facebook SDK의 인증부분에서 중요한 ‘Session’에 대한 설명을 해보도록 하겠습니다. 본 포스팅은 링크를 바탕으로 부분적 번역 및 이해를 돕기 위해 추가적으로 간략하게 정리해보았습니다. 크게 설명한 내용은 다음과 같습니다.

  • 세션 상태의 생명주기
  • 세션 토큰 캐쉬하기

‘세션 상태의 생명주기’에서는 FBSession의 상태가 앱의 상태와 플로우를 통해서 어떻게 변하는지 설명하게 될 것고, ‘세션 토큰 캐쉬하기’에서는 FBSession을 한번 열었을 때 그것을 저장하는데, 어떤 메서드를 통해서 관리가 되는지 큰 그림을 그려보도록 하겠습니다.

#Session State Lifecycle (세션 상태의 생명주기)

Facebook SDK는 세션 상태의 생명주기를 관리하기 위해서 ‘세션 상태 머신’을 사용한다. 이 상태들을 통해서 올바른 상태 전환에 따른 처리와 ‘access token’에 저장 및 사용 그리고 에러 시나리오에 대한 처리를 할 수 있게 도와준다. 자세한 설명에 들어가기 앞어서 기억해야하는 두 가지가 있는다.

  • 세션은 한번만 열수 있다. 세션이 닫히면 똑같은 세션을 다시 열수 없다. 대신에 새로운 세션을 열수 있다. 보통 모바일 앱에서는 active 세션을 한번 열것이다. Facebook SDK에서는 열수 있는 새 세션 인스턴스를 관리해주는 static 메서드를 제공한다.
  • 세션의 오픈 APIs는 완전한 핸들러를 제공한다. 핸들러는 세션 인스턴스와 연관되어지고, 세션 상태가 바뀔 때마다 호출해 준다. 핸들러는 세션이 열렸을 때, 토큰이 업데이트 되었을 때, 세션이 닫히거나 다른 상태로 바뀔때 호출되어 진다.

이어서 세션 상태를 설명하기 위해서 Facebook SDK에서 제공해주고 있는 샘플 ‘Scrumptious’를 가지고 설명을 알 것이다.

i- 앱 실행

Facebook의 샘플 코드인 ‘Scrumptious’ 앱이 처음 실행하면 FBSession의 ‘openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:’가 호출된다.

Screen Shot 2013-09-09 at 7.59.19 AM

FBSessions는 ‘FBSessionStateCreated’로 시작해서 만약 토근이 캐시에서 찾게 되면 ‘FBSessionStateOpen’가 된다.

‘OpenActiveSession*’ 메서드 대신 다음과 같은 과정으로 같은 것을 성취할 수 있다.

  1. FBSession 인스턴스의 init 메서드를 호출.
  2. 상태 값이 FBSessionStateCreated로 전환이 되었는지 체크.
  3. 만약 상태 값이 FBSessionStateCreated이면 FBSession 인스턴스의 open이 들어가는 함수를 호출.

만약 위 흐름을 사용하고 싶으면 사용자는 Static 메서드를 사용 할 수 없다. 예를 들어 만약 프로그램 소스 구현에서 캐시 전략을 사용하고 싶으면 세션을 초기화할 때 정보를 전달해야 한다.

 

ii- 로그인

Scrumptious 샘플에서 로그인 UI는 FBSession의 클래스 메서드 openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:의 호출을 통해서 이다. allowLoginUI를 YES를 넘겨줌으로써 강제로 로그인 UI를 보여준다.

iOS 6부터 OS 차원에서 Facebook 계정을 연동하기 시작하면서 처음에는 OS 차원에서 직접 지원하는 Facebook 시스템의 로그인을 시도한다. 만약 iOS에 설정이 안되어 있다면 iOS용 Facebook 앱이나 사파리 브라우저로 대처 한다.

아래 그림은 iOS 차원에서 지원하는 Facebook 시스템의 플로우다.

Screen Shot 2013-09-09 at 8.05.20 AM

네이티브 로그인 창이 나오기 전에는 상태 값은 FBSessionStateCreated에서 FBSessionStateCreatedOpening으로 변환된다. 만약 사용자가 ‘OK’를 클릭하면, FBSessionStateOpen으로 상태가 변화된다. 만약 사용자가 수락하지 않으면, 상태 값은 FBSessionStateClosedLoginFailed로 변화된다. 에러가 나면 화면에 보여줄 수 있게 정보를 전달해준다.

Screen Shot 2013-09-09 at 8.06.43 AM

앱은 iOS용 Facebook 앱이나 사파리 브라우저로 전환되기 전에 상태 값은 FBSessionStateCreated에서 FBSessionStateCreatedOpening로 전환된다. 만약 사용자가 로그인 창에서 퍼미션을 수락하면 상태 값은 FBSessionStateOpen으로 전환된다. 하지만 만약 사용자가 취소 버튼을 클릭하면 상태 값은 FBSessionStateClosedLoginFailed로 전환고 에러에 대한 정보도 함께 전달된다. 여기에서 또다른 경우가 생기는데 사용자가 ‘취소’ 버튼을 클릭하지 않고 홈 버튼을 클릭하면 이 시나리오에서는 iOS용 Facebook앱은 로그인 흐름이 끊겼다는 것에 대한 정보를 전달할 방법을 잃게 된다. 이런 상황을 처리하기 위해서는 AppDelegate 파일에서 handleDidBecomeActive 메서드를 통해서 처리할 수 있다. 이 경우에는 상태의 값이 FBSessionStateCloseLoginFailed로 전환된다.

 

iii- 추가적인 허가를 요청할 때

개발 중인 앱에서 사용자가 인증을 마치고 나서 추가적인 퍼미션을 요구하는 상황이 생길 수도 있다. FBSession 인스턴스 메서드의 requestNew*를 통해 다음 흐름을 초기화 할 수 있다.

Screen Shot 2013-09-09 at 8.07.34 AM

위 다이어그램은 iOS 6 기기에서 사용자가 시스템 계정으로 로그인 되는 흐름을 보여준다. 이 흐름은 기본 적으로 빠른 앱 스위칭 케이스와 동일하다. 만약 사용자가 추가적인 퍼미션을 수락한다면 세션의 상태는 FBSessionStateOpenTokenExtended로 변화할 것이다.

하지만 만약 수락하지 않는다면 세션의 상태는 FBSessionStateOpen이나 FBSessionStateOpenTokenExtended로 남게 될 것이다.

 

iv- 로그아웃

Scrumptious 샘플 프로그램에서 로그 아웃 버튼을 클릭하게 되면 현재 활성된 세션에서 closeAndClearTokenInformation 메서드가 호출 된다.

Screen Shot 2013-09-09 at 8.08.18 AM

이 전환은 FBSessionSateOpen이나 FBSessionStateOpenTokenExtended 상태에서 FBSessionStateClosed로 전환된다.

closeAndClearTokenInformation 메서드는 세션을 닫는과 동시에 캐시에 대한 정보도 지우게된다. 이 말의 뜻은 앱을 재 실행하면 로그인 창이 뜨게 된다는 말이다.

FBSession의 close 메서드 호출도 상태 값을 FBSessionStateClosed 로 전환 시켜준다. 하지만 캐시 정보는 지워 주지 않고, 다음번 앱 실행 때 캐시 정보를 사용할 수 있게 된다. 데모 앱에서 close 메서드는 appDelegate 클래스의 applicationWillTerminate: 메서드에서 사용 되었다. 이것은 열린 세션에 연류되어 있는 객체들을 지워주는데  좋은 실행 방식이다.

 

#세션 토큰 캐싱

Facebook SDK는 디폴트로 FBSession의 토큰 관련 데이터를 캐시 해준다. FBSessionTokenCachingStrategy 클래스는 캐시된 데이터를 관리해주는 클래스이다. 데이터는 NSDictionary이며, NSUserDefaults 아래에 특정한 키로 저장이 된다. 개발자가 서버 같은 곳에 저장하는 거와 같이 스스로 캐시 데이터를 관리해도 된다. 커스터마이징 하면서 사용하기 위해서는 FBSessionTokenCachingStrategy를 상속받아 다음과 같은 메서드를 오버라이드 하면 된다.

  • cacheTokenInformation:이나 cacheFBAccessTokenData: -
  • fetchTokenInformation이나 fetchFBAccessTokenData -
  • clearToken -

FBAccessTokenData의 토큰 데이터는 사용자의 access_token와 유통기간은 언제까지인지 혹은 토큰이 언제 마지막으로 refresh되었는지에 대한 내용이나 어떤 타입의 로그인 과정을 걸쳤는지에 대한 추가적인 정보를 가지고 있다.

Facebook SDK가 토큰 캐시 데이터를 관리하게 되면 NSUserDefaults의 ‘FBSessionTokenCachingStrategy’ 키를 통해 저장되어진다. 키를 변경 하고 싶으면 FBSessionTokenCacingStrategy의 initWithUserDefaultTokenInformationKeyName: 메서드를 사용하여 조정할 수있다. Facebook SDK에서 사용하고 싶은 키를 직접 입력하여 사용이 가능하다.

[관찰] Quiet Time with Facebook SDK -Part 1-1. Authentication (Login)-

Screen Shot 2013-09-03 at 11.11.11 AM

 

안녕하세요. 바티 입니다.

Web 2.0이라는 단어가 유명해지기 시작하면서 주목 받던 주제 중 하나가 ‘공유’였던 것으로 기억합니다. ‘공유’라고 하면 개발자들은 먼저 떠오르는 단어들 중 하나가 ‘Open API’이거나 ‘SDK’가 아닐까 싶네요. 구글과 페이스북 같은 대기업에서 부터 소규모의 스타텁까지 SDK 및 Open API를 제공하고 사용하기 위해서 혈안이 되어 있는 모습입니다. 그런 의미로 블로그를 통해 메이져 회사들의  SDK를 완전 분해해 보고자 합니다.

앞으로 완전분해 해보기 위해서는 세가지 툴을 사용할 것입니다. ‘관찰’, ‘해석’ 그리고 ‘비교’. 긴 여정이 될 것 같은데 먼저 긴 여행도 첫 발이 중요한 만큼 첫 시리즈로는 온라인에서  많은 사용자들로 부터 사랑을 받고 있는 ‘페이스북’ SDK입니다. 페이스북에서 제공해주고 있는 SDK와 함께 예제 소스를 통해서 어떻게 사용하는지, 또는 그 속은 어떻게 되어 있는지 한번 살펴보고자 합니다.

부족하거나 잘못된 부분 혹은 궁금한 부분이 있으시면 자유롭게 댓글 달아주시면 함께 고민해보아요.

본 포스트에서는 Facebook SDK를 사용하여 로그인 하는 방법을 알 아볼 것입니다. Login Dialog의 종류의 특징, 상황에 따른 SDK가 컨트롤하는 Login Dialog, 그리고 제공 받을 정보에 대한 Permission에 대한 내용 및 몇 가지를 다룰 것이다.

 

Facebook Login on iOS

페이스북 로그인은 타 개발사들이 ‘접근자 토큰’ (Access token)을 제공 해줌으로써 페이스북의 서비스를 사용할 수 있게 해준다. 이 기능을 자신의 로그인과 인증 시스텐에 넣어서 사용할 수 있다. 예를 들어 현재 시장에 올라오는 앱들을 살펴보면 대부분 ‘Login with Facebook’라고 새겨진 파란 버튼을 쉽게 찾아 볼수 있다. 이 버튼들은 대부분 자신이 만든 페이스북 버튼이거나 FBLoginView를 갖다 붙여 놓은 것들이다.

페이스북에서 제공하는 'FBLoginView'

페이스북에서 제공하는 ‘FBLoginView’

 

Login Dialog

자신이 직접 버튼을 만들었던, 페이스북에서 제공해주는 인증과정을 위한 Login Dialog는 다음과 같이 크게 5 가지로 구분할 수 있다.

  1. 페이스북 앱 Native Login Dialog
  2. iOS 6 Native Login Dialog
  3. Facebook 앱 웹 Login Dialog
  4. 모바일 Safari Login Dialog
  5. 임베디드 WebView Login Dialog

각 Dialog는 사용자의 iOS 설정 혹은 디바이스에 페이스북이 설치되어 있는 여부에 따라 보여지는 것이 달라진다. 그럼 이제 부터 각각의 Login Dialog에 대해 페이스북 문서에서 알려주고 있는 장단점과 Dialog에 대해 알아보자. 페이스북 개발자 사이트

#1. 페이스북 앱 Native Login Dialog 

Facebook App Native Login Dialog

Facebook App Native Login Dialog

100 퍼센트 Native이며 ‘Facebook’ 앱에서 열려지는 창이다. 이 방법을 사용하기 위해서는 ‘.plist’ 파일에 ‘FacebookDisplayName’이라는 이름 아래에 앱 이름을 정의를 해주어야 한다. 정의된 키의 값은 페이스북 개발자 사이트에 등록한 이름과 동일해야만 한다.

- 장점: 100 퍼센트 Native

- 단점: iOS 6.0 이상용 페이스북 앱이 설치가 되어 있어야만 한다.

 

 

 

 

 

 

#2. 페이스북 앱 Native Login Dialog 

iOS 6 Native Login Dialog

iOS 6 Native Login Dialog

이 Login Dialog 창은 Apple이 iOS 6에서 새로 선보인 ‘Facebook 통합’에 해당하는 기능이다. 먼저 사람들은 iOS 설정에서 페이스북을 설정해야만 사용이 가능하다. 해당 방법은 디바이스 차원의 인증 방법이기 때문에 사용자가 가지고 있는 모든 iOS에 설정 해야만 사용이 가능하다.

- 장점: *100 퍼센트 Native

*로그인 과정에서 앱을 벗어나지 않아도 됨.

- 단점: *iOS 6 이상 사용자에 한에 사용가능

*멋진 비주얼이 없다. (단순 UIAlertView로 뜸)

*프라이버시 옵션 선택이 불가능함.

 

 

 

#3. 페이스북 앱 웹 Login Dialog 

Facebook App Web Login Dialog

Facebook App Web Login Dialog

해당 Login Dialog창은 ‘페이스북’ Native 앱에서 열리며, 페이스북 앱의 버젼이 맞지 않을 때 웹 베이스의 컴포넌트에서 띄어준다.

- 장점: 모든 Facebook 앱 버전과 호환 가능함

- 단점: 웹 베이스 뷰는 사용자들에게 최상의 경험을 줄수 없다.

 

 

 

 

 

 

 

#4. 모바일 사파리 Login Dialog 

Mobile Safari Login Dialog

Mobile Safari Login Dialog

 

해당 Login Dialog 창은 모바일의 사파리 브라우저에서 열린다. 다른 Login Dialog 창의 최종 대안이 된다.

- 장점: 사용자 디바스에 설치되어 있는 페이스북 버전에 의존하지 않는다.

- 단점: *웹 베이스 뷰는 사용자들에게 최상의 경험을 줄수 없다.

*모바일 버전 사파리 브라우저에서 로그인을 해야하는 불편함.

 

 

 

 

 

 

#5. 임베드 WebView Login Dialog 

Embedded WebView Login Dialog

Embedded WebView Login Dialog

해당 Login Dialog 창은 SDK를 사용하여 개발하는 앱의 임베디드 WebView에서 나타나게 된다. 해당  Login Dialog를 띄우기 위해서는 트리거할 수 있는 코드를 작정해야한다.

- 장점: 다른 앱 전환 없이 사용 가능함.

- 단점: *웹 기반 뷰는 사용자들에게 최상의 경험을 줄수 없다.

* 사용자는 Login Flow를 탈 때마다 페이스북 ID와 비밀번호를 입력해야하는 불편함이 있다.

 

 

 

 

 

 

위에서 살펴본 다양한 Login Dialog 창들은 SDK를 적용하는 개발자는 FBSession open* 으로 시작하는 메서드를 사용하여 다양한 사용자 디바이스 환경에 대응할 수 있다. 가장 먼저 SDK는 해당 디바이스의 iOS 6 이상 버전인 것을 확인 할 것이고, 만약 사용 중이라면 OS 레벨에서 Facebook 계정을 연동하였는지 확인 할 것이다. 만약 사용한다면 iOS 6 Native Login Dialog 창을 띄어 줄 것이다. 하지만 iOS   버전이 지원을 안하든지, OS 차원에서 페이스북과 연동을 하지 않은 디바이스에서는 다음 단계의 대안(fallback)을 살펴볼 것이다. 페이스북 앱이 설치되어 있는지 볼 것이고, 되어 있다면 페이스북 앱의 버전을 확인하여 Facebook App Native Login DialogFacebook App web Login Dialog를 보여 줄 것이다. 만약 페이스북 앱도 깔려 있지 않은 디바이스에서는 최후의 선택으로 ‘모바일 사파리 Login Dialog’ 창을 띄어서 인증을 할 것이다. 이 외에도 ‘임베디드 WebView Login Dialog’ 창을 통하여서 개발 중인 앱을 빠져 나가지 않고 해당 앱에서 웹뷰 창을 띄어 줄 수 있는 대안도 있다.

만약 개발 중인 앱의 ‘.plist’ 파일에 ‘FacebookDiskplayName’ 설정을 추가하지 않았다면 로그인 과정은 다음 과정을 차례대로 시도하며 내려갈 것이다.

  1. iOS 6 Login Dialog
  2. Facebook App Web Login Dialog
  3. Mobile Safari Login Dialog

만약 ‘iOS 6 Login Dialog’를 건너뛰고 싶다면, FBSession 클래스 인스턴스의 openWithBehavior:completionHandler: 메서드에 FBSessionLoginBehavior 파라미터를 ‘FBSessionLoginBehaviorUseSystemAccountIfPresent’ 파라미터를 제외하고 다른 파라미터를 사용하면 된다.

 

  1. // Initialize a session object
  2. FBSession *session = [[FBSession alloc] init];
  3. // Set the active session
  4. [FBSession setActiveSession:session];
  5. // Open the session
  6. [session openWithBehavior:FBSessionLoginBehaviorWithNoFallbackToWebView
  7. completionHandler:^(FBSession *session, FBSessionState status, NSError *error){
  8.  
  9. // Respond to session state changes,
  10.  
  11. // ex: updating the view
  12. }];

위 코드를 사용했을 때 SDK의 로그인 플로우는 다음과 같을 것이다.

  1. Facebook App Native Login Dialog
  2. Facebook App Web Login Dialog
  3. Mobile Safari Login Dialog

 

구현

위에서 설명한 Login Dialog를 통한 인증 과정을 걸치기 위해서 실제적으로 적용해야하는 구현을 설명하겠다. 크게 두가지 방법으로 구현할 수 있을 것이다. FBSession 인스턴스를 사용하는 방법과 FBLoginView를 사용하는 방식이 있다. 먼저 인스턴스를 초기화와 동시에 적용하는 방법을 알아보자.

 

#1. FBLoginView를 사용하는 방법

  1. FBLoginView *loginView = [[FBLoginView alloc] init];
  2. loginView.readPermissions = @[@"basic_info"];
  3. [modalViewController.view addSubview:loginView];

위 코드는 FBLoginView를 초기화 하고 원하는 Permission을 설정한다음에 뷰단에 붙이는 작업이다. 위 코드를 적용하게 되면은 아래와 같은 ‘Login with Facebook’ 버튼이 자동으로 생길 것이다.

페이스북에서 제공하는 'FBLoginView'

페이스북에서 제공하는 ‘FBLoginView’

 

 

 

버튼을 누르게 되면 사용자의 상황에 맞는 Login flow가 실행되어 질것이다. 사용자가 가장 쉽게 적용할 수 있는 방법이라고 생각되어 진다. 코드상으로 addSubview:를 사용하여 적용할 수도 있고, 아니면 xib 파일에서 커스텀 버튼을 적용하는 방식으로도 사용이 가능하다.

 

#2. FBSession을 사용한 로그인

사용자는 FBLoginView에 상응하는 UI를 만들어주어야 한다. 페이스북 개발자 사이트에 나와있는 Tutorial에서 제안하는 방법으로 커스텀 “Login” 버튼의 핸들러에 다음과 같은 메서드를 적용해보자. Static 메서드를 통한 호출 방식과 인스턴스를 만들어 호출하는 방식 둘중에 아무구나 사용해도 무관하다.

* Static 메서드

  1. [FBSession openActiveSessionWithReadPermissions:@[@"basic_info", @"email"]
  2. allowLoginUI:YES
  3. completionHandler: ^(FBSession *session, FBSessionState state, NSError *error)
  4. {
  5. [self sessionStateChanged:session state:state error:error];
  6. }];

 

* FBSession 인스턴스 방식

  1. FBSession *session = [[FBSession alloc] init];
  2.  
  3. [FBSession setActiveSession:session];
  4. [session openWithBehavior:FBSessionLoginBehaviorWithNoFallbackToWebView
  5. completionHandler:^(FBSession *session, FBSessionState status, NSError *error)
  6.  
  7. {
  8. // Respond to session state changes
  9. // ex: updating the view
  10. }];

 

방식은 static method와 거의 흡사하다.

 

#3. 객체 초기화 후 Permission 받기

Facebook SDK는 사용자의 정보를 초기화할 때 요청할 수도 있고, 초기화 후 요청을 할 수도 있다. 초기화 후에 추가로 요청할 경우에는 위 코드와 같은 방식으로 요청을 하면된다.

  1. [FBSession.activeSession requestNewReadPermissions:@[@"user_likes"]
  2. completionHandler:^(FBSession *session, NSError *error)
  3. {
  4. // Handle new permissions callback
  5. }];

글 쓰기 Permission을 받기 위해서는 requestNewPublishPersmissions:defaultAudience:completionHandler 메서드를 통해 요청할 수 있다.

  1. [FBSession.activeSession requestNewPublishPermissions:@[@"publish_actions"]
  2. defaultAudience:FBSessionDefaultAudienceFriends
  3. completionHandler:^(FBSession *session, NSError *error)
  4. {
  5. // Handle new permissions callback
  6. }];

 

#4. 로그인 상태 체크하기

  1. if ([FBSession.activeSession isOpen])
  2. {
  3. // Session is open
  4. }
  5. else
  6. {
  7. // Session is closed
  8. }

 

#5. Access 토큰 받기

서비스나 앱의 특성에 따라 달라질 것이지만, 어떤 경우에는 서버에 Access 토큰을 저장해야 하는 경우가 있다. 이럴땐 다음과 같은 방법으로 토큰을 얻을 수 있다.

  1. NSString *accessToken = [[FBSession.activeSession accessTokenData] accessToken];

 

#6. 로그 아웃하기

로그 아웃하는 방법은 다음과 같다. 다음 코드를 사용하면 세션도 닫아주고 동시에 저장되어 있는 캐시도 지워준다.

  1. [FBSession.activeSession closeAndClearTokenInformation];

하지만 여러가지 이유로 캐시를 꼭 안지워 줄 때는 다음과 같이 close 메서드를 사용한다.

  1. [FBSession.activeSession close];

 

마치며..

Facebook SDK의 인증 부분을 분석하기 위해서 먼저 ‘관찰’이라는 방법을 통해 어떤 일을 하는지 알아 보았다. 이번 포스팅에서는 로그인에 관한 내용을 페이스북 개발자 문서에 설명한 순서대로 설명해보았다.

사용자가 처해있는 환경에 따라 알맞은 Dialog를 보여주는 SDK의 위력은 대단하다고 생각한다. 만약 SDK가 커버해주지 못한다면 앱 개발자들이 자신의 코드에서 대응해야 할 것인데 수고를 덜어줄 뿐만이 아니라 위대한 빙산의 일각을 보는 느낌이라고나 할까? 경의로움까지 느낀다. FBSession는 여러 상태를 가지고 있다.

다음 포스팅에서는 FBSession 객체의 ‘Status’ (상태)에 대해서 알아보자. 어떤 상태들이 있는지 알아보게 될 것이고, 어떤 상황에서 어떤 상태로 변화 되는지 알아보게 될 것이다.