Xcode에서 실제 아이폰 디바이스에 디버깅 및 배포를 위해서는 99$/1년 비용을 지불하는 iOS Developer Program 에 가입하여야 한다. 개발앱이 시뮬레이터에서는 잘 돌아간다고 하더라도, 실제 디바이스에서 제대로 돌아간다는 보장이 없다. 하여 디바이스에서의 테스트는 필수인데, 단순히 스터디나 프로젝트 테스트 용도로 사용할 경우 Cydia Appsync 설치한 탈옥된 아이폰과 몇가지 설정으로 배포 및 디버깅이 가능하다. 당연한 얘기지만, 앱스토어 등록이 목적이라면 IDP에 가입하여야 한다.
테스트 개발환경
- O/S
- MAC OS X Lion 10.7.4
- MAC OS X Mavericks 10.9
- IDE
- Xcode 4.3
- Xcode 4.5
- Xcode 5.0
- DEVICE
- 탈옥된 아이폰 (Jailbroken iPhone)
- iOS 4.2
- iOS 4.3
- iOS 6.1
- Cydia Appsync 인스톨(필수)
- 탈옥된 아이폰 (Jailbroken iPhone)
인증서 생성
Keychain Access
실행.Keychain Access
Certificate Assistant
Create a Certificate
선택.
- 인증서 이름은
iPhone Developer
로 지정. 만일, 동일한 이름의 인증서가 이미 존재하고 있다면 삭제 후 진행하기를 권장.- Name : iPhone Developer
- Identity Types : Self signed Root
- Certificate Type : Code Signing
- Check Let me override defaults
Validity Period(days)
(유효기간)은 기본 365일로 설정되는데, 넉넉하게 설정.Email Address
항목을 지우고 진행.- 생성 완료될 때까지
Continue
선택하여 인증서 생성 완료.
Xcode .plist 파일 수정
SDKSettings.plist
,info.plist
두개 파일의 수정 필요.- Property List Editing을 지원하는
xCode
를 사용 Finder
에서 해당 Path로 이동하는 방법Applications/Xcode.app
에서오른클릭
하여Show Package Contents
를 선택하면 Package안의 Path로 접근할 수 있다.
- 또는,
Command + Shift + G
키를 눌러Go to the folder
항목에 해당 Path로 바로 이동 가능하다.
- Package안의 File을 바로 수정할 경우,
Access(Write) lock
으로 인해 수정된 내용을 저장할 수 없으니바탕화면
등으로SDKSettings.plist
,info.plist
파일을 복사하여 수정/저장하고 다시 해당 Package 안의 Path로 붙여넣는 방법으로 진행.
SDKSettings.plist
Xcode Ver. | Path |
---|---|
4.3 | /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk |
4.5 | /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk |
5.0 | /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk |
DefaultProperties의 CODE_SIGNING_REQUIRED
, ENTITLEMENTS_REQUIRED
Key의 Value를 YES
에서 NO
로 수정.
Dictionary | Key | Value(Org) | Value(Mod) |
---|---|---|---|
DefaultProperties | CODE_SIGNING_REQUIRED | YES | NO |
DefaultProperties | ENTITLEMENTS_REQUIRED | YES | NO |
info.plist
Xcode Ver. | Path |
---|---|
4.3 | /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform |
4.5 | /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform |
5.0 | /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform |
DefaultProperties의 CODE_SIGN_CONTEXT_CLASS
Key의 Value를 XCiPhoneOSCodeSignContext
에서 XCCodeSignContext
로 수정.
Dictionary | Key | Value(Org) | Value(Mod) |
---|---|---|---|
DefaultProperties | CODE_SIGN_CONTEXT_CLASS | XCiPhoneOSCodeSignContext | XCCodeSignContext |
Xcode Entitlements 스크립트 생성
앞서 생성한 iPhone Developer
인증서를 사용하기 위해, Terminal
Shell
에서 다음을 입력하여 Entitlements Script를 내려받는다.
mkdir /Applications/Xcode.app/Contents/Developer/iphoneentitlements
cd /Applications/Xcode.app/Contents/Developer/iphoneentitlements
curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
mv gen_entitlements.txt gen_entitlements.py
chmod 777 gen_entitlements.py
인터넷 연결에 문제가 있거나 해당 블로그 문제로 스크립트 다운로드가 안된다면, 다음의 코드를 /Applications/Xcode.app/Contents/Developer/iphoneentitlements/gen_entitlements.py
로 저장하고, Terminal
에서 chmod 777 gen_entitlements.py
수행.
#!/usr/bin/env python
import sys
import struct
if len(sys.argv) != 3:
print "Usage: %s appname dest_file.xcent" % sys.argv[0]
sys.exit(-1)
APPNAME = sys.argv[1]
DEST = sys.argv[2]
if not DEST.endswith('.xml') and not DEST.endswith('.xcent'):
print "Dest must be .xml (for ldid) or .xcent (for codesign)"
sys.exit(-1)
entitlements = """
application-identifier
%s
get-task-allow
""" % APPNAME
f = open(DEST,'w')
if DEST.endswith('.xcent'):
f.write("\xfa\xde\x71\x71")
f.write(struct.pack('>L', len(entitlements) + 8))
f.write(entitlements)
f.close()
Xcode 환경설정 변경
이제 Xcode를 실행하여, Build Settings의 Code Signing
옵션 수정과 함께 Runscript
를 추가해 줘야 한다.
Build Settings 수정
해당 Project의 Build Settings의 Code Signing
항목을 다음과 같이 모두 Don't Code Sign
으로 변경.
Runscript 추가
디버깅이 가능하게 하기 위해, 앞서 생성했던 gen_entitlements.py
를 구동하기 위한 다음의 Script code를 Build Phases
의 Run Script
에 추가해 준다.
Xcode 4에서는 Build Phases
에 디폴트로 Run Script
항목이 있어 해당 에디트창에 Script만 추가해주면 되지만, Xcode 5에서는 따로 Run Script
항목을 추가시켜 주어야 한다.
export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ] || [ "${PLATFORM_NAME}" == "ipados" ]; then /Applications/Xcode.app/Contents/Developer/iphoneentitlements/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi
Xcode 4.3/4.5
TARGETS
선택하여 Build Phases
의 Run Script
에 Script 추가.
Xcode 5
TARGETS
선택하여 Build Phases
선택하고, 상단 메뉴에서 Editor
->Add Build Phase
->Add Run Script Build Phase
를 클릭하여 Run Script 항목을 추가시켜 주고 Script 추가.
iPhone 케이블 연결
iPhone을 연결하여 Xcode에서 Organizer
를 실행하고, 연결된 디바이스 선택 후 Use for development
를 클릭한다. 로그인 팝업이 뜨면, Cancel
하여 취소한다.
이제 배포 및 디버깅을 위한 작업은 모두 끝났고, Xcode에서 Run
실행하면 다음과 같은 팝업이 뜬다. Always Allow
를 클릭하여 인증서를 적용한다.
iPhone이 Sleep 상태에 있을 때 Run
실행했을 때, 가끔 배포만 이뤄지고 디버깅 프로세스는 중단되는 경우가 있으니 참고.
REFERENCE
- http://www.alexwhittemore.com/developing-jailbroken-iphone-ios-401/
- http://stackoverflow.com/questions/246422/how-can-i-deploy-an-iphone-application-from-xcode-to-a-real-iphone-device
- http://stackoverflow.com/questions/37464/iphone-app-minus-app-store
- https://developer.apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html#//apple_ref/doc/uid/TP40005929-CH4-SW1
댓글