Xcode4

델리마운트 위키

목차

Apple Developer Program team - Member Center

애플 개발자 프로그램은 팀 활동을 지원합니다. 팀원을 추가하는 방법은 다음과 같습니다. 우선 이 내용은 팀 멤버용 Apple ID가 아직 없는 상태인 것으로 간주하고 설명합니다.

관리자가 팀원을 초대합니다. 초대는 이메일을 통해 이루어지게 됩니다.

  1. Apple Developer > iOS Dev Center
  2. 최상단 링크 중 Member Center 선택
  3. 상단 탭 중 People 선택
  4. 좌측 메뉴 중 Invitations 선택
  5. Invite People to Your Team 에서 Invite Person 클릭
  6. Contact Information 항목에 First Name(이름), Last Name(성), Email Address(애플아이디가 될 것) 기입 후, Access and Roles 항목에 Admin 선택, 이름/성 등의 항목은 영어로 입력하도록 합니다. Access and Roles의 각 항목에 대한 내용은 iOS Developer Program Roles Overview를 참고합니다.
  7. Send Invitation 클릭

이제 팀원은 위에서 기입한 Email Address로 초대 메일을 받았을 것입니다. You Have Been Invited to Join an Apple Developer Program 라는 내용의 메일이 오는데, 본문 중간에 대략 열 몇자리의 인증코드로 이루어진 링크가 있을 것입니다.

  1. 인증코드로 된 링크를 클릭해줍니다.
  2. Join an Apple Developer Program team 으로 시작하는 페이지가 나옵니다. Continue를 클릭합니다.
  3. Do you have an existing Apple ID you would like to use? 라는 내용과 함께 애플아이디 설정하는 부분이 나옵니다. Create an Apple ID를 선택한 후 Continue를 클릭합니다.
  4. Complete your personal profile 페이지가 나옵니다. 모든 필드를 입력해야 합니다. Create Apple ID 항목에 Email Address (애플아이디)/ Password (암호)/ Re-enter Password (암호 재입력) 을 기입하고, Security Information 항목에 Birthday (생일)/ Security Information (애플 아이디/패스워드 분실시 질문)/ Answer (애플 아이디/패스워드 분실시 답변) 을 기입하고, Personal Information 항목에 First Name (이름)/ Last Name (성)/ Company/Organization (단체명, 우리 회사의 경우엔 Delimount)/ Country (국가, South Korea)/ Street Address (주소, 윗줄엔 동호수 건물명, 아랫줄엔 번지, 동, 구)/ City/Town(도시, Seoul)/ State(주, 우리 회사 다른 아이디는 ??를 입력해두었습니다)/ Postal Code(우편번호)/ Phone(전화번호, 01012345678 = 82 10 12345678 ) 모두 기입한 후 Continue를 클릭합니다.
  5. Complete your professional profile 페이지가 나옵니다. Which Apple platforms do you develop with? Select all that apply 항목에서 iOS를 선택, What is your primary market? 항목에선 Social Networking을 선택합니다. 그 밑의 다음과 같은 (Check this box if you are currently enrolled in a college or university) 체크박스는 비워둡니다. 그 밑의 항목들은 읽어본 후 적당히 선택하면 되는데, 위에서부터 Social Networking/Free Applications를 차례로 선택하고, How many years have you been developing on Apple platforms? 질문에 자신의 애플 플랫폼 개발 경력 기간을 기입, 그 다음으로 Yes/Android 정도를 선택해주면 됩니다. 모두 입력하고 나서 Continue를 클릭합니다.
  6. Registered Apple Developer Agreement 페이지가 나옵니다. 내용 하단의 다음과 같은 체크박스 By checking this box I confirm that I have read and agree to be bound by the Agreement above. I also confirm that I am of the legal age of majority in the jurisdiction in which I reside (at least 18 years of age in many countries). 를 체크해준 후 I Agree 버튼을 클릭합니다.
  7. Enter the verification code sent to your email 페이지가 나옵니다. 가입에 사용한 Apple ID 이메일주소로 Please Verify Your Email Address라는 메일이 도착했을 것입니다. 해당 메일의 본문 중에 5자리의 인증코드 링크가 있을 것입니다. 링크를 클릭하지 마시고 인증코드를 적어서 페이지에 기입한 후, Continue 버튼을 클릭합니다.
  8. You are now registered as an Apple Developer 라는 페이지가 나옵니다. Continue 버튼을 클릭합니다.
  9. (...이 이후의 단계는 부정확합니다만 나온다면 다음과 같이...) Invitation Accept? 페이지가 나온다면 Submit 버튼을 클릭합니다.
  10. Invitation acceptance confirmed 페이지가 나오면, Get Started 버튼을 클릭합니다.
  11. Member Center 페이지로 오게 될 것입니다. People 탭으로 이동해 자신이 목록에 추가된 것을 확인해줍니다.

관리자는 초대한 사람이 가입이 완료되었다 보고하면 Member Center의 People 탭으로 이동해 추가된 팀원을 확인해줍니다.


Distribution 인증서 교체

우선 기존에 사용하던 Distribution 인증서(App store 릴리즈/ Ad Hoc 릴리즈 시에 사용됩니다)를 폐기해야 합니다.

  1. Apple Developer > iOS Dev Center > iOS Provisioning Portal
  2. Certificates > Distribution
  3. 기존에 사용중인 인증서가 목록에 보일 것입니다. 목록 우측의 Revoke를 클릭하고 확인창이 뜨면 OK를 클릭합니다.

이제 새로운 인증서를 생성하도록 합니다. 이 작업은 맥 시스템의 실제 빌드를 진행할 사용자 계정으로 로그인하여 진행하도록 합니다. 우선 인증 요청을 생성합니다.

  1. Spotlight(맥의 우측상단 돋보기 아이콘)에서 키체인 접근을 검색해 실행하도록 합니다.
  2. 키체인 접근 > 인증 지원 > 인증 기관에서 인증서 요청...
  3. 사용자 이메일 주소, 이름을 입력하고 요청항목의 디스크에 저장됨을 선택합니다. (저는 이 부분에서 정확히 어떤 것을 입력해야 하는지는 파악이 안된 상태여서, 그냥 애플 개발자 센터에 사용중인 이메일과 이름으로 입력하였습니다.) 모두 입력한 후 계속을 클릭합니다.
  4. 별도 저장하는 창이 뜨면, 적당한 경로에 기억할 수 있는 형태로 지정해줍니다. 이 파일은 확장자가 .certSigningRequest 이며, 편의상 CSR 파일이라고 표현하도록 하겠습니다.

이제 애플 개발자센터에 인증을 받습니다.

  1. Apple Developer > iOS Dev Center > iOS Provisioning Portal
  2. Certificates > Distribution
  3. 목록에 You currently do not have a valid distribution certificate 이란 내용과 함께 우측에 Request Certificate 버튼이 보일 것입니다. 이 버튼을 클릭합니다.
  4. Create iOS Distribution Certificate라는 내용의 설명글이 나오는데, 위에 CSR 파일을 생성하고 업로드 하라는 내용입니다. 하단에 보면(사파리 브라우저 기준으로) 파일 선택 버튼이 있습니다. 이 버튼을 클릭합니다.
  5. 조금 전에 생성한 CSR 파일을 선택해줍니다.
  6. 우측 하단의 Submit 버튼을 클릭해줍니다.

이제 목록에 보면 방금 요청한 인증서가 Pending Issuance 상태로 추가되어있을 것입니다. 잠시 기다렸다가 Distribution 탭을 클릭하면 Issued 상태로 바뀌면서 download 버튼이 활성화 됩니다.

  1. download 버튼을 클릭합니다.
  2. distribution_identity.cer 파일을 다운받았을 것입니다. 이 파일을 실행해줍니다. 키체인 접근이 실행될 것입니다.

다음으로 Provisioning Profile을 새 인증서로 업데이트 해줘야 합니다.

  1. Apple Developer > iOS Dev Center > iOS Provisioning Portal
  2. Provisioning > Distribution
  3. 목록에 보면 몇가지 Provisioning Profile이 보일 것입니다. 이중에 사용할 목록을 모두 업데이트 해줄 것입니다.
  4. 우측의 Modify 버튼을 클릭합니다.
  5. 편집 화면이 나오면 몇가지 선택할 수 있는 것이 나올 것인데, 인증서는 선택할 수 있는 것이 아니고 이미 선택되어져 있음을 표시만 해주는 상태일 것입니다. 그냥 바로 Submit 버튼을 클릭합니다.

방금 수정한 Provisioning Profile이 Pending 상태로 나올 것입니다. 잠시 기다렸다가 Distribution 탭을 클릭하면 Active 상태로 바뀌면서 download 버튼이 활성화됩니다.

  1. download 버튼을 클릭합니다.
  2. Provisioning Profile 이름으로 된 mobileprovision 파일을 다운받았을 것입니다. 이 파일을 실행해줍니다. iPhone Configuration Utility가 실행될 것입니다. Add to Library? 라는 팝업이 뜰 것인데, Add to Library 버튼을 클릭합니다.

이제 xcode에서 프로젝트를 불러옵니다.

  1. 좌측 목록에서 프로젝트 선택 > 바로 우측의 목록에서 프로젝트 선택 > Build Settings
  2. Code Signing > Code Signing Identity > Release에 보면 Any iOS SDK 항목 우측으로 인증서를 선택할 수 있습니다. 방금 추가한 인증서를 선택합니다.

이제 Scheme를 iOS Device로 선택한 후 Product > Archive를 수행해 잘 빌드하는지 확인해줍니다.


릴리즈 방법

빌드 UI가 변경되면서 릴리즈 방법도 변경되었습니다. 릴리즈 빌드 후 수동으로 압축해서 Application Loader를 통해 업로드 하던 부분이 Xcode 내에서 해결하도록 변경되었으며, 빌드 방법도 변경되어 기존의 시스템에 익숙한 사용자에게 약간의 혼선이 생깁니다. 우선 iTunes Connect 웹사이트에서 진행되야 하는 작업은 기존과 동일하며, 해당 작업을 완료한 후로 업로드 대기상태에서 다음과 같이 진행하면 됩니다. (프로젝트 설정의 버전 넘버링 등은 마친 상태라고 가정합니다.)

  1. 좌측 상단의 Run/Stop 옆의 드랍다운 메뉴에서 iOS Device 를 선택 (만약 아이폰 등의 기기를 연결중이라면 해당 기기의 이름으로 표시됩니다. 예를 들면 절스의아이폰 같은 형태로)
  2. Product > Archive
  3. Window > Organizer > 상단 탭의 Archives > 좌측 목록에서 방금 빌드한 앱 선택 > 방금 빌드한 Archive 선택 (Archiving 이 제대로 되었다면 아마 자동으로 실행될 것)
  4. Validate / Share / Submit 버튼이 보일 것인데, Validate 는 유효성만 확인하는 것이고 Submit 버튼은 실제로 업로드를 진행하는 것입니다.

이 내용은 실제 릴리즈 작업을 진행할 때, 더 명확하게 보충하도록 하겠습니다. 그리고 Ad Hoc 버전의 빌드를 위한 문서를 정리해야 합니다. 이를 위해선 새로 도입된 Scheme 라는 항목의 개념을 이해해야 할 듯 합니다.


TDD

Xcode4에서 iOS 개발시 유닛 테스팅 프레임워크를 자체적으로 지원합니다. OCUnit / SenTestingKit 이라고 하는 프레임워크를 내장하였으며, 프로젝트 생성시 테스트 타겟을 함께 추가할 수 있습니다.

테스트 타겟에 추가한 테스트들은 다음과 같은 규칙으로 테스트를 하게 됩니다.

  1. 테스트 클래스의 이름 순으로 테스트 실행
  2. 클래스 내의 테스트 메소드는 메소드 이름 순으로 테스트 실행
  3. setUp > testA > tearDown > setUp > testB > tearDown ...


Application Test / Logic Test

현재로서는 다른 점이 잘 파악되지 않습니다. 사용상에 서로 다른 점을 알 수 없었습니다. 매크로에 따라서 선택하게 되는데, 그냥 매크로를 제거하고 Application Test 로 진행하면 될 것으로 보입니다.


프로젝트 생성

테스트 타겟을 포함하는 Hello 프로젝트를 생성해보겠습니다. 이 경우, iOS 프로젝트 Hello가 생성되며, HelloTests 타겟이 추가되는 형태입니다. 어플리케이션 타입은 실제 프로젝트 진행시 사용하던 Window-based를 선택하도록 하겠습니다.

  1. File > New > New Project...
  2. iOS : Application > Window-based Application > Next
  3. ProductName: 항목에 Hello를 입력하고, 하단의 Include Unit Tests를 체크해준 후, Next를 클릭합니다.
  4. 경로를 지정하고 Create를 클릭합니다. 만약 Git 으로 버전관리를 할 것이라면 Create local git repository for this project를 체크해줍니다.

이제 프로젝트가 생성되고 나면, 좌측 트리 메뉴의 최상단의 Hello 프로젝트를 선택했을 때, 우측에 Hello 프로젝트와 Hello 타겟, HelloTests 타겟을 확인할 수 있을 것입니다. 좌측 트리는 /Hello/Hello 가 Hello 타겟의 파일들이며, /Hello/HelloTests 가 HelloTests 타겟의 파일입니다. 소스파일을 추가할 때, Hello 타겟에 추가된 파일들은 앱을 빌드할 때 사용되는 것이고, HelloTests 타겟에 추가된 파일들은 테스트시에만 사용되는 파일들입니다. 파일 추가시 주의하도록 합니다.


테스트 클래스 추가

  1. 좌측 목록에서 HelloTests 선택우클릭, 팝업에서 New File...
  2. 좌측에서 Cocoa Touch 선택 후, 우측에서 Objective-C test case class 선택, Next 클릭
  3. Save As: 항목에 테스트 클래스 이름을 지정하고, Add to targets: 항목에서 Hello는 체크 해제하고, HelloTests에 체크
  4. Save 클릭


테스트 메소드 작성

testXxx 의 형태로 메소드 이름 앞에 test가 들어가도록 네이밍합니다. 이렇게 네이밍 된 메소드만 실제로 테스트가 수행됩니다.

Assertion

STAssertTrue( expression, failure_description, ... )와 같은 형태를 띄는데, ( ... , failure_description, ... )의 형태는 모든 Assertion 매크로가 동일합니다. failure_description은 포멧문자열이며, 그 뒤의 ... 부분에 필요에 따라 인자들을 기입하게 됩니다. NSLog( format, ... ) 를 생각하면 됩니다. 예를 들면 다음과 같습니다.

STAssertTrue( [ month isEqualToString: @"April" ], @"expecting %@ but %@", @"April", month );

failure_description은 nil일 수 있습니다. 간단하게는 STFail( nil ); 과 같이 사용할 수 있습니다.

실패

  • STFail( failure_description, ... )

테스트를 고의로 실패합니다

참/거짓 테스트

  • STAssertTrue( expression, failure_description, ... )

expression 이 참이면 통과하며, 거짓이면 실패합니다.

  • STAssertFalse( expression, failure_description, ... )

expression 이 거짓이면 통과하며, 참이면 실패합니다.

Nil 테스트

  • STAssertNil( expression, failure_description, ... )

expression이 nil 이면 통과하며, 아니면 실패합니다.

  • STAssertNotNil( expression, failure_description, ... )

expression이 nil 이 아니면 통과히며, nil 이면 실패합니다.

비교 테스트

  • STAssertEquals( value1, value2, failure_description, ... )

두 값이 동일하면 통과하며, 다르면 실패합니다. == 비교연산자를 사용합니다. 결과는 다음과 같습니다. STAssertTrue( ( value1 == value2 ), failure_description, ... )

  • STAssertEqualObjects( object1, object2, failure_description, ... )

두 객체가 동일하면 통과하며, 다르면 실패합니다. isEqualToObject: 메소드를 사용합니다. 결과는 다음과 같습니다.

STAssertTrue( ( YES == [ object1 isEqualToObject: object2 ] ), failure_description, ... )
  • STAssertEqualsWithAccuracy( value1, value2, accuracy, failure_description, ... )

두 값(정수 또는 실수)을 비교하여 그 차이가 accuracy 보다 큰 경우 실패하며, 작거나 같다면 통과합니다.

STAssertEqualsWithAccuracy( 5, 3, 2, failure_description, ... ); // 3과 5의 차이는 2로 ( accuracy = 2 )와 같아 통과
STAssertEqualsWithAccuracy( 6, 9, 4, failure_description, ... ); // 6과 9의 차이는 3로 ( accuracy = 4 ) 보다 작아서 통과
STAssertEqualsWithAccuracy( 4, 7, 1, failure_description, ... ); // 4와 7의 차이는 3으로 (accuracy = 1 ) 보다 커서 실패

예외 테스트

  • STAssertThrows( expression, failure_description, ... )

expression 이 예외를 발생하면 통과하며, 예외가 발생하지 않으면 실패합니다.

  • STAssertThrowsSpecific( expression, exception_class, failure_description, ... )

expression 이 exception_class 예외를 발생하면 통과하며, 그 외에는 실패합니다.

  • STAssertThrowsSpecificNamed( expression, exception_class, exception_name, failure_description, ... )

expression 이 exception_class 예외를 발생하고 exception_name 과 같은 이름의 예외인 경우 통과하며, 그 외에는 실패합니다.

  • STAssertNoThrow( expression, failure_description, ... )

expression 이 예외를 발생하지 않으면 통과하며, 예외가 발생하면 실패합니다.

  • STAssertNoThrowSpecific( expression, exception_class, failure_description, ... )

expression 이 exception_class 예외를 발생하면 실패하며, 그 외에는 성공합니다.

  • STAssertNoThrowSpecificNamed( expression, exception_class, exception_name, failure_description, ... )

expression 이 exception_class 예외를 발생하고 exception_name 과 같은 이름의 예외인 경우 실패하며, 그 외에는 성공합니다.

  • STAssertTrueNoThrow( expression, failure_description, ... )

expression 이 참이고 예외를 발생하지 않으면 통과하며, 그 외에는 실패합니다.

  • STAssertFalseNoThrow( expression, failure_description, ... )

expression 이 거짓이고 예외를 발생하지 않으면 통과하며, 그 외에는 실패합니다.

테스트 수행

스키마를 원하는 것(예를 들면 iPhone 4.3 Simulator) 에 놓고, Product > Test 를 선택합니다. 단축키는 Command + U 입니다.

클래스별로 개별 테스트 하는 방법은 Xcode 가 따로 제공하지 않는 것 같습니다. 항상 전체 테스트를 수행하게 되는데, 성능이 빨라서 큰 문제가 되진 않는 것 같습니다. 웹상에 터미널에서 테스트 수행하는 방법에 대한 문서가 존재하는데, 필요한 경우 따로 조사해 추가하도록 하겠습니다.

참조


변경점

  • Interface Builder 통합
  • Git 지원
  • @synthesize 가 멤버를 자동으로 정의해 주는 듯
  • Code-Completion 기능 강화
  • UnitTest 공식 지원 (SenUnitTest 프레임워크 기본 제공)
  • Universal 빌드를 권장하며 지원이 강화됨 (Universal 빌드는 아이폰과 아이패드에 각각 커스터마이즈되어 돌아가는 단일 앱)

단점

  • 프로젝트의 그룹 내 파일 정렬 기능이 제외됨 (웹상에 많은 불만이 제기되고 있어 조만간 다시 기능이 추가될 것으로 예상됨)
개인 도구