Unity3D Facebook SDK for iOS Integration 2. 로그인 및 로그아웃

 유니티3D iOS 페이스북 연동 준비작업을 정리해봤습니다. 이번에는 페이스북 세션을 만들어 로그인하고 세션을 닫아 로그아웃하는 처리를 정리해보겠습니다. 먼저 ios 플러그인 부분입니다.


//iOSFacebookPlugin.h
#import <Foundation/Foundation.h>
#import <FacebookSDK/FacebookSDK.h>

@interface iOSFacebookPlugin : NSObject

//@property (nonatomic, retain) FBSession* session;

+ (iOSFacebookPlugin*) sharediOSFacebookPlugin;
- (void) openSession:(NSString*)strFbAppId;
- (void) closeSession;
#end


//iOSFacebookPlugin.mm
extern "C"
{
    void iOSfbOpenSession(const char* pszFbAppId)
    {
        NSString* fbAppId = [NSString stringWithUTF8String:pszFbAppId];
        [[iOSFacebookPlugin sharediOSFacebookPlugin] openSession:fbAppId];
    }
 
    void iOSfbCloseSession()
    {
        [[iOSFacebookPlugin sharediOSFacebookPlugin] closeSession];

    }
}

@implementation iOSFacebookPlugin

+ (iOSFacebookPlugin*) sharediOSFacebookPlugin
{
    static iOSFacebookPlugin* pInstance;
    if(pInstance == NULL)
    {
        pInstance = [[iOSFacebookPlugin alloc] init];
    }
    return pInstance;
}

- (void) openSession:(NSString*)strFbAppId
{
    NSLog(@"iOSFacebookPlugin::openSession %@", strFbAppId);
 
    [FBSettings setDefaultAppID:strFbAppId];
 
    if(FBSession.activeSession != nil)
    {
        if(FBSession.activeSession.isOpen)
        {
            UnitySendMessage("iOSManager", "fbOpenSessionResult", "open");
            return;
        }
    }
 
    NSArray* permissions = [[NSArray alloc] initWithObjects:@"email", nil];
 
    [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:true completionHandler:^(FBSession* session, FBSessionState status, NSError* error)
     {
         NSString* strError = [error localizedDescription];
         NSLog(@"Facebook Session State %d Error %@", status, strError);
       
         const char* strResult = 0;
         if(FB_ISSESSIONOPENWITHSTATE(status) == true)
         {
             strResult = "open";
             [FBSession setActiveSession:session];
         }
         else
         {
             [[FBSession activeSession] closeAndClearTokenInformation];
             [FBSession setActiveSession:nil];
             FBSession* session = [[FBSession alloc] init];
             [FBSession setActiveSession:session];
             strResult = "close";
         }
         UnitySendMessage("iOSManager", "fbOpenSessionResult", strResult);
     }];
}

- (void) closeSession
{
    [[FBSession activeSession] closeAndClearTokenInformation];
    [FBSession setActiveSession:nil];
    NSLog(@"iOSFacebookPlugin::closeSession");
}

@end


 위 플러그인 소스 수정 이외에 기본 생성되는 아래 나오는 Classes/AppController.mm 수정도 중요합니다.

//추가
#import <FacebookSDK/FacebookSDK.h>

...

- (void) applicationDidBecomeActive:(UIApplication*)application
{
    printf_console("-> applicationDidBecomeActive()\n");
    if (_didResignActive)
    {
        UnityPause(false);
        //추가
        [FBAppEvents activateApp];
        [FBAppCall handleDidBecomeActive];
    }

    _didResignActive = NO;
}

- (void) applicationWillTerminate:(UIApplication*)application
{
    printf_console("-> applicationWillTerminate()\n");
    //추가
    [[FBSession activeSession] close];

    Profiler_UninitProfiler();

    UnityCleanup();

}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    bool bFbAppCall = false;
 
    // attempt to extract a token from the url
    bFbAppCall = [FBAppCall handleOpenURL:url
                  sourceApplication:sourceApplication
                    fallbackHandler:^(FBAppCall *call) {
                        NSLog(@"In fallback handler");
                    }];
 
    // 처음 사파리로 페이스북 세션을 생성 한 후 게임으로 돌아올 때 세션 상태를 유니티에 보내기 위해
    if(FBSession.activeSession.isOpen)
    {
        NSLog(@"openURL Facebook Session State %d", FBSession.activeSession.state);
        UnitySendMessage("iOSManager", "fbOpenSessionResult", "open");
    }
    return bFbAppCall;
}

 게임이 백그라운드 포그라운드시 제대로 처리하려면 위와 같은 부분을 추가 수정해줘야 합니다.


using LitJson;

public class iOSManager : MonoBehaviour
{
 static iOSManager _instance;
 private string strLog = "Unity3D iOS Facebook Sample";
 public string strPostMsg = string.Empty;
 private Dictionary<string, string> dicFriends = new Dictionary<string, string>();

 [DllImport("__Internal")]
 private static extern void iOSfbOpenSession(string strFbAppId);
 [DllImport("__Internal")]
 private static extern void iOSfbCloseSession();

 public static iOSManager GetInstance()
 {
  if( _instance == null )
  {
   _instance = new GameObject("iOSManager").AddComponent<iOSManager>();
  }

  return _instance;
 }

 public void OpenSession(string strFbAppId)
 {
  iOSfbOpenSession(strFbAppId);
 }

 public void fbOpenSessionResult(string strResult)
 {
  SetLog("Facebook Session " + strResult);
 }

 public void CloseSession()
 {
  iOSfbCloseSession();
 }
}

 마지막으로 iOSManager 부분입니다. strFbAppId는 페이스북에 추가한 앱 ID 입니다. 적절히 GUI를 만들어 호출해줍니다.


 기능을 다 만들고 나서 찍은 스샷이라 버튼들이 좀 많네요. 실행했을 때 화면입니다.

 OpenSession 을 눌렀을 때 앱은 백그라운드 처리되고 사파리가 호출된 화면입니다. 확인을 누르면 AppController.mm 에서 수정했던 부분이 호출이 되면서 유니티3D에 세션 오픈 사실을 알릴수 있습니다.

 다음에는 위 iOSFacebookPlugin.mm 파일과 iOSManager 컴포넌트를 기반으로 페이스북 자신의 정보를 가져오거나 자신의 담벼락에 글 게시하는 것을 정리해보겠습니다.

댓글

이 블로그의 인기 게시물

CMake Windows에 설치하기

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

크로스 스레드 작업이 잘못되었습니다. xxx 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다