Unity3D Facebook SDK for iOS Integration 3. 담벼락게시 및 자신의 정보 얻기

 유니티3D iOS 페이스북 로그인 및 로그아웃 처리를 정리해봤습니다. 이번에는 자신의 담벼락에 글 게시 및 자신의 정보를 가져오는 것을 정리해보겠습니다.

 먼저 iOS 플러그인 소스입니다.


//iOSFacebookPlugin.h

- (void) postToMeWall:(NSString*)strPostMsg;
- (void) requestMe;



//iOSFacebookPlugin.mm

// iOS의 최상단 GLViewController을 얻기위해
extern UIViewController* UnityGetGLViewController();


extern "C"
{
...
    void iOSPostToMeWall(const char* pszPostMsg)
    {
        NSString* strPostMsg = [NSString stringWithUTF8String:pszPostMsg];
        [[iOSFacebookPlugin sharediOSFacebookPlugin] postToMeWall:strPostMsg];
        
    }
    
    void iOSRequestMe()
    {
        [[iOSFacebookPlugin sharediOSFacebookPlugin] requestMe];
    }
    }

}



@implementation iOSFacebookPlugin
...

- (void) postToMeWall:(NSString*)strPostMsg
{   
    NSURL *urlToShare = [NSURL URLWithString:@"http://westwoodforever.blogspot.com"];
    
    // If it is available, we will first try to post using the share dialog in the Facebook app
    FBAppCall *appCall = [FBDialogs presentShareDialogWithLink:urlToShare
                                                          name:@"Hello Facebook"
                                                       caption:strPostMsg
                                                   description:@"The 'Unity3D iOS Facebook' sample application showcases simple Facebook integration."
                                                       picture:nil
                                                   clientState:nil
                                                       handler:^(FBAppCall *call, NSDictionary *results, NSError *error) {
                                                           if (error) {
                                                               NSLog(@"Error: %@", error.description);
                                                           } else {
                                                               NSLog(@"Success!");
                                                           }
                                                       }];
    
    if (!appCall) {
        UIViewController* pRootViewController = UnityGetGLViewController();
        
        // Next try to post using Facebook's iOS6 integration
        BOOL displayedNativeDialog = [FBDialogs
            presentOSIntegratedShareDialogModallyFrom:pRootViewController
            initialText:strPostMsg
            image:nil
            url:urlToShare
            handler:nil];
        
        if (!displayedNativeDialog) {
            // Lastly, fall back on a request for permissions and a direct post using the Graph API
            [self performPublishAction:^{
                NSString *message = strPostMsg;
                
                FBRequestConnection *connection = [[FBRequestConnection alloc] init];
                
                connection.errorBehavior = (FBRequestConnectionErrorBehavior)(FBRequestConnectionErrorBehaviorReconnectSession
                    | FBRequestConnectionErrorBehaviorAlertUser
                    | FBRequestConnectionErrorBehaviorRetry);
                
                [connection addRequest:[FBRequest requestForPostStatusUpdate:message]
                     completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                         if(error)
                         {
                             NSLog(@"iOSFacebookPlugin::postToMeWall Faile");
                         }
                         else
                         {
                             NSLog(@"iOSFacebookPlugin::postToMeWall Success");
                         }
                     }];
                [connection start];
            }];
        }
    }
}

// Convenience method to perform some action that requires the "publish_actions" permissions.
- (void) performPublishAction:(void (^)(void)) action {
    // we defer request for permission to post to the moment of post, then we check for the permission
    if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound) {
        // if we don't already have the permission, then we request it now
        [FBSession.activeSession requestNewPublishPermissions:@[@"publish_actions"]
            defaultAudience:FBSessionDefaultAudienceFriends
            completionHandler:^(FBSession *session, NSError *error) {
                if (!error) {
                    action();
                } else if (error.fberrorCategory != FBErrorCategoryUserCancelled){
                    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Permission denied"
                        message:@"Unable to get permission to post"
                        delegate:nil
                        cancelButtonTitle:@"OK"
                        otherButtonTitles:nil];
                        [alertView show];
                }
            }];
    } else {
        action();
    }
}

- (void) requestMe
{
    if (FBSession.activeSession.isOpen) {
        [[FBRequest requestForMe] startWithCompletionHandler:
         ^(FBRequestConnection *connection,
           NSDictionary<FBGraphUser> *user,
           NSError *error) {
             if (!error) {
                 //NSLog(@"My Name %@ FBId %@", user.name, user.id);

                 NSLog(@"My Name %@ FBId %@", user.name, [user objectForKey:@"id"]);
                 
                 SBJsonWriter* jsonWriter = [[SBJsonWriter alloc] init];
                 NSMutableDictionary* dicMy = [[NSMutableDictionary alloc] init];
                 //[dicMy setValue: user.id forKey: @"FacebookId"];

                 [dicMy setValue: [user objectForKey:@"id"] forKey: @"FacebookId"];
                 [dicMy setValue: user.name forKey: @"Name"];
                 
                 NSString* jsonString = [jsonWriter stringWithObject:dicMy];
                 UnitySendMessage("iOSManager", "ResultMe", [jsonString UTF8String]);
                 
                 [dicMy release];
                 [jsonWriter release];
             }
         }];
    }

}

@end

 자신의 담벼락에 게시하는 것은 총 3가지로 처리하고 있습니다. 페이스북 앱을 통해서 시도 후 실패시 iOS에 통합된 페이스북으로 시도하고 마지막으로 직접 Graph API를 통해 시도하고 있습니다.

 2번째 방법인 iOS에 통합된 페이스북을 가지고 처리할 때는 유니티3D에서 iOS RootViewController을 가져오기 위한 추가 처리가 필요합니다.

 마지막으로 자신의 정보를 얻어온 후 SBJson을 활용해서 페이스북 id와 이름을 유니티3D에 넘겨줬습니다.


[DllImport("__Internal")]
private static extern void iOSPostToMeWall(string strMsg);
[DllImport("__Internal")]
private static extern void iOSRequestMe();


public void PostToMeWall(string strMsg)
{
iOSPostToMeWall(strMsg);
}

public void RequestMe()
{
iOSRequestMe();
}

public void ResultMe(string strResult)
{
JsonData jData = JsonMapper.ToObject(strResult);
string strFacebookId = jData["FacebookId"].ToString();
string strFacebookName = jData["Name"].ToString();
SetLog("Me id " + strFacebookId + " Name " + strFacebookName);
}

 iOSManager 컴퍼넌트 부분입니다. 유니티3D로 넘어온 자신의 정보는 LitJson 으로 처리했습니다.

 제 정보를 로그로 출력해본 화면입니다.

 이건 간단히 TextField 값을 담벼락에 게시한 결과구요.

 다음에는 친구 목록 얻기와 친구에게 초대 요청하기를 정리하겠습니다.

댓글

이 블로그의 인기 게시물

CMake Windows에 설치하기

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

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