11월, 2012의 게시물 표시

Xcode Debug/Release 별로 Static Lib Link 설정하기

이미지
 iOS로 개발하다보면서 궁금했던게 있었습니다.  iOS Device와 Simulator용 Debug Universal Static Lib 와  배포용인 Release(Archive) Static Lib 를 사용하면서 개발하다가 스토어에 배포하기위해서는 만든 static lib를 그때그때 교체해줘야 하는 불편사항이 있었습니다. 이 내용은 Universal Static Lib를 만들때도 이미 불만을 토로했던 내용이죠. 디바이스용과 시뮬레이터용 Debug static lib를 빌드때마다 교체해줘야 한다는 문제가 있어서 Universal Static Lib를 만든것이죠. 이에 대한 해결을 정리해보겠습니다.  해결하기에 앞서 기존 Project Navigator의 Frameworks나 Build Phases -> Link Binary With Libraries에 추가했던 static lib는 삭제하시기 바랍니다.  먼저 제가 만든 Framework의 플랫폼별 static lib 디렉토리 구조입니다. 스샷에서 선택되어진 libFramework.a는 배포용이고 libFrameworkUniversal.a는 개발용 Debug static lib입니다.  첫번째 해결책으로는 Tapjoy를 연동할 때 나왔던 Link에러 내용 에 있는 -force_load 를 사용하는 것입니다. Debug -force_load  "$(SRCROOT)/../Libs/Framework/ios/ libFrameworkUniversal.a " Release -force_load  "$(SRCROOT)/../Libs/Framework/ios/ libFramework.a "  이렇게 lib가 있는 위치와 파일을 빌드 설정별로 지정해줘서 해주면 됩니다.  두번째로 -force_load 없이 그 뒤에 내용만으로도 가능하더군요. Debug "$(SRCROOT)/../Libs/Framework/ios/libFrameworkUniv

Nexus S 젤리빈 업데이트 후 MMS 수신이 안된다면

이미지
 넥서스S를 사용중에 있습니다. 젤리빈 업데이트를 하고 나서부터 MMS가 오면 계속 다운로드중... 으로만 표시되고 다운이 되질 않아 확인이 안되더군요. 항상 3G를 켜놓으시는 분들은 괜찮을 듯 싶은데 저는 와이브로 에그가 있어서 필요할 때만 3G를 사용하는지라 이런 버그가 있는 듯 하네요. 아래와 같이 해결하면 됩니다.  먼저 메시지를 실행해서 메뉴버튼을 눌러 설정을 선택합니다.  설정에서 밑으로 스크롤 해보면 자동 수신이 체크 되어있을텐데, 이것을 체크해제합니다.  이제 MMS 메세지를 확인하면 자동으로 다운로드 되지않고 다운로드 버튼이 생겨있습니다. 이걸 누르면 정상적으로 수신이 됩니다. 물론 그전에 3G가 켜져있어야겠지요.

iOS6에서 openURL로 facebook 링크 열기

 지난 포스팅에서 iOS Native App에서 URL로 웹 링크를 사파리를 통해 열수 있는 것 을 정리했었습니다. 근데 이게 최신 iOS 6.x에서는 문제가 발생하더군요. iOS 6.x에서는 페이스북이 iOS에 통합이 되면서 생긴 문제인데 증상은 그 어떤 링크를 줘도 자신의 페이스북 페이지가 열린다는 것이죠.  원하는 페이스북 페이지를 사파리로 열려면 페이스북 문자열 주소대신에 숫자로된 유니크한 id로 해주면 됩니다. 특정 페이스북 페이지의 id를 알아낼려면 http://graph.facebook.com/myfacebookurl 이런식으로 myfacebookurl에 알고싶은 페이스북 주소를 넣어주시면 { "id": "xxxxxxxxxxxxxxxxxxxx", "name": "xxxx xxx xxx", "first_name": "xxxx xxx", "last_name": "xxx", "link": "http://www.facebook.com/xxxxxxxxxxx", "username": "xxxxxxxxxxx", "gender": "male", "locale": "ko_KR" }  이런식으로 정보가 나옵니다. 여기서 "id" 값에 있는 숫자로 처리하면 되는것이죠. NSURL* url = [[NSURL alloc] initWithString:@"http://www.facebook.com/1234567890"]; [[UIApplication sharedApplication] openURL:url];  그러면 iOS 6.x에서도 잘 되고, 그 이하 iOS에서도 잘 됩니다.  이런걸

저는 악성코드를 유포하지 않습니다.

이미지
 현재 http://westwoodforever.blogspot.com  이렇게 com으로 접속을 하면 제 블로그에 악성코드가 있다고 합니다. 고급을 눌러 이 웹사이트 관련 문제점 세부사항을 보시면,  중간에 aladin.co.kr이 제 블로그 방문자에게 멀웨어를 배포하는 중개 역할을 하고 있다고 하네요.  아니나 다를까 알라딘으로부터 메일이 왔습니다. 현재는 악성코드가 제거되었다고는 하지만 구글측에서 경고 해제가 반영되는데 시간이 걸린다고 하네요. 그래서 일단 임시조치로 알라딘의 TTB2 코드를 삭제했는데도 여전히 com으로 접속시 악성코드라고 나오네요.  http://westwoodforever.blogspot.kr/ 로 접속해주시기 바랍니다. 여기는 아무이상이 없네요.  알라딘에서는 보상으로 30원....이 들어왔네요.  제 블로그 일 평균 페이지뷰는 1/3로 확 줄은거 같은데 ㅜ.ㅜ

cocos2d-x iOS Flurry Analytics 연동하기

이미지
 개발한 App의 통계자료를 간단하게 얻을 수 있는  Flurry (플러리)라는 솔루션이 있습니다. cocos2d-x와의 연동을 정리해봅니다. 저는 회사 계정으로 진행하므로 이미 가입이 되어있다고 가정합니다.   Flurry 개발자 사이트 에 로그인을 한 뒤 Manage Applications에 Add a New Application을 클릭합니다.  플랫폼을 선택합니다. iPhone, iPad, Android, Windows Phone7, Java ME, BlackBerry를 지원하는데, iOS 연동을 진행하므로 iPhone를 선택합니다.  App의 이름과 Categories를 선택 후 Create App을 클릭합니다.  App 추가가 완료되었습니다. App의 Unique Key는 연동시 필요합니다. 이제 SDK 연동을 살펴보겠습니다. Flurry SDK 4.0.6을 다운로드합니다.  원하시는 디렉토리에 압축을 해제하면 위와 같이 나옵니다. 이번 연동에서 필요한 Analytics부분은 Flurry 디렉토리에 있습니다. libFlurry.a를 개발중인 프로젝트에 드래그&드롭 해서 추가합니다. 특이한건 ProjectApiKey.txt에 App의 이름과 키값이 저장되어 있네요.  Flurry.h파일이 있는 곳을 Header Search Paths에 추가해줍니다. //AppController.mm ///< 임포트 추가 #import "Flurry.h" - ( BOOL )application:( UIApplication *)application didFinishLaunchingWithOptions:( NSDictionary *)launchOptions { ....      ///< Flurry 섹션을 시작합니다. 인자로 App의 유니크 키     [ Flurry startSession : @"xxxxxxxxxxxxxxxxxxxxxx"

cocos2d-x iOS Sign in to Game Center 창이 안뜨는 현상

이미지
 iOS Game Center를 작업하다가 보면 위와 같이 사용자가 게임 센터에 로그인하지 않은 상태에서 게임을 실행하면 Sign in to Game Center Use Existing Account Create New Account Cancel  다이얼로그 창이 뜨게됩니다. 이때 Cancel을 누르고 나서 앱을 다시 실행하거나 하면 이 창이 아예 안 뜨는 증상이 있습니다. else if ( error != nil ) {         CCLOG ( "GameCenter Error %s %d" , [[error domain ] UTF8String ], [error code ]); }  이런식으로 로그를 찍었을 때 Cocos2d: GameCenter Error GKErrorDomain 2  위와 같은 에러 로그가 남습니다. 애플 개발자 센터 를 보면, GKErrorCancelled = 2, GKErrorCancelled The requested operation was canceled. Available in iOS 4.1 and later.  이런 에러 코드입니다.  구글링을 해보니 Cancel을 3번 했을 때 그 이후부터 다이얼로그가 안나온다고 하네요. 이는 애플 개발자 센터에도 없는 내용이라고 합니다. 뭐 예전 글들이라 지금은 업데이트 되었을 수도 있겠죠. 해결방법은 사용자에게 메세지를 띄워 게임센터 전용 앱에서 직접 로그인을 하도록 유도하는 것이겠죠.  개발자가 직접 메세지를 안 띄워줘도 3번째 Cancel일 때는 알아서 뜨게 됩니다. Game Center Disabled Sign in with the Game Center application to enable.  이런 창이 뜨죠. 친절하게 게임 센터 앱으로 로그인을 해서 활성화를 하라고 하네요. iOS 버전마다 다이얼로그가 조금 다를 듯합니다. 저는 일단 5.1이구요. 6.x에서는 Disab

iOS libsystem_kernel.dylib`__pthread_kill 의 또다른 문제

이미지
  지난번에도 같은 에러로 포스팅 을 한적이 있습니다. 차이점은 로그인데요, Couldn't register com.xxxxxx.xxxxxxxxxx with the bootstrap server. Error: unknown error code. This generally means that another instance of this process was already running or is hung in the debugger. (lldb)   위와 같은 로그가 있더군요. 뭐가 되었든 해결책은 테스트 중인 디바이스를 재부팅 후 하니 잘 되는군요.

cocos2d-x iOS Tapjoy SDK 각종 광고 및 탭조이 마켓플레이스 연동

이미지
  탭조이 Connect까지 연동 을 했다면 이제 탭조이에서 지원하는 여러 광고기능을 연동해야합니다. 풀스크린 광고, 배너 광고, 탭조이 마켓플레이스, 동영상 광고가 있습니다.  먼저 Tapjoy.h 와 Tapjoy.mm 을 추가하시고 아래 나오는 소스를 확인하시면 되겠습니다. 샘플 수준이라 전부 + 함수로 만들었네요. 설명은 간단하게 주석으로 대체하겠습니다. ///< 기본적인 Tapjoy.h, mm 파일 내용. 추가 사항은 아래에서 #import "TapjoyConnect.h" @interface Tapjoy : NSObject < ///< 배너 광고에 쓰이는 딜리게이트 TJCAdDelegate , ///< 동영상 캐쉬에 쓰이는 딜리게이트 TJCVideoAdDelegate > @end ///< mm #import "Tapjoy.h" #import "EAGLView.h" @implementation Tapjoy @end 피처드 앱(Fullscreen Ads) ///< h 에 추가 + ( void ) showFullScreenAd; + ( void ) getFullScreenAd:( NSNotification *)notifyObj; + ( void ) fullscreenAdClosed:( NSNotification *)notifyObj; ///< mm + ( void ) showFullScreenAd {     ///< 탭조이 서버에 풀스크린 광고 요청     [ TapjoyConnect getFullScreenAd ];          ///< FullScreen 광고 통지     [[ NSNotificationCenter defaultCenter ] addObserver : self

UIViewController(RootViewController) 가져오기

 개발을 하다보니 UIViewController 객체인 Root ViewController를 여기저기서 필요로 할 때가 있네요. 특히나 외부 SDK를 연동할 때 말이죠. 일반 iOS App을 개발할 때는 UIViewController * pRootViewController = (UIViewController*)[[[[[UIApplication sharedApplication] keyWindow] subviews] objectAtIndex: 0 ] nextResponder];  이렇게 하시면 됩니다. cocos2d-x iOS에서는 위에것도 되고 UIViewController * pRootViewController = (UIViewController*)[[[[[EAGLView sharedEGLView] window] subviews]objectAtIndex: 0 ] nextResponder];  이것도 가능합니다.

Objective-C Expression is not assignable 에러

이미지
 위 스샷과 같이 UIView 객체에 있는 frame이라는 놈의 x값을 변경해주려고 했는데 Expression is not assignable를 뿜어내는군요. 저야 오브젝티브-C 기초가 없다보니 이런것도 정리를 해봅니다. pView. frame = CGRectMake ( 100 , 50 , 320 , 50 );  해결은 이런식이든 임시 변수 만들어 그 변수를 대입하든 프로퍼티와 같은 형의 새로운 변수를 만들어서 프로퍼티에 대입을 해줘야하네요. @property ( nonatomic ) CGRect             frame;  frame은 이렇게 CGRect형 프로퍼티인데요, 프로퍼티만 기본적으로 이런 제한?이 있는 듯 싶네요. readwrite, readonly, assign, copy 등의 속성을 부여할 수 있는 듯한데 아마 이것과 관련이 있을 듯 싶어요. 뭐 더 자세히 파보진 않아서.... 뭐 언젠가는 알게되겠죠? float xTest = pView. frame . origin . x ;  반대로 값을 참고하는 것은 잘 되네요.

cocos2d-x iOS Tapjoy 연동 - Tapjoy Connect

이미지
  탭조이 계정 생성 및 App을 추가 했다면, 광고 기능을 넣기전에 간단하게 탭조이 SDK연동 시작이라고 할 수 있는 탭조이 Connect부분을 cocos2d-x 개발 프로젝트에 연동하는 것을 정리해보겠습니다. 먼저  탭조이 SDK 사이트 에서 최신버전을 다운로드 받아 압축을 해제합니다. v9.0.0이 현재 최신이네요. 참고로 without UDID 버전 SDK로 진행합니다.  압축을 해제하면 위와같은 디렉토리 구조로 되어있습니다. TapjoyPublisherLibrary를 개발중인 프로젝트의 Frameworks폴더에 드래그&드롭 해줍니다. 또는 Frameworks 마우스 우클릭 -> Add Files to xxxx 를 눌러 해당 디렉토리를 선택해줍니다. 나머지 TJ Multiple Currencies, TJ Publisher 2개는 SDK 연동 샘플입니다.  추가 된 모습입니다.  Frameworks를 몇가지 추가해야합니다. Project -> TARGETS -> Build Phases -> Link Binary With Libraries에서 + 를 클릭해서 아래 목록 중 없는 것들을 추가해줍니다. Foundation.framework UIKit.framework CoreGraphics.framework SystemConfiguration.framework CoreTelephony.framework - iOS 3.0 호환을 위한 것으로 링크를 Optional로 한다. MediaPlayer.framework AdSupport.framework - iOS6 용. Xcode 4.5이상이면 링크를 Optional로 한다.  스샷과 같이 CoreTelephony.framework는 Target Membership 또는 Build Phases에서 Optional로 선택해줍니다.  Build Settings -> Other Linker Flags에 -all_load와 -ObjC 를

Xcode Link Error : duplicate symbol _main in xxxx.a and xxxx for architecture armv7

이미지
duplicate symbol _main in xxxxxxxxxxx/libcurl.a(main.o) and Objects-normal/armv7/main.o for architecture armv7  위와 같은 로그와 함께 Xcode에서 링크에러가 발생하네요.  Tapjoy SDK를 개발 테스트 중인 cocos2d-x 기반 게임에 붙이는 중 기존에 추가했던 libcurl.a와 뭔가 같은 심볼이 있어서 난듯합니다.  SDK 가이드에 나온 것처럼 Other Linker Flags에 -all_load로 해서 작업을 했었는데, 이것 말고 대체할 방법으로 -force_load "$(SRCROOT)/../ExtLib/ios/TapjoyPublisherSDK_iOS_v9.0.0_UDIDOptOut/TapjoyPublisherLibrary/TapjoyPublisherLibrary.a"  이렇게 -force_load를 쓰라고 가이드에 되어있더군요. 이렇게 했더니 말끔히 빌드 완료했습니다.  그런데 이상하게 한번 빌드 성공 후엔 -all_load든 -force_load든간에 아무것도 안해줘도 빌드 성공하고 있다는게 함정...  참고 stackoverflow xcode duplicate symbol _main

Eclipse Create Android Application Project - Hello World

이미지
  이클립스로 Hello World 자바 프로젝트 를 만들어 봤었습니다. 이번에는 안드로이드 프로젝트를 만들어 보겠습니다.  File -> New -> Android Application Project를 선택합니다.  생성할 안드로이드 프로젝트에 대한 기본 설정 창입니다. Application Name - 어플리케이션 이름 Project Name - 프로젝트 이름 Package Name - 팩키지 이름 Build SDK - 개발에 사용할 SDK 버전 Minimum Required SDK - 실행에 필요한 최소 SDK 레벨 Create custom launcher icon - 아이콘 제작 툴로 어플리케이션 아이콘을 만든다 Mark this project as a library - 해당 프로젝트를 library 프로젝트로 지정 Create Project in Workspace - 워크스페이스안에 프로젝트를 만든다  어플리케이션의 아이콘을 만드는 화면입니다. 이미지를 선택하거나 기본적으로 제공되는 클립아트등을 사용할 수 있습니다. 오른쪽에 Preview를 통해서 확인해가면서 만들면 되겠습니다.  액티비티 생성 화면입니다. 일반적으로 BlankActivity를 선택하면됩니다. MasterDetailFlow템플릿은 위에 설명에도 있듯이 minimum SDK 11을 요구합니다. 즉, 허니컴이상에서 쓰는 테블릿용 템플릿입니다.  액티비티와 레이아웃 이름과 네비게이션 타입등을 설정합니다. 네비게이션 타입에는 Tabs, Tabs + Swipe, Swipe Views + Title Strip, Dropdown이 있지만 최소 SDK 14를 요구합니다. Finish를 눌러 생성 완료합니다.  안드로이드 Hello World 프로젝트가 만들어졌습니다. 다음에는 마지막으로 안드로이드 Lib 프로젝트를 만들어 JAR로 공유 하는 것을 정리해보겠습니다.

Tapjoy 개발자 계정 생성 및 App 추가하기

이미지
  Tapjoy 대쉬보드의 등록 사이트 에 가서 필요한 정보를 기입하고 Create Account를 누르면 가입이 완료됩니다.  계정을 만든 후 로그인을 한 후 대쉬보드의 Apps탭에서 등록할 App의 정보를 기입 후 Add App을 눌러 추가합니다.  App이 등록되었습니다.  Details정보에서 App ID와 App Secret Key부분은 추후 개발중인 App에 Tapjoy를 연동 할 때 필요한 것입니다.

Eclipse Create Java JAR Lib - HelloWorld.jar

이미지
  지난 포스팅에서 이클립스에서 간단하게 자바 프로젝트 를 만들었습니다. 이번에는 해당 프로젝트를 다른 자바나 안드로이드 프로젝트에서 사용할 수 있는 Jar 라이브러리로 간단하게 만들어보겠습니다.  만들었던 HelloWorld class위에 적절한 이름으로 package를 추가해줍니다. 그러면 Package Explorer에 해당 프로젝트의 src 밑에 package가 추가되면서 그 밑으로 java파일이 들어갑니다.  public static void main 함수는 없애버리시고 showHelloWorld를 int형 2개 인자를 받아 합을 리턴하게 만들어줍니다.  Jar로 만들 프로젝트를 마우스 우클릭 -> Export -> Java -> JAR file을 선택합니다.  JAR file에서 Browse를 눌러 jar 파일이 생성 될 위치를 정해줍니다.  Next를 클릭합니다.  Finish를 눌러 jar 파일을 생성합니다.  이제 생성 된 jar 파일을 다른 개발중인 자바나 안드로이드 실행 프로젝트에 추가 해야 합니다. 예전에 정리해 놓은것이 있으니 링크를 참고하세요. import com.framework.HelloWorld; ///< 적절한 곳에 추가 HelloWorld htest = new HelloWorld(); int result = htest.showHelloWorld( 1, 2 ); Log.d("HelloWorld", String.valueOf(result));  이제 위와같이 코드를 입력하신 후 실행하시면 잘 작동되는 것을 볼 수 있습니다.