본문 바로가기
프로그래밍/iOS

페북 Single Sign On 을 iOS앱에 적용하기

by 백룡화검 2012. 8. 8.


출처 : http://www.iosappdev.co.kr/iosappdev/?p=1652

그렇게 읽기 싫게 생긴 문서였는데

서문을 번역해서 집중도를 높인다음 브라우저 폰트키워서 차근히 읽어봤습니다. 간단하다 쉽다 좋다 무한반복.

다 읽어보니 정말 간단하더군요. 그럼 문서를 진짜 간단해 보이게 쓰던가. 그림도 한장 없고 말이야 쯧

Facebook Single Sign On Integration Summary

  • Facebook iOS SDK를 다운로드 받는다. git hub에 소스까지 공개되어 있습니다
  • iOS 앱 프로젝트에 포함시킨다

두가지 방법이 있는데 하나는 소스 폴더를 통채로 끌어다가 iOS앱 프로젝트에 포함시키는겁니다. 페북 SDK가 ARC를 지원하지 않기 때문에 iOS앱 프로젝트에서 ARC를 사용하면 좀 골치아픈 상황이 됩니다

그래서 두번째 방법은 포함된 static library 생성 shell script를 실행하면 깔끔한 라이브러리 폴더가 생깁니다. 이걸 끌어다가 iOS앱 프로젝트에 추가하면 되므로 ARC 사용여부에 상관없이 이방법 추천합니다

% ~/facebook-ios-sdk/scripts/build_facebook_ios_sdk_static_lib.sh

// This will create the static library under the <PROJECT_HOME>/lib/facebook-ios-sdk folder (e.g. ~/facebook-ios-sdk/lib/facebook-ios-sdk).

Adding Facebook object as a @property in the Application delegate

AppDelegate를 뜯어 고쳐 Facebook class의 object를 하나 만듭니다.

이때 필요한게 Facebook App등록하면 받는 App ID, FBSessionDelegate을 지원하는 class의 object 입니다.
에제에서는 appselegate에서 FBSessionDelegate를 구현하는데 그 class여야할 필요는 없습니다

// Modifying your AppDelegate class to add Facebook support
// 1. Import the header
#import "FBConnect.h"
...
// 2. Conform FBSessionDelegate
@interface MyGreatIOSAppAppDelegate : NSObject
   
<UIApplicationDelegate, FBSessionDelegate>
...

// 3. Facebook @property
@property (nonatomic, strong) Facebook *facebook;

// 4. In the implementation(.m file)
...
@implementation MyGreatIOSAppAppDelegate
@synthesize facebook = _facebook;
...

// 5. Instantiate facebook @property
- (Facebook *) facebook
{
 
if ( _facebook == nil ) {
   
// YOUR_APP_ID 대신 developers.facebook.com에서 등록한 App의 App ID를 가져와서 넣어야 합니다.
    _facebook
= [[Facebook alloc] initWithAppId:@"YOUR_APP_ID" andDelegate:self];
 
}
 
return _facebook;
}

 

Facebook class object는 app 시작되자마자 app delegate에서 만들어주는게 무난 합니다

Login and access_token Management

Facebook object에 ‘인증되었는지’ 확인하는 메서드와 ‘인증받아!’ 하는 메서드가 있으니 로그인 하고싶은 시점에 불러주면 됩니다

그러면 로그인 될때 FbSessionDelegate method중 하나가 호출 됩니다. 로그인
됐다고. 이때 로그인 버튼 같은거 교체해주면 됩니다.

그리고 중요한건 이때받는 access token을 user defaults 같은데다 저장해놓고 다음번 실행때 갖다쓰는게 중요합니다

// 6. access_token, expiration_date : App 시작시 Preference에서 꺼내와 Facebook object에 넘겨주기
// 주: 처음실행시에는 이 값들이 preference에 들어있을리 없겠죠
// 하지만 Facebook login된 후에는 이 값들을 preference에 넣어둘텐데, 그 후로 App이 다시 시작되면 이 값들을 꺼내와
// Facebook object에 넘겨주기 위함입니다.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"]
       
&& [defaults objectForKey:@"FBExpirationDateKey"]) {
        facebook
.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook
.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
}
...

// 7. Login 하고싶을 떄, 예: 사용자가 login button을 누르거나
// 아래와 같이 facebook에 인증요청:로그인을 합니다.
if (![facebook isSessionValid]) {
   
[facebook authorize:nil];
}

// 8. URL handle: Facebook이 인증을 마치고나서 혹은 다른 이유로 우리 App을 호출할 때 URL을 통해서 정보를 전달합니다. 그 정보를 facebook에 넘겨줄 필요가 있습니다.
// Pre iOS 4.2 support
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
   
return [facebook handleOpenURL:url];
}

// For iOS 4.2+ support
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
    sourceApplication
:(NSString *)sourceApplication annotation:(id)annotation {
   
return [facebook handleOpenURL:url];
}

// 9. 마지막으로, Facebook에 login되면 token과 expiration date를 챙겨둬야 합니다.
- (void)fbDidLogin {
   
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
   
[defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
   
[defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
   
[defaults synchronize];

}

Logout

Facebook class에 로그아웃 하는 메서드가 있습니다. 부르면 되요.

[facebook logout];

좀있으면 로그아웃 했다고 delegate 메서드 호출 됩니다. 이때 토큰을 user defaults에서 지워주면 됩니다.

- (void) fbDidLogout {
   
// Remove saved authorization information if it exists
   
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
   
if ([defaults objectForKey:@"FBAccessTokenKey"]) {
       
[defaults removeObjectForKey:@"FBAccessTokenKey"];
       
[defaults removeObjectForKey:@"FBExpirationDateKey"];
       
[defaults synchronize];
   
}
}

그리고 중요한 URL Schemes

  • 여기까지 만들고 테스트하면

로그인 하려고 하면 페북앱이나 사파리가 해까닥 뜨면서 간단한 인증과정 거치고 앱은 페북에 로그인 된 상태가 되었다가 로그아웃 했다가 처리할 수 있습니다

구체적인 과정은 기회가 될때 예제와 함께 설명 드리기로 하고

우선은 어떤 과정에서 무슨짓을 해서 페북이 그토록 자랑하는 SSO가 구현되는건지 이해
하시는데 도움이 되고자 기억의 부스러기를 정리 해 봤습니다

  • 로그인 로그이웃만 되서는…

아무것도 못하죠? 페북 API 사용은 지금부터 입니다. Request 같은거 사용하면 페북에 뭔가를 막 날릴 수 있습니다. 기회가 되면 같이 알아 보시죠


짤방: 페북 로그인 버튼 붙은 모습
안녕히 주무십시요.
-초짜 싸이먼