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 컴포넌트를 기반으로 페이스북 자신의 정보를 가져오거나 자신의 담벼락에 글 게시하는 것을 정리해보겠습니다.
//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 컴포넌트를 기반으로 페이스북 자신의 정보를 가져오거나 자신의 담벼락에 글 게시하는 것을 정리해보겠습니다.
댓글
댓글 쓰기