반응형
XCode에서 Archives Build 후 Binary Upload시 no suitable application records were found 에러가 발생했습니다. 이미 App을 등록을 해봤던터라 갑자기 나타난 이 에러는 절 당황스럽게 했는데요, 원인은 포스팅 예정에 있는 In App Purchase 때문인지 아니면 제가 강제로 Reject을 해서인지 확실치 않네요.
해결책은 간단합니다. Prepare for Upload 단계에서 Waiting for Upload 단계의 과정을 진행하시면 됩니다. 자세한 내용은 링크의 하단부를 확인하시면 됩니다.
해결책은 간단합니다. Prepare for Upload 단계에서 Waiting for Upload 단계의 과정을 진행하시면 됩니다. 자세한 내용은 링크의 하단부를 확인하시면 됩니다.
2012년 10월 29일 월요일
App Store에 App 등록해보자. 2 - Waiting for Upload ~ Waiting for Review 단계
iTunes Connect에 App의 정보를 올렸다면 이제는 실제로 제작된 App의 Binary를 올려야합니다. 올리기 이전에 먼저 Archives로 Build해서 Binary를 생성해야겠죠.
Project Navigator -> Project -> Build Settings -> Code Signing의 Release를 iPhone Distribution으로 선택합니다.
이런 에러 로그와 함께 Build가 실패한다면 Distribution Provisioning Profile에 문제가 있는 것인데 제 경우는 아예 프로파일을 등록하지 않고 작업을 해서 생긴 문제였습니다. 등록과정은 링크를 확인하시기 바랍니다.
Build가 성공하면 자동으로 Organizer이 실행이 되고 Archives에 Build한 App이 추가되어 있습니다. 다음으로 유효한 App Binary인지 확인을 위해 Validate를 클릭합니다.
개발자 계정으로 먼저 로그인을 합니다.
개발중인 App중에 Waiting for Upload 중인 것들이 Application의 콤보박스에 있습니다. 이중에서 현재 Upload할 App을 선택합니다.
아무문제가 없다면 Validation Succeeded가 됩니다. 만약,
warning: iPad: Icon.png: icon dimensions (57 x 57) don't meet the size requirements. The icon file must be 72x72 pixels, in .png format (-19014)
warning: iPhone/iPod Touch: Icon.png: icon dimensions (72 x 72) don't meet the size requirements. The icon file must be 57x57 pixels, in .png format (-19014)
위와같은 에러가 난다면 따로 정리를 했으니 링크를 참고하시기 바랍니다.
이제 최종적으로 App Store에 Binary를 업로드 하기위해 Distribute을 클릭하면, 위와같이 Distribution 타입이 3개 나옵니다.
이제 iTunes Connect에 접속해 Manage Your Apps에서 올린 App을 확인해 보면 처음에는 Upload Received였다가 곧 위와같이 Waiting For Review 상태로 전환되는 것을 확인할 수 있습니다.
이제 남은것은 Apple에서 Review 후 승인이 떨어지기만을 기다라시면 됩니다. 보통 1주에서 늦어도 2주면 결과가 나온면 Ready for Sale 상태가됩니다. 물론 Reject이 안된다면 말이죠.
Project Navigator -> Project -> Build Settings -> Code Signing의 Release를 iPhone Distribution으로 선택합니다.
이제 Scheme를 Device로 선택하신 후 Product -> Archive를 선택해서 Build합니다. 만약
No unexpired provisioning profiles found that contain any of the keychain's signing certificates
The identity 'iPhone Distribution' doesn't match any valid, non-expired certificate/private key pair in the default keychain
Build가 성공하면 자동으로 Organizer이 실행이 되고 Archives에 Build한 App이 추가되어 있습니다. 다음으로 유효한 App Binary인지 확인을 위해 Validate를 클릭합니다.
개발자 계정으로 먼저 로그인을 합니다.
개발중인 App중에 Waiting for Upload 중인 것들이 Application의 콤보박스에 있습니다. 이중에서 현재 Upload할 App을 선택합니다.
아무문제가 없다면 Validation Succeeded가 됩니다. 만약,
warning: iPad: Icon.png: icon dimensions (57 x 57) don't meet the size requirements. The icon file must be 72x72 pixels, in .png format (-19014)
warning: iPhone/iPod Touch: Icon.png: icon dimensions (72 x 72) don't meet the size requirements. The icon file must be 57x57 pixels, in .png format (-19014)
위와같은 에러가 난다면 따로 정리를 했으니 링크를 참고하시기 바랍니다.
이제 최종적으로 App Store에 Binary를 업로드 하기위해 Distribute을 클릭하면, 위와같이 Distribution 타입이 3개 나옵니다.
- Submit to the iOS App Store - 디폴트 선택사항으로 iOS App Store에 submit한다.
- Save for Enterprise or Ad-Hoc Deployment - 원격에 있는 사용자에게 웹서버를 통해 App을 배포하도록 하려면 선택한다. 보통 QA를 목적으로 쓰는 듯.
- Export as Xcode Archive - 팀원들에게 배포하려면 선택한다.
자세한 설명은 애플 개발자 센터 Distributing Your iOS App을 참고하시기 바랍니다. 일단 App Store에 직접 올릴 것이라 첫번째 것을 선택합니다.
다시한번 Validate를 클릭했을 때 처럼 Login과 App 선택 과정을 거친면 App이 Uploading됩니다.
잠시 후, Submission Succeeded창이 뜨면서 App Sotre에 업로드 완료됩니다. Organizer에서 상태를 확인해보면 Submitted라고 되어있으면 마무리된 것입니다.
이제 iTunes Connect에 접속해 Manage Your Apps에서 올린 App을 확인해 보면 처음에는 Upload Received였다가 곧 위와같이 Waiting For Review 상태로 전환되는 것을 확인할 수 있습니다.
이제 남은것은 Apple에서 Review 후 승인이 떨어지기만을 기다라시면 됩니다. 보통 1주에서 늦어도 2주면 결과가 나온면 Ready for Sale 상태가됩니다. 물론 Reject이 안된다면 말이죠.
iOS App을 App Store에 Binary 업로드 시 Validate 에러
warning: iPad: Icon.png: icon dimensions (57 x 57) don't meet the size requirements. The icon file must be 72x72 pixels, in .png format (-19014)
App Store에 앱을 업로드하기전에 제대로 된 놈인지 체크하기 위해 Validate를 하죠. 체크중에 위와 같은 에러로 Failed Validation하는 경우가 있습니다.
먼저 Info.plist에 Icon files와 실제 파일명이 같게 매치가 되는지 확인합니다. 사실 이부분은 cocos2d-x template가 자동으로 생성한 것이라 문제될 건 없는듯하네요.
다음으로 확인한게 실제 Icon.png 정보를 보니 57x57이더군요. 그래서 에러메세지대로 72x72로 확장해서 이미지를 넣고 Clean, Archive Build해서 Validate 체크해봤지만,
warning: iPhone/iPod Touch: Icon.png: icon dimensions (72 x 72) don't meet the size requirements. The icon file must be 57x57 pixels, in .png format (-19014)
이번엔 이런 다른 에러가 발생하더군요. 처음엔 iPad더니 이번엔 iPhone/iPod용 Icon.png가 말썽? 아니 Device는 다른데 Icon.png는 같은 걸 쓴다는건가? 뭐지이거?
아무튼 해결이 안되 더 검색해보니 Application Loader의 구버전 사용에 따른 버그 문제로 iTunes Connect에 접속해서 Manage Your Applications에서 Download Application Loader를 클릭해 최신버전을 받아 설치 후 App을 Clean, Archive해서 진행하면 해결이 된다고 했지만, 저는 해결이 안되더군요 ㅜ.ㅜ
구글링 끝에 애플 개발자 사이트 App Icons on IPad and iPhone에 대한 내용을 찾을 수 있었습니다. 문제시 되었던 57과 72 png파일을 보니 Icon.png는 57x57로 멀썽한데 Icon-72.png는
80x80이더군요. 스샷에도 있듯이 이놈이 iPad용인가본데 왜 아까 에러 메세지는 iPad용도 Icon.png로 나왔던거지? 아무튼 Icon-72.png를 72x72로 사이즈 줄이고 기존에 Icon.png는 원래 사이즈인 57x57로 원상복구시켜서 Clean, Archive Build한 후 다시 Validate 도전!
드디어 Validation 성공했습니다. Finish를 눌러 종료합니다. 결과는 cocos2d-x가 자동생성해주는 iPad용 Icon인 Icon-72.png 사이즈가 문제의 원인이었다는것!
App Store에 앱을 업로드하기전에 제대로 된 놈인지 체크하기 위해 Validate를 하죠. 체크중에 위와 같은 에러로 Failed Validation하는 경우가 있습니다.
먼저 Info.plist에 Icon files와 실제 파일명이 같게 매치가 되는지 확인합니다. 사실 이부분은 cocos2d-x template가 자동으로 생성한 것이라 문제될 건 없는듯하네요.
다음으로 확인한게 실제 Icon.png 정보를 보니 57x57이더군요. 그래서 에러메세지대로 72x72로 확장해서 이미지를 넣고 Clean, Archive Build해서 Validate 체크해봤지만,
warning: iPhone/iPod Touch: Icon.png: icon dimensions (72 x 72) don't meet the size requirements. The icon file must be 57x57 pixels, in .png format (-19014)
이번엔 이런 다른 에러가 발생하더군요. 처음엔 iPad더니 이번엔 iPhone/iPod용 Icon.png가 말썽? 아니 Device는 다른데 Icon.png는 같은 걸 쓴다는건가? 뭐지이거?
아무튼 해결이 안되 더 검색해보니 Application Loader의 구버전 사용에 따른 버그 문제로 iTunes Connect에 접속해서 Manage Your Applications에서 Download Application Loader를 클릭해 최신버전을 받아 설치 후 App을 Clean, Archive해서 진행하면 해결이 된다고 했지만, 저는 해결이 안되더군요 ㅜ.ㅜ
구글링 끝에 애플 개발자 사이트 App Icons on IPad and iPhone에 대한 내용을 찾을 수 있었습니다. 문제시 되었던 57과 72 png파일을 보니 Icon.png는 57x57로 멀썽한데 Icon-72.png는
80x80이더군요. 스샷에도 있듯이 이놈이 iPad용인가본데 왜 아까 에러 메세지는 iPad용도 Icon.png로 나왔던거지? 아무튼 Icon-72.png를 72x72로 사이즈 줄이고 기존에 Icon.png는 원래 사이즈인 57x57로 원상복구시켜서 Clean, Archive Build한 후 다시 Validate 도전!
드디어 Validation 성공했습니다. Finish를 눌러 종료합니다. 결과는 cocos2d-x가 자동생성해주는 iPad용 Icon인 Icon-72.png 사이즈가 문제의 원인이었다는것!
2012년 10월 26일 금요일
iOS 배포용 App Build를 위한 Distribution Provisioning Profiles 처리 작업
개발이 막바지에 이르면서 개발중인 App을 디바이스에도 올리고 추가적인 기능 구현을 위해 App Store에 올리기위해 Archives Build를 하는 과정에서 아래와 같은 에러가 발생하더군요.
No unexpired provisioning profiles found that contain any of the keychain's signing certificates
The identity 'iPhone Distribution' doesn't match any valid, non-expired certificate/private key pair in the default keychain
이는 Distribution Provisioning Profile에 문제가 있어서 발생한 것으로 제 경우는 아예 배포용 프로비저닝 프로파일을 만들지 않아서 생긴게 원인이었습니다. 간단히 프로파일을 만들어 등록하면 됩니다.
예전에 정리했던 Development Provisioning Profile을 생성했던 것과 과정이 비슷한데 이에 대한 정리 들어갑니다.
iOS Provisioning Portal에 로그인 후 Provisioning -> Distribution탭에서 New Profile을 클릭합니다.
위와 같이 채운 후 Submit을 클릭합니다.
그러면 배포용 Provisioning Profile을 다운받을 수 있습니다. Download 버튼이 보이지 않는다면 웹페이지를 리플레쉬하면 됩니다. Download를 클릭합니다.
다운로드한 파일을 더블클릭해서 실행하시면 Organizer이 자동으로 실행되면서 Provisioning Profile이 등록됩니다.
No unexpired provisioning profiles found that contain any of the keychain's signing certificates
The identity 'iPhone Distribution' doesn't match any valid, non-expired certificate/private key pair in the default keychain
이는 Distribution Provisioning Profile에 문제가 있어서 발생한 것으로 제 경우는 아예 배포용 프로비저닝 프로파일을 만들지 않아서 생긴게 원인이었습니다. 간단히 프로파일을 만들어 등록하면 됩니다.
예전에 정리했던 Development Provisioning Profile을 생성했던 것과 과정이 비슷한데 이에 대한 정리 들어갑니다.
iOS Provisioning Portal에 로그인 후 Provisioning -> Distribution탭에서 New Profile을 클릭합니다.
- Distribution Method - App Store를 선택
- Profile Name - 원하는 이름을 작성
- App ID - 작업중인 App ID를 선택
위와 같이 채운 후 Submit을 클릭합니다.
그러면 배포용 Provisioning Profile을 다운받을 수 있습니다. Download 버튼이 보이지 않는다면 웹페이지를 리플레쉬하면 됩니다. Download를 클릭합니다.
다운로드한 파일을 더블클릭해서 실행하시면 Organizer이 자동으로 실행되면서 Provisioning Profile이 등록됩니다.
cocos2d-x 사용 iOS Static Lib를 Release(Archive) Build 하기
처음 iOS용 Static Lib를 만들때는 Debug Build용 설정을 처리했었죠. 이제는 App Store에 올리기 위해 cocos2d-x를 사용하는 Static Lib의 Archive용 Build Setting Release부분 설정에 대해 정리해봅니다.
먼저 Device를 연결 후 Scheme를 연결한 Device용으로 선택합니다. 그리고 Product -> Build For -> Archiving Build를 해보시면,
/Volumes/Macintosh HD 2/Program/Engine/cocos2d-2.0-rc2-x-2.0.1/cocos2dx/platform/CCPlatformConfig.h
#error "Can not recognize the target platform, compling under a unsupported platform?"
#error "Can not recognize the target platform, compling under a unsupported platform?"
#error "Can not recognize the target platform, compling under a unsupported platform?"
위와 같은 에러가 발생합니다. 이는 Release관련 Build Setting이 안 되어있어서 그런건데 맨위에 링크에도 있지만 Preprocessor Macros 아래 2개를 추가해줍니다.
이제 개발중인 App에 Static Debug lib는 삭제하시고 Release빌드 된 Lib를 추가해서 사용하시면 됩니다.
cocos2d-x iOS용 AD fresca 연동시 orientation 문제 해결하기
ADFresca iOS버전을 cocos2d-x에 연동했을 때 스샷과 같이 Simulator에서 orientation문제가 발생했었죠.
ADFresca에 문의결과 해결할 수 있었는데, 개발중인 App의 Info.plist에 아래와 같이 Add Row 해주시면 일단 됩니다.
잘 되네요!? 근데 위에서 일단이라고 한 건 Simulator에서만 잘 되기때문이었습니다. 요즘 개발 일정 막바지라 Device로 테스트를 하고 있는데 iPhone 4에서는 처음과 동일한 문제가 발생을 하더군요.
제차문의결과 Info.plist 에 이번에는 Supported interface orientations 설정에 Landscape (right home button) 값이 추가되어있는지 확인하라고 해서 해봤지만 해결이 안되더군요. 한가지 해결방법이 더 있었는데, iOS Device들이 정확히 수평으로 놓여져 있는데도 세로모드로 인식되기도 한다는 피드백을 받으신 적이 있어서 이를 해결하기 위해 ADFresca에서 관리자 사이트에서 웹상의 설정변경으로 App의 Orientation을 Fix 할 수 있다고 하더군요.
먼저 ADFresca admin 사이트에 로그인을 한 후 Orientation을 Fix할 App의 오른쪽에 View를 클릭합니다.
App 정보 페이지에서 상단 메뉴중 AD Display를 클릭합니다.
AD Display화면에서 Display Logic의 Set을 클릭합니다.
그러면 팝업창이 뜨는데 Orientation -> Fix AD Display Orientation에서 원하시는 설정으로 변경 후 Save changes하시고 테스트 하시면 Device에서도 잘 됩니다. 기존에 Info.plist에 추가했던 2가지는 삭제하셔도 무관합니다.
ADFresca에 문의결과 해결할 수 있었는데, 개발중인 App의 Info.plist에 아래와 같이 Add Row 해주시면 일단 됩니다.
- Key - Initial interface orientation
- String Value - Landscape (left home button) 또는 Landscape (right home button)
잘 되네요!? 근데 위에서 일단이라고 한 건 Simulator에서만 잘 되기때문이었습니다. 요즘 개발 일정 막바지라 Device로 테스트를 하고 있는데 iPhone 4에서는 처음과 동일한 문제가 발생을 하더군요.
제차문의결과 Info.plist 에 이번에는 Supported interface orientations 설정에 Landscape (right home button) 값이 추가되어있는지 확인하라고 해서 해봤지만 해결이 안되더군요. 한가지 해결방법이 더 있었는데, iOS Device들이 정확히 수평으로 놓여져 있는데도 세로모드로 인식되기도 한다는 피드백을 받으신 적이 있어서 이를 해결하기 위해 ADFresca에서 관리자 사이트에서 웹상의 설정변경으로 App의 Orientation을 Fix 할 수 있다고 하더군요.
먼저 ADFresca admin 사이트에 로그인을 한 후 Orientation을 Fix할 App의 오른쪽에 View를 클릭합니다.
App 정보 페이지에서 상단 메뉴중 AD Display를 클릭합니다.
AD Display화면에서 Display Logic의 Set을 클릭합니다.
그러면 팝업창이 뜨는데 Orientation -> Fix AD Display Orientation에서 원하시는 설정으로 변경 후 Save changes하시고 테스트 하시면 Device에서도 잘 됩니다. 기존에 Info.plist에 추가했던 2가지는 삭제하셔도 무관합니다.
iOS libsystem_kernel.dylib`__pthread_kill, GraphicsServices`GSRegisterPurpleNamedPort 문제
libsystem_kernel.dylib`__pthread_kill:
0x3145f324: mov r12, #328
0x3145f328: svc #128
0x3145f32c: blo 0x3145f344 ; __pthread_kill + 32
0x3145f330: ldr r12, [pc, #4]
0x3145f334: ldr r12, [pc, r12]
0x3145f338: b 0x3145f340 ; __pthread_kill + 28
0x3145f33c: mcrreq p12, #14, r1, r9, c0
0x3145f340: bx r12
0x3145f344: bx lr
GraphicsServices`GSRegisterPurpleNamedPort:
...
...
GSEventCreateApplicationSuspendEvent + 154
갑자기 잘 실행되던 iOS Game이 실행하면 바로 죽어버리는 것이에요. 위와같이 Thread 1에서 말이죠. Clean Build나 App을 삭제 후 다시 해봐도 안되더군요. 해결은 iPhone를 재부팅 시키고 App을 삭제 후 다시 하니 잘 되는군요.
2012년 10월 25일 목요일
SourceTree 기존에 Push된 파일 Delete 해보자
iOS용 Universal Static Lib를 만들다 보니 제가 만든 Framework lib가 SDK 디렉토리에 이렇게 3개나 되어버렸네요. libFramework.a는 Simulator용만 있는거고 libFrameworkiOSDebug.a는 링크내용 정리하면서 나온 중간단계 파일, 마지막 libFrameworkUniversal.a가 우리 팀원들에게 배포할 lib파일입니다. 필요없는 2개의 lib를 지우기위해 SourceTree로 작업하는 것을 정리해보겠습니다. svn이었으면 간단히 delete후 commit하면 되겠지만...
SourceTree를 실행하면 이렇게 Pending 즉, 어떤 처리를 대기중인 파일들만 목록에 보입니다. modify를 했다던지 새로운 파일이라던지 말이죠. 여기서 Show Pending이라는 콤보박스를 클릭하면 스샷과 같이 여러개가 보이는데 Show Clean이나 Show All을 선택하면 기존에 push된 파일 목록들이 다 나오게 됩니다.
새로 추가하려고 했던 libFrameworkUniversal.a는 Add버튼을 눌러 추가하고 나머지 2개 파일은 선택해서 Remove를 클릭합니다. 이제 Commit후 Push하시면 됩니다.
SourceTree를 실행하면 이렇게 Pending 즉, 어떤 처리를 대기중인 파일들만 목록에 보입니다. modify를 했다던지 새로운 파일이라던지 말이죠. 여기서 Show Pending이라는 콤보박스를 클릭하면 스샷과 같이 여러개가 보이는데 Show Clean이나 Show All을 선택하면 기존에 push된 파일 목록들이 다 나오게 됩니다.
새로 추가하려고 했던 libFrameworkUniversal.a는 Add버튼을 눌러 추가하고 나머지 2개 파일은 선택해서 Remove를 클릭합니다. 이제 Commit후 Push하시면 됩니다.
XCode 4.x iOS Device와 Simulator용 Static Lib 통합해서 Universal Lib로 만들기
제가 만들고 있는 Framework Static Lib를 기존에는 Simulator용으로만 빌드해서 사용했었습니다. 링크의 포스팅에도 언급했고 팀 프로그래머들이 Framework Lib 가져다 쓸 연동 시점도 다가오고 있어서 Device용 Static Lib도 만들어서 사용을 해야합니다. 해서 이번 포스팅에서는 Simulator와 Device용 Static Lib를 하나로 통합해서 사용하는 것을 정리해보겠습니다.
먼저 간단하게 App과 외부 Static Lib Project간에 Build Target Lib가 맞지않아 생기는 에러와 해결 시 불편한 점 때문에 왜 굳이 Universal Lib로 통합을 해야하는지 짚고 넘어가보도록 하겠습니다.
App에서는 Device를 선택해서 빌드를 하는데 기존에 Static Lib를 추가한게 Simulator용이었다면 아래와 같은 에러가 나올 것입니다.
반대로 App은 Simulator이고 Static Lib가 Device용이어도 같은 에러가 발생합니다.
이에 대한 해결은 당연하게도 App과 Static Lib가 같은 Bulid Target에 매칭되게 해서 Build를 하는 것입니다. 즉, Device용을 빌드할 때는 Static Lib도 Device용 Lib를 가져다써야하는거죠. Simulator로 테스트 할 땐 Simulator용 Static Lib를 넣었다가 Device로 바뀌면 Device용으로 갈아치워주고를 Build Target이 바뀔때마다 이리 해야한다는게 함정.
그렇다고 Xcode에는 Win32개발처럼 #pragma comment( lib, "xxx.lib" ) 이게 되는지도 의문이고 Build Setting에서 추가 종속 Lib설정 같은것도 안보이는 것 같습니다.
궁극적인 해결책인지는 모르겠지만 한가지가 있는데 libtool이라는 것을 이용해서 Universal Lib라고 Device와 Simulator용 Static Lib를 하나로 묶어서 사용하는 방법이 있네요. 이제부터 이것에 대해 정리를 해볼께요. 본격적으로 시작하기 전에 Static Lib Project는 이미 만들어져 있다고 가정하고 진행합니다.
Debug Static Lib를 Device용과 Simulator용으로 빌드 하신후 해당 lib.a가 있는 디렉토리의 한단계 위로 가셔서 Go2Shell을 실행합니다.
libtool -static Debug-iphoneos/libFramework.a Debug-iphonesimulator/libFramework.a -o libFrameworkiOSDebug.a
그리고 위와 같이 터미널에서 입력해줍니다. Debug용 Device lib와 Simulator lib를 libFrameworkiOSDebug.a 하나로 묶어주는 명령어입니다. 각자의 환경에 맞게 입력하시면 되겠습니다.
-bash: libtool: command not found
만약 위와같이 libtool을 못 찾는다고 한다면 링크를 참고하시기 바랍니다.
이제 finder에서보면 Universal Static Lib가 생성된 걸 확인할 수 있습니다.
이제 기존에 추가했던 반쪽짜리 Static Lib는 삭제하시고 만들어진 Lib파일을 개발중인 App의 Frameworks 폴더에 끌어다 놓습니다. 그리고 Device나 Simulator 바꿔가면서해도 빌드 후 실행 가능할 것입니다.
빌드시마다 매번 libtool을 타이핑해서 실행할 수 없으니 Universal용 Built Target을 따로 만들어 거기에 Built Script를 추가해서 처리해보도록 하겠습니다.
먼저 Project -> TARGETS -> Add Target을 클릭합니다.
iOS -> Other -> Aggregate를 선택합니다.
Aggregate Target이 추가되었습니다.
Targets -> Build Phases -> Add Build Phase를 클릭 후 Add Run Script를 선택합니다. 그리고 아래의 스크립트를 기입합니다. 여기서도 물론 각 개발 환경에 맞게 기입하시면 됩니다.
간단히 설명드리면 Debug냐 Release냐에 따른 설정에 따라 Universal Dir에 통합 lib를 만드는 것입니다.
먼저 간단하게 App과 외부 Static Lib Project간에 Build Target Lib가 맞지않아 생기는 에러와 해결 시 불편한 점 때문에 왜 굳이 Universal Lib로 통합을 해야하는지 짚고 넘어가보도록 하겠습니다.
위와 같이 Simulator과 iPhone Device용 Static Lib가 만들어져있을때,
Undefined symbols for architecture armv7:
"xxxxx", referenced from:
xxxxx in xxxxx.o
xxxxx in xxxxx.o
...
...
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
반대로 App은 Simulator이고 Static Lib가 Device용이어도 같은 에러가 발생합니다.
이에 대한 해결은 당연하게도 App과 Static Lib가 같은 Bulid Target에 매칭되게 해서 Build를 하는 것입니다. 즉, Device용을 빌드할 때는 Static Lib도 Device용 Lib를 가져다써야하는거죠. Simulator로 테스트 할 땐 Simulator용 Static Lib를 넣었다가 Device로 바뀌면 Device용으로 갈아치워주고를 Build Target이 바뀔때마다 이리 해야한다는게 함정.
그렇다고 Xcode에는 Win32개발처럼 #pragma comment( lib, "xxx.lib" ) 이게 되는지도 의문이고 Build Setting에서 추가 종속 Lib설정 같은것도 안보이는 것 같습니다.
궁극적인 해결책인지는 모르겠지만 한가지가 있는데 libtool이라는 것을 이용해서 Universal Lib라고 Device와 Simulator용 Static Lib를 하나로 묶어서 사용하는 방법이 있네요. 이제부터 이것에 대해 정리를 해볼께요. 본격적으로 시작하기 전에 Static Lib Project는 이미 만들어져 있다고 가정하고 진행합니다.
Debug Static Lib를 Device용과 Simulator용으로 빌드 하신후 해당 lib.a가 있는 디렉토리의 한단계 위로 가셔서 Go2Shell을 실행합니다.
libtool -static Debug-iphoneos/libFramework.a Debug-iphonesimulator/libFramework.a -o libFrameworkiOSDebug.a
그리고 위와 같이 터미널에서 입력해줍니다. Debug용 Device lib와 Simulator lib를 libFrameworkiOSDebug.a 하나로 묶어주는 명령어입니다. 각자의 환경에 맞게 입력하시면 되겠습니다.
-bash: libtool: command not found
만약 위와같이 libtool을 못 찾는다고 한다면 링크를 참고하시기 바랍니다.
이제 finder에서보면 Universal Static Lib가 생성된 걸 확인할 수 있습니다.
이제 기존에 추가했던 반쪽짜리 Static Lib는 삭제하시고 만들어진 Lib파일을 개발중인 App의 Frameworks 폴더에 끌어다 놓습니다. 그리고 Device나 Simulator 바꿔가면서해도 빌드 후 실행 가능할 것입니다.
빌드시마다 매번 libtool을 타이핑해서 실행할 수 없으니 Universal용 Built Target을 따로 만들어 거기에 Built Script를 추가해서 처리해보도록 하겠습니다.
먼저 Project -> TARGETS -> Add Target을 클릭합니다.
iOS -> Other -> Aggregate를 선택합니다.
Aggregate Target이 추가되었습니다.
Targets -> Build Phases -> Add Build Phase를 클릭 후 Add Run Script를 선택합니다. 그리고 아래의 스크립트를 기입합니다. 여기서도 물론 각 개발 환경에 맞게 기입하시면 됩니다.
UNIVERSAL_LIB=libFrameworkUniversal.a
UNIVERSAL_DIR=${BUILT_PRODUCTS_DIR}/../${CONFIGURATION}-universal
if [ ! -d "${UNIVERSAL_DIR}" ]
then
mkdir ${UNIVERSAL_DIR}
fi
rm -rf ${UNIVERSAL_DIR}/${UNIVERSAL_LIB}
libtool -static "${BUILT_PRODUCTS_DIR}/../${CONFIGURATION}-iphoneos/libFramework.a""${BUILT_PRODUCTS_DIR}/../${CONFIGURATION}-iphonesimulator/libFramework.a" -o"${UNIVERSAL_DIR}/${UNIVERSAL_LIB}"
간단히 설명드리면 Debug냐 Release냐에 따른 설정에 따라 Universal Dir에 통합 lib를 만드는 것입니다.
이제 Scheme를 Aggregate Target으로 선택해서 Build하시면 됩니다. 물론 스크립트가 필요로하는 Device와 Simulator용 lib가 먼저 빌드되어 있어야겠죠.
반응형
'모바일개발(Mobile Dev) > IOS개발(ObjectC)' 카테고리의 다른 글
App Store에 App 등록해보자. 1 - Prepare for Upload ~ Waiting for Upload 단계 (0) | 2015.01.14 |
---|---|
iPhone 개발자 인증서 관리하기 (여러장비에서 테스트하기) (0) | 2015.01.14 |
iOS APP 만들기 (0) | 2015.01.14 |
iOS Application 앱 스토어 등록 절 (2) | 2015.01.14 |
번들ID 간편하게 관리하기( Provisioning > XCode > AppStore ) (0) | 2015.01.14 |