Unity3D iOS용 JSON Lib SBJson for Objective-C

 유니티3D 안드로이드 플러그인들 작업에이어 요즘은 iOS 플러그인 작업에 열중하고 있습니다. 그중에서 페이스북 연동하는데 있어 iOS딴 오브젝트-C용 JSON 라이브러리가 필요하게 되었습니다.

 리서치를 해보니 TouchJSON 이나 JSONKit 또는 SBJson등이 있더군요. 이번 포스팅에서는 이 JSON 라이브러리중에서 SBJson을 유니티3D에 적용해 보는것을 정리하겠습니다.

 물론 SBJson을 사용하지 않고 애플에서 iOS 5.x부터 추가한 NSJSONSerialization을 사용해도 되겠지만 5.x 이하의 iOS도 지원해주려면 이런 외부 라이브러리를 써야하는게 답인듯 합니다.


1. 설치
 SBJson의 GitHub에가서 현재 최신 버전인 3.2.0을 다운로드 후 적절한 곳에 압축해제합니다.


2. 유니티3D iOS 플러그인 프로젝트에 SBJson 적용

 압축 해제후 모습입니다. 여기서 Classes안에 있는 SBJson h파일과 m 소스 파일들을 유니티3D iOS 플러그인 디렉터리에 복사합니다.

 파일을 복사했습니다. 이제 빌드해보면,

 이렇게 iOS 프로젝트의 Libraries 폴더에 SBJson의 소스파일이 프로젝트 네비게이터에 추가된 것을 확인할 수 있습니다. m 파일만 복사된 것 같지만,

  실제 폴더에는 h 파일도 복사되어 있습니다.

 유니티3D를 기반으로 설명하고 있지만 일반 iOS Xcode 프로젝트에서도 프로젝트 네비게이터에 SBJson 파일들을 추가해주시면 됩니다.

 이제 빌드를 해보면 Libraries/NSObject+SBJson.m:31:2: "This source file must be compiled with ARC enabled!" 에러가 발생할텐데요, 유니티3D가 자동 생성한 iOS 프로젝트는 ARC를 지원하지 않아서 생긴 에러입니다. 링크를 확인하시어 해결하시기 바랍니다.


- (void) requestFriendsInfo
{
    if (FBSession.activeSession.isOpen) {
        [[FBRequest requestForMyFriends] startWithCompletionHandler:
         ^(FBRequestConnection *connection,
           NSDictionary* result,
           NSError *error) {
             if (!error) {
                 NSArray* friends = [result objectForKey:@"data"];
                 SBJsonWriter* jsonWriter = [[SBJsonWriter alloc] init];
                 
                 NSMutableArray* jsonArray = [[NSMutableArray alloc] init];
                 for(NSDictionary<FBGraphUser>* user in friends) {
                     NSMutableDictionary* dicFriend = [[NSMutableDictionary alloc] init];
                     [dicFriend setValue: user.id forKey: @"FacebookId"];
                     [dicFriend setValue: user.name forKey: @"Name"];
                     [jsonArray addObject: dicFriend];
                 }
                 
                 NSString* jsonString = [jsonWriter stringWithObject:jsonArray];
                 NSLog(@"%@", jsonString);
                 //UnitySendMessage("iOSManager", "ResultFriendsInfo",jsonString);
                 UnitySendMessage("iOSManager", "ResultFriendsInfo", [jsonString UTF8String]);
                 [jsonArray release];
                 [jsonWriter release];
             }
        }];
    }

}

 나중에 따로 정리하겠지만 일단 이건 페이스북 친구 리스트를 얻어와 처리하기 위해 SBJson을 사용한 iOS 플러그인 부분입니다.

 public void ResultFriendsInfo(string jsonFriends)
 {
  JsonData jData = JsonMapper.ToObject(jsonFriends);
  for (int i = 0 ; i < jData.Count ; i++)
  {
   string strFacebookId = jData[i]["FacebookId"].ToString();
   string strFacebookName = jData[i]["Name"].ToString();
   Debug.Log("Friend id " + strFacebookId + " Name " + strFacebookName);
   this.dicFriends.Add(strFacebookId, strFacebookName);
  }
  SetLog("Friend Count = " + this.dicFriends.Count.ToString());
 }


 유니티3D C# 부분에서는 LitJson으로 받아 처리하면 되겠습니다.


3. SBJson lib로 빌드해서 적용

 SBJson 프로젝트 속성과 코드는 이미 ARC에 맞게 되어 있기 때문에 소스로 적용하지 않고 Lib로 빌드해서 사용하면 위와 같은 ARC 문제는 발생하지 않습니다. 또한 유니티3D에서 빌드할 때마다 xcode에서 -fobjc-arc 옵션을 계속 줘야하는 번거러움도 있기 때문에 꼭 라이브러리로 빌드해서 사용할 것을 추천 드립니다.

 SBJson 압축해제한 곳에 있는 SBJson.xcodeproj 파일을 열어 그림과 같이 sbjson-ios 디바이스용으로 빌드합니다.

 파인더에서 command + shift + g를 눌러 ~/Library/Developer/Xcode/DerivedData 로 이동 후 위 그림과 같이 sbjson 빌드 디렉터리 내부로 쭉 이동합니다. 그러면 안에 빌드한 라이브러리와 h 파일이 있습니다.

 libsbjson-ios.a와 h 파일을 유니티3D iOS 플러그인 폴더에 위와 같이 복사해줍니다. 기존에 복사했던 SBJson 소스 파일은 삭제합니다.

 이제 유니티에서 빌드하고 생성된 iOS Xcode 프로젝트를 보면 아까와는 다르게 라이브러리로 추가된 것을 확인할 수 있고 arc 활성화 오류도 발생하지 않습니다.

SBJson Reference

이 블로그의 인기 게시물

CMake Windows에 설치하기

Unity3D iOS Plugin 만들어 연동하기

Unity3D 안드로이드 Keystore 생성하기