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)

인증서 생성

  • Keychain Access 실행.
    • Keychain Access Certificate Assistant Create a Certificate 선택. Keychain Access
  • 인증서 이름은 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로 접근할 수 있다.

    Show Package Contents

    • 또는, Command + Shift + G키를 눌러 Go to the folder항목에 해당 Path로 바로 이동 가능하다.

    Go to the folder

  • 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
SDKSettings.plist

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
info.plist

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으로 변경.

Build Settings

Runscript 추가

디버깅이 가능하게 하기 위해, 앞서 생성했던 gen_entitlements.py를 구동하기 위한 다음의 Script code를 Build PhasesRun 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 PhasesRun Script에 Script 추가.

Add Run Script 4

Xcode 5

TARGETS선택하여 Build Phases 선택하고, 상단 메뉴에서 Editor->Add Build Phase->Add Run Script Build Phase를 클릭하여 Run Script 항목을 추가시켜 주고 Script 추가.

Add Run Script 5 Added Run Script5

iPhone 케이블 연결

iPhone을 연결하여 Xcode에서 Organizer를 실행하고, 연결된 디바이스 선택 후 Use for development를 클릭한다. 로그인 팝업이 뜨면, Cancel하여 취소한다.

이제 배포 및 디버깅을 위한 작업은 모두 끝났고, Xcode에서 Run실행하면 다음과 같은 팝업이 뜬다. Always Allow를 클릭하여 인증서를 적용한다.

Codesign Keychan

iPhone이 Sleep 상태에 있을 때 Run실행했을 때, 가끔 배포만 이뤄지고 디버깅 프로세스는 중단되는 경우가 있으니 참고.

Test Success

REFERENCE

공유하기 링크
TAG
, ,
댓글
댓글쓰기 폼