ios 8 App Development Essentials Korean Translation Copyright 2015 by J-Pub. co. The Korean edition is published by arrangement with Neil Smyth through Agency-One, Seoul. Copyright 2014 Neil Smyth. All rights reserved. 이 책의 한국어판 저작권은 에이전시 원을 통해 저작권자와의 독점 계약으로 제이펍 출판사에 있습니다. 신저작권법에 의해 한국 내에서 보호를 받는 저작물이므로 무단전재와 무단복제를 금합니다. 초판 1쇄 발행 2015년 4월 17일 지은이 닐 스미스 옮긴이 황반석 펴낸이 장성두 펴낸곳 제이펍 출판신고 2009년 11월 10일 제406 2009 000087호 주소 경기도 파주시 문발로 141 뮤즈빌딩 403호 전화 070 8201 9010 / 팩스 02 6280 0405 홈페이지 www.jpub.kr / 이메일 jeipub@gmail.com 편집부 이민숙, 이 슬, 이주원 / 소통 기획팀 현지환 용지 신승지류유통 / 인쇄 한승인쇄 / 제본 광우제책사 ISBN 979 11 85890 22 7 (93000) 값 36,000원 이 책은 저작권법에 따라 보호를 받는 저작물이므로 무단 전재와 무단 복제를 금지하며, 이 책 내용의 전부 또는 일부를 이용하려면 반드시 저작권자와 제이펍의 서면동의를 받아야 합니다. 잘못된 책은 구입하신 서점에서 바꾸어 드립니다. 제이펍은 독자 여러분의 아이디어와 원고 투고를 기다리고 있습니다. 책으로 펴내고자 하는 아이디어나 원고가 있으신 분께서는 책의 간단한 개요와 차례, 구성과 저(역)자 약력 등을 메일로 보내주세요. jeipub@gmail.com
이 책에 기재한 회사명 및 제품명은 각 회사의 상표 및 등록명입니다. 이 책에서는 c, R, TM 등의 기호를 생략하고 있습니다. 이 책에서 사용하고 있는 실제 제품 버전은 독자의 학습 시점에 따라 책의 버전과 다를 수 있습니다. 책의 내용과 관련된 문의사항은 역자나 출판사로 연락주시기 바랍니다. 역자: http://cafe.naver.com/petersbook 혹은 naya.peter@gmail.com 출판사: jeipub@gmail.com
차 례 옮긴이 머리말 베타리더 후기 xxx xxxii CHAPTER 1 이책에대하여 _1 1.1 처음 ios 개발을 하는 개발자를 위하여 1 1.2 ios 7 개발자를 위하여 2 1.3 예제 소스 코드 3 1.4 피드백 3 1.5 오탈자 4 CHAPTER 2 Apple ios개발자프로그램에가입하기 _5 2.1 애플 개발자 등록 5 2.2 Xcode 6와 ios 8 SDK 다운로드하기 6 2.3 ios 개발자 프로그램 6 2.4 언제 ios 개발자 프로그램에 가입할까? 6 2.5 ios 개발자 프로그램에 가입하기 7 2.6 요약 8 CHAPTER 3 Xcode 6와 ios 8 SDK 설치하기 _ 9 3.1 여러분의 맥이 인텔 기반인지 PowerPC 기반인지 확인하기 9 3.2 Xcode 6와 ios 8 SDK 설치하기 10 3.3 Xcode 시작하기 10 CHAPTER 4 Xcode 6가이드투어 _12 4.1 Xcode 6 시작하기 12 4.2 ios 앱 사용자 인터페이스 만들기 17 4.3 컴포넌트 속성 변경하기 20 4.4 사용자 인터페이스에 객체 추가하기 20 4.5 Xcode 6에서 ios 8 앱 빌드하고 실행하기 24 4.6 빌드 에러 처리하기 25 4.7 애플리케이션 성능 모니터링하기 25 4.8 사용자 인터페이스 레이아웃 계층구조의 분해도 26 4.9 요약 27 차례 v
CHAPTER 5 Xcode 6로 ios 8기기에서앱테스트하기 _28 5.1 Apple ID로 Xcode 설정하기 28 5.2 인증서 서명 생성하기 29 5.3 디바이스 등록 31 5.4 수동으로 테스트 디바이스 추가하기 33 5.5 등록된 기기에서 애플리케이션 실행하기 34 5.6 요약 35 CHAPTER 6 스위프트 플레이그라운드 소개 _ 36 6.1 스위프트 플레이그라운드란? 36 6.2 새로운 스위프트 플레이그라운드 생성하기 37 6.3 스위프트 플레이그라운드 예제의 기초 37 6.4 플레이그라운드 타임라인 38 6.5 플레이그라운드에서 UIKit으로 작업하기 40 6.6 언제 스위프트 플레이그라운드를 사용하나? 42 6.7 요약 42 CHAPTER 7 스위프트 데이터 타입과 상수, 그리고 변수 _ 43 7.1 스위프트 플레이그라운드 사용하기 44 7.2 스위프트 데이터 타입 44 7.3 스위프트 변수 48 7.4 스위프트 상수 48 7.5 상수와 변수 선언하기 49 7.6 타입 어노테이션과 타입 추론 49 7.7 타입 변환과 타입 검사 50 7.8 스위프트 튜플 51 7.9 스위프트 옵셔널 타입 52 7.10 요약 55 CHAPTER 8 스위프트 연산자와 표현식 _ 56 8.1 스위프트의 표현식 구문 56 8.2 기본 할당 연산자 57 8.3 스위프트 산술 연산자 57 8.4 복합 할당 연산자 58 8.5 증가 연산자와 감소 연산자 58 8.6 비교 연산자 59 8.7 불리언 논리 연산자 60 8.8 범위 연산자 61 8.9 삼항 연산자 61 8.10 비트 연산자 62 8.11 복합 비트 연산자 66 8.12 요약 66 vi 차례
CHAPTER 9 스위프트 흐름 제어 _ 67 9.1 반복문 흐름 제어 67 9.2 스위프트 for 문 67 9.3 do... while 반복문 71 9.4 반복문에서 빠져나오기 71 9.5 continue 문 72 9.6 조건부 흐름 제어 73 9.7 if 문 사용하기 73 9.8 if... else... 문 사용하기 74 9.9 if... else if... 문 사용하기 74 9.10 요약 75 CHAPTER 10 스위프트 switch문 _76 10.1 왜 switch 문을 사용해야 하나? 76 10.2 switch 문 사용하기 76 10.3 스위프트 switch 문 예제 77 10.4 case 문 결합하기 78 10.5 switch 문에서의 매칭 범위 78 10.6 where 문 사용하기 79 10.7 fallthrough 79 10.8 요약 80 CHAPTER 11 스위프트 함수와 클로저의 개요 _ 81 11.1 함수란 무엇인가? 81 11.2 스위프트 함수를 선언하는 방법 82 11.3 스위프트 함수 호출하기 83 11.4 외부 매개변수 이름 선언하기 83 11.5 디폴트 함수 매개변수 정의하기 84 11.6 함수로부터 여러 개의 결과 반환하기 85 11.7 함수 매개변수의 변수 개수 86 11.8 변수인 매개변수 86 11.9 입출력 매개변수로 작업하기 86 11.10 매개변수인 함수 88 11.11 클로저 표현식 90 11.12 스위프트의 클로저 92 11.13 요약 92 CHAPTER 12 스위프트의 객체지향 프로그래밍 기초 _ 93 12.1 객체란 무엇인가? 93 12.2 클래스란 무엇인가? 94 12.3 스위프트 클래스 선언하기 94 12.4 클래스에 인스턴스 속성 추가하기 95 12.5 메서드 선언하기 95 12.6 클래스 인스턴스 선언하고 초기화하기 96 12.7 클래스 인스턴스 초기화하기와 해제하기 97 차례 vii
12.8 메서드 호출하기와 속성 접근하기 98 12.9 저장된 속성과 계산된 속성 99 12.10 스위프트의 self 이용하기 101 12.11 요약 102 CHAPTER 13 스위프트의 상속 _ 103 13.1 상속, 클래스, 그리고 하위 클래스 103 13.2 스위프트 상속 예제 104 13.3 하위 클래스의 기능 확장하기 105 13.4 상속받은 메서드 오버라이딩하기 105 13.5 하위 클래스 초기화하기 107 13.6 SavingsAccount 클래스 이용하기 107 13.7 요약 108 CHAPTER 14 스위프트의 배열과 딕셔너리 컬렉션으로 작업하기 _ 109 14.1 가변형 컬렉션과 불변형 컬렉션 109 14.2 스위프트 배열 초기화 109 14.3 스위프트 배열로 작업하기 111 14.4 배열에 항목 추가하기 112 14.5 스위프트 딕셔너리 컬렉션 113 14.6 스위프트 딕셔너리 초기화 113 14.7 요약 116 CHAPTER 15 ios 8애플리케이션개발아키텍처개요 _117 15.1 ios 8 운영체제 아키텍처 개요 117 15.2 Model View Controller(MVC) 118 15.3 타깃-액션 패턴, IBOutlet과 IBAction 119 15.4 서브클래싱 120 15.5 델리게이션 120 15.6 요약 121 CHAPTER 16 상호작용하는 ios 8앱만들기 _122 16.1 새 프로젝트 만들기 122 16.2 사용자 인터페이스 만들기 122 16.3 예제 애플리케이션 빌드하고 실행하기 125 16.4 액션과 아웃렛 추가하기 126 16.5 완성된 애플리케이션을 빌드하고 실행하기 131 16.6 키보드 숨기기 131 16.7 요약 132 CHAPTER 17 ios 8뷰,윈도우,그리고뷰계층이해하기 _133 17.1 뷰에 대하여 133 17.2 UIWindow 클래스 133 17.3 뷰 계층구조 134 viii 차례
17.4 뷰 타입 136 17.5 요약 137 CHAPTER 18 ios 8자동레이아웃소개 _138 18.1 자동 레이아웃의 개요 139 18.2 정렬 140 18.3 고유한 콘텐츠 사이즈 140 18.4 콘텐츠 허깅 우선순위와 압축 제한 우선순위 141 18.5 컨스트레인트를 만드는 세 가지 방법 141 18.6 컨스트레인트에 대한 상세 내용 142 18.7 요약 143 CHAPTER 19 인터페이스 빌더에서 ios 8 자동 레이아웃 컨스트레인트로 작업하기 _ 144 19.1 자동 레이아웃의 간단한 예제 145 19.2 인터페이스 빌더에서 자동 레이아웃 켜고 끄기 144 19.4 인터페이스 빌더에서 새로운 컨스트레인트 생성하기 159 19.5 종횡비 컨스트레인트 추가하기 160 19.6 자동 레이아웃 문제 해결하기 160 19.7 요약 162 CHAPTER 20 ios 8자동레이아웃예제 _163 20.1 프로젝트 준비하기 163 20.2 사용자 인터페이스 설계하기 163 20.3 자동 레이아웃 컨스트레인트 추가하기 165 20.4 컨스트레인트 우선순위 조절하기 167 20.5 애플리케이션 테스트하기 170 20.6 요약 170 CHAPTER 21 코드로 ios 8자동레이아웃컨스트레인트구현하기 _171 21.1 코드에서 컨스트레인트 생성하기 171 21.2 컨스트레인트를 뷰에 추가하기 173 21.3 자동 리사이징 끄기 174 21.4 예제 애플리케이션 174 21.5 뷰 생성하기 175 21.6 컨스트레인트 생성하기와 추가하기 175 21.7 컨스트레인트 제거하기 177 21.8 요약 178 CHAPTER 22 ios 8에서 교차 계층구조 자동 레이아웃 컨스트레인트 구현하기 _ 179 22.1 예제 애플리케이션 179 22.2 아웃렛 구축하기 181 22.3 이전 컨스트레인트를 제거하는 코드 작성하기 182 22.4 교차 계층구조 컨스트레인트 추가하기 182 22.5 애플리케이션 테스트하기 183 22.6 요약 183 차례 ix
CHAPTER 23 ios 8자동레이아웃시각적형식언어이해하기 _184 23.1 시각적 형식 언어 소개 184 23.2 시각적 형식 언어 예제 184 23.3 constraintswithvisualformat 메서드 이용하기 186 23.4 요약 188 CHAPTER 24 사이즈 클래스를 이용하여 유니버셜 ios사용자인터페이스설계하기 _189 24.1 사이즈 클래스 이해하기 190 24.2 인터페이스 빌더에서의 사이즈 클래스 190 24.3 Any 디폴트 설정하기 191 24.4 인터페이스 빌더에서 사이즈 클래스로 작업하기 191 24.5 유니버셜 사용자 인터페이스 튜토리얼 193 24.6 아이패드 레이아웃 설계하기 194 24.7 유니버셜 이미지 에셋 추가하기 196 24.8 아이폰 레이아웃 설계하기 197 24.9 사이즈 클래스에 특정 이미지 파일 추가하기 198 24.10 중복 컨스트레인트 제거하기 200 24.11 레이아웃 미리 보기 201 24.12 애플리케이션 테스트하기 202 24.13 요약 202 CHAPTER 25 Xcode 6에서 스토리보드 사용하기 _ 203 25.1 스토리보드 예제 프로젝트 만들기 204 25.2 스토리보드 접근하기 204 25.3 스토리보드에 화면 추가하기 206 25.4 스토리보드 Segue 구성하기 207 25.5 스토리보드 전환 구성하기 207 25.6 뷰 컨트롤러와 화면 연결하기 208 25.7 화면들 간에 데이터 전달하기 209 25.8 스토리보드 Segue 되돌리기 210 25.9 프로그램으로 스토리보드 Segue 호출하기 211 25.10 요약 212 CHAPTER 26 Xcode 6의스토리보드를이용한 ios 8탭바애플리케이션만들기 _213 26.1 탭 바 개요 213 26.2 멀티뷰 애플리케이션의 뷰 컨트롤러 이해하기 214 26.3 탭 바 예제 애플리케이션 만들기 214 26.4 프로젝트 파일 살펴보기 215 26.5 콘텐트 뷰에 대한 뷰 컨트롤러 추가하기 215 26.6 탭 바 컨트롤러를 스토리보드에 추가하기 216 26.7 뷰 컨트롤러 사용자 인터페이스 설계하기 218 26.8 탭 바 아이템 설정하기 219 26.9 애플리케이션 빌드하고 실행하기 220 26.10 요약 220 x 차례
CHAPTER 27 Xcode 6스토리보드와 ios 8테이블뷰의개요 _221 27.1 테이블 뷰의 개요 222 27.2 정적 테이블 뷰 vs. 동적 테이블 뷰 222 27.3 테이블 뷰 델리게이트와 데이터소스 222 27.4 테이블 뷰 스타일 222 27.5 셀프-사이징 테이블 셀 224 27.6 동적 타입 224 27.7 테이블 뷰 셀 스타일 226 27.8 테이블 뷰 셀 재사용 226 27.9 요약 228 CHAPTER 28 Xcode 6스토리보드를이용하여프로토타입 테이블 뷰 셀이 있는 동적 테이블 뷰 만들기 _ 229 28.1 예제 프로젝트 생성하기 229 28.2 스토리보드에 테이블 뷰 컨트롤러 추가하기 230 28.3 UITableViewController와 UITableViewCell 하위 클래스 생성하기 231 28.4 셀 재사용 식별자 선언하기 232 28.5 스토리보드 UITableView 프로토타입 셀 설계하기 233 28.6 AttractionTableViewCell 클래스 수정하기 234 28.7 테이블 뷰 데이터소스 생성하기 234 28.8 이미지 파일 다운로드하여 추가하기 237 28.9 애플리케이션 컴파일하고 실행하기 238 28.10 요약 239 CHAPTER 29 Xcode 6에서 스토리보드를 이용한 ios 8테이블뷰내비게이션구현하기 _240 29.1 내비게이션 컨트롤러 이해하기 240 29.2 스토리보드에 새로운 화면 추가하기 241 29.3 내비게이션 컨트롤러 추가하기 242 29.4 스토리보드 Segue 구축하기 242 29.5 AttractionDetailViewController 클래스 수정하기 243 29.6 prepareforsegue를 이용하여 스토리보드 화면 간에 데이터 전달하기 245 29.7 애플리케이션 테스트하기 246 29.8 요약 246 CHAPTER 30 ios 8스플릿뷰마스터-디테일예제 _247 30.1 Split View와 Popover 개요 247 30.2 예제 스플릿 뷰 프로젝트에 대하여 248 30.3 프로젝트 생성하기 248 30.4 프로젝트 다시 살펴보기 249 30.5 마스터 뷰 항목 구성하기 249 30.6 디테일 뷰 컨트롤러 구성하기 252 30.7 마스터 뷰에 선택된 것과 디테일 뷰 연결하기 252 30.8 DetailViewController 클래스 수정하기 253 차례 xi
30.9 애플리케이션 테스트하기 254 30.10 요약 255 CHAPTER 31 UIPageViewController를 이용한 페이지 기반의 ios 8애플리케이션구현하기 _256 31.1 UIPageViewController 클래스 256 31.2 UIPageViewController 데이터소스 257 31.3 내비게이션 방향 257 31.4 스파인 위치 258 31.5 UIPageViewController 델리게이트 프로토콜 258 31.6 요약 259 CHAPTER 32 ios 8 UIPageViewController 예제 애플리케이션 _ 260 32.1 Xcode 페이지 기반 애플리케이션 템플릿 260 32.2 프로젝트 만들기 261 32.3 콘텐트 뷰 컨트롤러 추가하기 261 32.4 데이터 모델 만들기 263 32.5 UIPageViewController 초기화하기 266 32.6 UIPageViewController 애플리케이션 실행하기 268 32.7 요약 269 CHAPTER 33 ios 8에서 스위프트로 디렉터리 다루기 _ 270 33.1 애플리케이션 Documents 디렉터리 271 33.2 NSFileManager, NSFileHandle과 NSData 클래스 271 33.3 스위프트의 경로명 이해하기 271 33.4 디폴트 NSFileManager 객체에 대한 참조체 얻기 272 33.5 현재 작업 디렉터리 확인하기 272 33.6 Documents 디렉터리 확인하기 272 33.7 임시 디렉터리 확인하기 273 33.8 디렉터리 변경하기 274 33.9 새로운 디렉터리 만들기 274 33.10 디렉터리 삭제하기 275 33.11 디렉터리의 내용 나열하기 276 33.12 파일 또는 디렉터리의 속성 얻기 276 CHAPTER 34 ios 8에서 파일 다루기 _ 278 34.1 NSFileManager 인스턴스 만들기 278 34.2 파일이 존재하는지 확인하기 279 34.3 두 개의 파일 내용 비교하기 279 34.4 파일의 읽기가능/쓰기가능/실행가능/삭제가능 상태 확인하기 279 34.5 파일 옮기기와 이름 바꾸기 280 34.6 파일 복사하기 280 34.7 파일 삭제하기 280 34.8 심볼릭 링크 만들기 281 34.9 NSFileManager로 파일 읽고 쓰기 281 xii 차례
34.10 NSFileHandle 클래스로 파일 작업하기 282 34.11 NSFileHandle 객체 만들기 282 34.12 NSFileHandle 파일 오프셋과 검색하기 282 34.13 파일에서 데이터 읽기 283 34.14 파일에 데이터 쓰기 284 34.15 파일 자르기 284 34.16 요약 285 CHAPTER 35 ios 8디렉터리관리및파일입출력예제 _286 35.1 예제 애플리케이션 286 35.2 애플리케이션 프로젝트 설정하기 286 35.3 사용자 인터페이스 설계하기 287 35.4 애플리케이션 시작 시 데이터 파일 체크하기 288 35.5 액션 메서드 구현하기 289 35.6 예제 애플리케이션 빌드하고 실행하기 289 CHAPTER 36 ios 8앱에서iCloud저장소사용준비하기 _291 36.1 아이클라우드 데이터 저장소 서비스 291 36.2 아이클라우드 저장소 사용할 애플리케이션 준비하기 292 36.3 ios 8 애플리케이션을 위해 아이클라우드 지원 활성화하기 292 36.4 아이클라우드 권한 파일 확인하기 293 36.5 여러 개의 아이클라우드 컨테이너 접근하기 294 36.6 아이클라우드 컨테이너 URL 295 36.7 요약 295 CHAPTER 37 ios 8 UIDocument클래스로파일관리하기 _296 37.1 UIDocument 클래스의 개요 296 37.2 UIDocument 클래스의 하위 클래스 만들기 297 37.3 충돌 해결과 도큐먼트 상태 297 37.4 UIDocument 예제 애플리케이션 298 37.5 UIDocument 하위 클래스 생성하기 298 37.6 사용자 인터페이스 설계하기 298 37.7 애플리케이션 데이터 구조 구현하기 300 37.8 contentsfortype 메서드 구현하기 300 37.9 loadfromcontents 메서드 구현하기 301 37.10 앱 시작 시에 도큐먼트 로드하기 301 37.11 문서에 내용 저장하기 304 37.12 애플리케이션 테스트하기 305 37.13 요약 305 CHAPTER 38 ios 8 애플리케이션에서 icloud저장소사용하기 _306 38.1 아이클라우드 사용 가이드라인 306 38.2 아이클라우드 접근을 위한 icloudstore 애플리케이션 준비하기 307 38.3 뷰 컨트롤러 구성하기 307 38.4 viewdidload 메서드 구현하기 308 차례 xiii
38.5 metadataquerydidfinishgathering 메서드 구현하기 310 38.6 savedocument 메서드 구현하기 313 38.7 아이클라우드 도큐먼트와 데이터 저장소 활성화하기 313 38.8 아이클라우드 애플리케이션 실행하기 314 38.9 아이클라우드 기반의 문서 확인하고 삭제하기 315 38.10 로컬 파일을 어디서나 사용할 수 있게 만들기 315 38.11 요약 316 CHAPTER 39 icloud를이용한 ios 8키-값데이터동기화하기 _317 39.1 아이클라우드 키-값 데이터 저장소 317 39.2 애플리케이션 간의 데이터 공유 318 39.3 데이터 저장소의 제약 319 39.4 충돌 해결 319 39.5 키-값 변경 알림 받기 319 39.6 아이클라우드 키-값 데이터 저장소 예제 319 39.7 아이클라우드 키-값 데이터 저장소를 위해 애플리케이션 활성화하기 320 39.8 사용자 인터페이스 설계하기 320 39.9 뷰 컨트롤러 구현하기 321 39.10 viewdidload 메서드 수정하기 322 39.11 알림 메서드 구현하기 322 39.12 savekey 메서드 구현하기 323 39.13 애플리케이션 테스트하기 323 CHAPTER 40 아카이빙을이용한 ios 8데이터영구저장 _325 40.1 아카이빙 개요 325 40.2 아카이빙 예제 애플리케이션 326 40.3 사용자 인터페이스 설계하기 326 40.4 시작 시 아카이브 파일 존재 확인하기 328 40.5 액션 메서드에서 객체 데이터 아카이빙하기 329 40.6 애플리케이션 테스트하기 329 40.7 요약 330 CHAPTER 41 SQLite를이용한 ios 8데이터베이스구현 _331 41.1 SQLite란? 331 41.2 구조적 질의 언어(SQL) 332 41.3 맥 OS X에서 SQLite 사용하기 332 41.4 SQLite 연동을 위한 ios 애플리케이션 프로젝트 준비하기 334 41.5 SQLite, 스위프트, 그리고 래퍼 334 41.6 FMDB 클래스 335 41.7 데이터베이스 생성하기와 열기 335 41.8 데이터베이스 테이블 생성하기 336 41.9 데이터베이스 테이블에서 데이터 가져오기 336 41.10 SQLite 데이터베이스 닫기 337 41.11 요약 337 xiv 차례
CHAPTER 42 스위프트와 FMDB를이용한 SQLite기반iOS 8애플리케이션예제 _338 42.1 SQLite 애플리케이션 예제에 대하여 338 42.2 SQLite 애플리케이션 프로젝트 준비 및 생성하기 338 42.3 FMDB 소스 코드 체크아웃하기 339 42.4 사용자 인터페이스 설계하기 341 42.5 테이터베이스와 테이블 만들기 342 42.6 SQLite 데이터베이스에 데이터를 저장하는 코드 구현하기 344 42.7 SQLite 데이터베이스에서 데이터를 가져오는 코드 구현하기 344 42.8 애플리케이션 빌드하고 실행하기 345 42.9 요약 346 CHAPTER 43 코어데이터를이용한 ios 8데이터베이스작업 _347 43.1 코어 데이터 스택 347 43.2 매니지드 객체 348 43.3 매니지드 객체 콘텍스트 348 43.4 매니지드 객체 모델 348 43.5 영구 저장소 코디네이터 349 43.6 영구 객체 저장소 349 43.7 엔티티 디스크립션 정의 350 43.8 매니지드 객체 콘텍스트 얻기 351 43.9 엔티티 디스크립션 얻기 351 43.10 매니지드 객체 하위 클래스 만들기 352 43.11 매니지드 객체의 속성 설정하기 352 43.12 매니지드 객체 저장하기 353 43.13 매니지드 객체 가져오기 353 43.14 조건에 따른 매니지드 객체 가져오기 353 43.15 가져온 매니지드 객체의 데이터 접근하기 354 43.16 요약 354 CHAPTER 44 ios 8코어데이터튜토리얼 _355 44.1 ios 코어 데이터 예제 애플리케이션 355 44.2 코어 데이터 기반의 ios 애플리케이션 만들기 355 44.3 엔티티 디스크립션 만들기 356 44.4 매니지드 객체 하위 클래스 생성하기 357 44.5 엔티티 클래스 이름 수정하기 358 44.6 사용자 인터페이스 설계하기 359 44.7 매니지드 객체 콘텍스트 접근하기 360 44.8 코어 데이터를 이용하여 영구 저장소에 데이터 저장하기 361 44.9 코어 데이터를 이용하여 영구 저장소에서 데이터 가져오기 362 44.10 예제 애플리케이션 빌드하고 실행하기 362 44.11 요약 363 CHAPTER 45 ios 8 CloudKit 데이터 저장소 소개 _ 364 45.1 CloudKit 개요 364 45.2 CloudKit 컨테이너 365 차례 xv
45.3 CloudKit 공용 데이터베이스 365 45.4 CloudKit 개인 데이터베이스 365 45.5 데이터 저장소와 전송량 할당 366 45.6 CloudKit 레코드 366 45.7 CloudKit 레코드 아이디 368 45.8 CloudKit 참조체 368 45.9 CloudKit 에셋 369 45.10 레코드 존 369 45.11 CloudKit 구독 370 45.12 아이클라우드 사용자 정보 얻기 370 45.13 CloudKit 대시보드 371 45.14 요약 373 CHAPTER 46 ios 8 CloudKit예제 _374 46.1 예제 CloudKit 프로젝트에 대하여 374 46.2 CloudKit 예제 프로젝트 만들기 375 46.3 사용자 인터페이스 설계하기 375 46.4 아웃렛과 액션 구축하기 377 46.5 공용 데이터베이스 접근하기 378 46.6 키보드 숨기기 379 46.7 selectphoto 메서드 구현하기 379 46.8 클라우드 데이터베이스에 레코드 저장하기 381 46.9 notifyuser 메서드 구현하기 382 46.10 레코드 저장 메서드 테스트하기 382 46.11 클라우드 데이터베이스 레코드 검색하기 383 46.12 클라우드 데이터베이스 레코드 업데이트하기 385 46.13 클라우드 레코드 삭제하기 386 46.14 애플리케이션 테스트하기 386 46.15 요약 386 CHAPTER 47 ios 8 CloudKit 구독 예제 _ 388 47.1 푸시 알림과 CloudKit 구독 388 47.2 푸시 알림을 받기 위해서 앱 등록하기 389 47.3 CloudKit 구독 구성하기 390 47.4 원격 알림 처리하기 392 47.5 didreceiveremotenotification 메서드 구현하기 392 47.6 클라우드 데이터베이스에서 레코드 가져오기 393 47.7 didfinishlaunchingwithoptions 메서드 구현하기 394 47.8 애플리케이션 테스트하기 395 47.9 요약 395 CHAPTER 48 ios 8멀티터치,탭,그리고제스처에대하여 _396 48.1 리스펀더 체인 396 48.2 다음 리스펀더로 이벤트 전달하기 397 48.3 제스처 397 xvi 차례
48.4 탭 398 48.5 터치 398 48.6 터치 알림 메서드 398 48.7 요약 399 CHAPTER 49 ios 8터치,멀티터치,그리고탭애플리케이션 _400 49.1 ios 8 탭과 터치 예제 애플리케이션 400 49.2 ios Touch 프로젝트 생성하기 400 49.3 사용자 인터페이스 설계하기 401 49.4 뷰에서 멀티터치 활성화하기 402 49.5 touchesbegan 메서드 구현하기 402 49.6 touchesmoved 메서드 구현하기 403 49.7 touchesended 메서드 구현하기 403 49.8 터치 좌표 구하기 404 49.9 Touch 예제 애플리케이션 빌드하고 실행하기 404 CHAPTER 50 ios 8터치스크린제스처감지하기 _406 50.1 ios 8 제스처 예제 애플리케이션 406 50.2 예제 프로젝트 만들기 406 50.3 사용자 인터페이스 설계하기 407 50.4 touchesbegan 메서드 구현하기 408 50.5 touchesmoved 메서드 구현하기 408 50.6 touchesended 메서드 구현하기 409 50.7 제스처 예제 빌드 및 실행하기 409 50.8 요약 409 CHAPTER 51 ios 8 Gesture Recognizers를 통한 제스처 식별하기 _ 410 51.1 UIGestureRecognizer 클래스 410 51.2 인식기 액션 메시지 411 51.3 불연속 및 연속 제스처 411 51.4 제스처에서 데이터 얻기 412 51.5 탭 제스처 인식하기 412 51.6 핀치 제스처 인식하기 412 51.7 회전 제스처 인식하기 412 51.8 팬과 드래깅 제스처 인식하기 413 51.9 스와이프 제스처 인식하기 413 51.10 롱 터치(터치 앤 홀드) 제스처 인식하기 414 51.11 요약 414 CHAPTER 52 ios 8 Gesture Recognition 튜토리얼 _ 415 52.1 제스처 인식 프로젝트 만들기 415 52.2 사용자 인터페이스 설계하기 415 52.3 액션 메서드 구현하기 417 52.4 제스처 인식 애플리케이션 테스트하기 418 52.5 요약 418 차례 xvii
CHAPTER 53 ios 8앱에서터치아이디인증구현하기 _419 53.1 Local Authentication 프레임워크 419 53.2 터치아이디 가능 여부 검사하기 420 53.3 터치아이디 정책 판단하기 420 53.4 터치아이디 예제 프로젝트 421 53.5 터치아이디 사용 가능 여부 확인하기 422 53.6 터치아이디 인증 검색하기 423 53.7 애플리케이션 테스트하기 425 53.8 요약 426 CHAPTER 54 ios 8컬렉션뷰와플로우레이아웃의개요 _427 54.1 컬렉션 뷰의 개요 428 54.2 UICollectionView 클래스 429 54.3 UICollectionViewCell 클래스 430 54.4 UICollectionReusableView 클래스 430 54.5 UICollectionViewFlowLayout 클래스 430 54.6 UICollectionViewLayoutAttributes 클래스 431 54.7 UICollectionViewDataSource 프로토콜 432 54.8 UICollectionViewDelegate 프로토콜 432 54.9 UICollectionViewDelegateFlowLayout 프로토콜 433 54.10 셀과 뷰 재사용 434 54.11 요약 436 CHAPTER 55 ios 8스토리보드기반의컬렉션뷰튜토리얼 _437 55.1 컬렉션 뷰 예제 프로젝트 생성하기 437 55.2 템플릿 뷰 컨트롤러 제거하기 437 55.3 컬렉션 뷰 컨트롤러를 스토리보드에 추가하기 438 55.4 프로젝트에 컬렉션 뷰 셀 클래스 추가하기 439 55.5 셀 프로토타입 설계하기 440 55.6 데이터 모델 구현하기 442 55.7 데이터 소스 구현하기 443 55.8 애플리케이션 테스트하기 445 55.9 셀 항목에 대한 크기 설정하기 446 55.10 스크롤 방향 변경하기 447 55.11 추가적인 뷰 구현하기 449 55.12 추가적인 뷰 프로토콜 메서드 구현하기 451 55.13 요약 451 CHAPTER 56 ios 8컬렉션뷰플로우레이아웃의하위클래스만들기와확장하기 _452 56.1 예제 레이아웃 클래스에 대하여 452 56.2 UICollectionViewFlowLayout 클래스의 하위 클래스 만들기 453 56.3 새로운 레이아웃 클래스 확장하기 453 56.4 메서드 구현하기 454 56.5 layoutattributesforelementsinrect 메서드 구현하기 455 56.6 modifylayoutattributes 메서드 구현하기 456 xviii 차례
56.7 새로운 레이아웃과 핀치 제스처 인식기 추가하기 457 56.8 핀치 인식기 구현하기 458 56.9 이미지 잘림 피하기 459 56.10 애플리케이션 테스트하기 460 56.11 요약 461 CHAPTER 57 코어 그래픽스로 ios 8 2D그래픽그리기 _462 57.1 코어 그래픽스와 쿼츠 2D 소개 462 57.2 drawrect 메서드 462 57.3 점, 좌표, 그리고 픽셀 463 57.4 그래픽 콘텍스트 463 57.5 쿼츠 2D로 색 작업하기 464 57.6 요약 465 CHAPTER 58 인터페이스빌더라이브뷰와 ios 8임베디드프레임워크 _466 58.1 Embedded 프레임워크 466 58.2 인터페이스 빌더 라이브 뷰 467 58.3 예제 프로젝트 생성하기 467 58.4 임베디드 프레임워크 추가하기 469 58.5 프레임워크에 드로잉 코드 구현하기 470 58.6 설계할 수 있는 뷰 만들기 471 58.7 관리할 수 있는 변수 만들기 472 58.8 요약 473 CHAPTER 59 코어그래픽스와코어이미지를사용하는 ios 8그래픽튜토리얼 _474 59.1 ios 드로잉 예제 애플리케이션 474 59.2 새로운 프로젝트 만들기 474 59.3 UIView의 하위 클래스 만들기 475 59.4 UIView 하위 클래스에 drawrect 메서드 만들기 475 59.5 선 그리기 476 59.6 경로 그리기 478 59.7 사각형 그리기 479 59.8 타원 및 원 그리기 480 59.9 색으로 경로 채우기 481 59.10 호 그리기 483 59.11 3차 베지어 곡선 그리기 484 59.12 2차 베지어 곡선 그리기 485 59.13 점선 그리기 486 59.14 그림자 그리기 487 59.15 그라데이션 그리기 489 59.16 그래픽 콘텍스트에 이미지 그리기 492 59.17 코어 이미지 프레임워크를 통한 이미지 필터링 494 59.18 요약 496 차례 xix
CHAPTER 60 코어애니메이션을이용한 ios 8애니메이션기초 _497 60.1 UIView 코어 애니메이션 블록 497 60.2 애니메이션 커브 이해하기 498 60.3 애니메이션 종료 시 알림 받기 499 60.4 아핀 변환 수행하기 499 60.5 아핀 변환 결합하기 500 60.6 애니메이션 예제 애플리케이션 만들기 500 60.7 변수 구현하기 500 60.8 UIView에 그리기 501 60.9 화면 터치 감지하기와 애니메이션 수행하기 501 60.10 애니메이션 애플리케이션 빌드하고 실행하기 503 60.11 요약 504 CHAPTER 61 ios 8 UIKit다이나믹스개요 _505 61.1 UIKit 다이나믹스 이해하기 505 61.2 UIKit 다이나믹스 아키텍처 506 61.3 ios 8 애플리케이션에서 UIKit 다이나믹스 구현하기 508 61.4 다이나믹 애니메이터 초기화 508 61.5 중력 동작 설정하기 509 61.6 충돌 동작 설정하기 510 61.7 부착 동작 설정하기 511 61.8 스냅 동작 설정하기 513 61.9 푸시 동작 설정하기 513 61.10 UIDynamicItemBehavior 클래스 515 61.11 커스텀 동작을 생성하기 위하여 동작들을 결합하기 516 61.12 요약 516 CHAPTER 62 ios 8 UIKit다이나믹스 튜토리얼 _ 517 62.1 UIKit 다이나믹스 예제 프로젝트 생성하기 517 62.2 다이나믹 항목 추가하기 517 62.3 다이나믹 애니메이터 인스턴스 생성하기 519 62.4 뷰에 중력 추가하기 519 62.5 충돌 동작 구현하기 520 62.6 앵커 포인트에 뷰 붙이기 522 62.7 두 개의 뷰 사이에 스프링 연결 구현하기 524 62.8 요약 525 CHAPTER 63 ios 8스프라이트킷프로그래밍개요 _526 63.1 스프라이트 킷이란? 526 63.2 스프라이트 킷 게임의 핵심 요소들 527 63.3 예제 스프라이트 킷 게임 계층구조 530 63.4 스프라이트 킷 게임 렌더링 루프 531 63.5 스프라이트 킷 레벨 편집기 532 63.6 요약 532 xx 차례
CHAPTER 64 ios 8스프라이트킷레벨편집기게임튜토리얼 _533 64.1 스프라이트 킷 데모 게임에 대하여 533 64.2 SpriteKitDemo 프로젝트 생성하기 535 64.3 SpriteKit 게임 템플릿 프로젝트 리뷰하기 535 64.4 인터페이스 방향 제한하기 537 64.5 GameScene 스프라이트킷 화면 파일 수정하기 537 64.6 궁수 화면 생성하기 539 64.7 궁수 화면으로 전환하기 540 64.8 텍스처 아틀라스 추가하기 542 64.9 궁수 화면 설계하기 543 64.10 궁수 화면 준비하기 545 64.11 애니메이션 텍스처 아틀라스 준비하기 546 64.12 궁수 스프라이트 노드 애니메이션하기 547 64.13 화살 스프라이트 노드 생성하기 547 64.14 화살 쏘기 548 64.15 공 스프라이트 노드 추가하기 549 64.16 요약 551 CHAPTER 65 ios 8스프라이트킷충돌핸들링튜토리얼 _552 65.1 카테고리 비트 마스크 정의하기 552 65.2 카테고리 마스크를 스프라이트 노드에 할당하기 553 65.3 충돌과 접촉 마스크 구성하기 554 65.4 접촉 델리게이트 구현하기 554 65.5 노드들 간에 물리 연결 구현하기 556 65.6 게임 오버 557 65.7 요약 559 CHAPTER 66 ios 8스프라이트킷파티클이미터튜토리얼 _560 66.1 파티클 이미터란? 560 66.2 파티클 이미터 편집기 561 66.3 SKEmitterNode 클래스 561 66.4 파티클 이미터 편집기 사용하기 562 66.5 파티클 이미터 노드 속성들 564 66.6 파티클 이미터 편집기 경험해보기 566 66.7 파티클 이미터 효과를 이용하여 공 터트리기 567 66.8 터지는 파티클 이미터 효과 추가하기 569 66.9 요약 570 CHAPTER 67 ios 8앱에 iad연동하기 _571 67.1 애플리케이션 내에서 iad 실행할 준비하기 571 67.2 iad 광고 형식 572 67.3 iad 아이폰 예제 애플리케이션 만들기 576 67.4 Xcode 프로젝트에 iad 프레임워크 추가하기 576 67.5 배너 광고 활성화하기 576 67.7 삽입 광고 구현하기 579 차례 xxi
67.8 iad 테스트 설정하기 581 67.9 요약 582 CHAPTER 68 ios 8멀티태스킹,백그라운드전송서비스,그리고패칭 _583 68.1 ios 애플리케이션 상태 이해하기 583 68.2 멀티태스킹 애플리케이션의 생명주기에 대한 개념 584 68.3 멀티태스킹 지원 체크하기 585 68.4 ios 애플리케이션을 위한 멀티태스킹 활성화하기 586 68.5 지원되는 백그라운드 실행 형태 587 68.6 백그라운드 패치의 개요 587 68.7 원격 알림의 개요 589 68.8 로컬 알림의 개요 590 68.9 백그라운드 전송 서비스의 개요 590 68.10 백그라운드 실행 규칙 591 68.11 요약 591 CHAPTER 69 ios 8로컬알림예약하기 _592 69.1 로컬 알림 앱 프로젝트 생성하기 592 69.2 프로젝트에 사운드 파일 추가하기 593 69.3 퍼미션 요청하기 593 69.4 애플리케이션 델리게이트 메서드 위치시키기 594 69.5 로컬 알림 예약하기 594 69.6 애플리케이션 테스트하기 595 69.7 예약된 알림 취소하기 596 69.8 즉시 로컬 알림 호출하기 596 69.9 요약 596 CHAPTER 70 ios 8애플리케이션상태보존과복원의개요 _597 70.1 보존과 복원 절차 598 70.2 보존과 복원 선택하기 599 70.3 복원 식별자 할당하기 599 70.4 UIKit의 디폴트 보존 기능들 600 70.5 추가적인 상태 정보 저장하기와 복원하기 601 70.6 복원 절차 이해하기 602 70.7 일반적인 애플리케이션 상태 저장하기 603 70.8 요약 604 CHAPTER 71 ios 8상태보존과복원튜토리얼 _605 71.1 예제 애플리케이션 생성하기 605 71.2 상태 보존이 없는 애플리케이션 만들기 605 71.3 상태 보존 적용하기 606 71.4 복원 식별자 설정하기 606 71.5 뷰 컨트롤러 상태를 인코딩과 디코딩하기 607 71.6 스토리보드에 내비게이션 컨트롤러 추가하기 610 71.7 세 번째 뷰 컨트롤러 추가하기 611 xxii 차례
71.8 복원 클래스 생성하기 613 71.9 요약 614 CHAPTER 72 MKMapItem을이용하여 ios 8애플리케이션과지도통합하기 _615 72.1 MKMapItem과 MKPlacemark 클래스 616 72.2 순방향 및 역방향 지오코딩에 대한 소개 616 72.3 MKPlacemark 인스턴스 생성하기 618 72.4 MKMapItem으로 작업하기 618 72.5 MKMapItem 옵션들과 턴 방식 길찾기 활성화하기 620 72.6 상세 항목을 MKMapItem에 추가하기 620 72.7 요약 621 CHAPTER 73 ios 8 MKMapItem 애플리케이션 예제 _ 622 73.1 MapItem 프로젝트 생성하기 622 73.2 사용자 인터페이스 설계하기 622 73.3 순방향 지오코딩을 이용하여 목적지 변환하기 624 73.4 지도 실행하기 625 73.5 애플리케이션 빌드하고 실행하기 626 73.6 요약 627 CHAPTER 74 ios 8코어로케이션프레임워크를이용하여위치정보얻기 _628 74.1 코어 로케이션 매니저 628 74.2 위치 접근 허가 요청하기 629 74.3 로케이션 정확도 설정하기 629 74.4 거리 필터 구성하기 630 74.5 로케이션 매니저 델리게이트 630 74.6 위치 업데이트 시작하기 631 74.7 CLLocation 객체에서 위치 정보 얻기 632 74.8 거리 계산하기 633 74.9 위치 정보와 멀티태스킹 633 74.10 요약 633 CHAPTER 75 ios 8로케이션예제애플리케이션 _634 75.1 ios 8 로케이션 예제 애플리케이션 만들기 634 75.2 사용자 인터페이스 설계하기 634 75.3 CLLocationManager 객체 만들기 636 75.4 Usage Description Key 설정하기 637 75.5 액션 메서드 구현하기 637 75.6 애플리케이션 델리게이트 메서드 구현하기 637 75.7 로케이션 애플리케이션 빌드와 실행하기 639 CHAPTER 76 MapKit과 MKMapView클래스를이용하여iOS 8에서 지도 다루기 _ 641 76.1 MapKit 프레임워크에 대해 641 76.2 Map Regions 이해하기 642 차례 xxiii
76.3 MKMapView 튜토리얼에 대하여 642 76.4 지도 프로젝트 만들기 642 76.5 Xcode 프로젝트에 MapKit 프레임워크 추가하기 642 76.6 내비게이션 컨트롤러 추가하기 643 76.7 MKMapView 인스턴스와 툴바 생성하기 643 76.8 위치 정보 퍼미션 얻기 646 76.9 Usage Description Key 설정하기 646 76.10 맵 뷰 설정하기 647 76.11 MapView 영역 변경하기 647 76.12 지도 형식 변경하기 648 76.13 아이폰 MapView 애플리케이션 테스트하기 648 76.14 사용자 이동에 따른 맵 뷰 업데이트하기 649 76.15 요약 650 CHAPTER 77 ios 8에서 MapKit 로컬 검색 사용하기 _ 651 77.1 ios 8 로컬 검색 개요 651 77.2 MapSample 애플리케이션에 로컬 검색 추가하기 653 77.3 로컬 검색 텍스트 필드 추가하기 653 77.4 로컬 검색 수행하기 655 77.5 애플리케이션 테스트하기 657 77.6 요약 658 CHAPTER 78 ios 8맵길찾기와경로를얻기위하여 MKDirections이용하기 _659 78.1 MKDirections 개요 659 78.2 MapSample 애플리케이션에 길찾기와 경로 추가하기 661 78.3 프로젝트에 새로운 클래스 추가하기 661 78.4 결과 테이블 뷰 구성하기 662 78.5 결과 테이블 뷰 segue 구현하기 664 78.6 경로 화면 추가하기 665 78.7 경로와 방향 얻기 666 78.8 경로 segue 구축하기 668 78.9 애플리케이션 테스트하기 668 78.10 요약 669 CHAPTER 79 ios 8익스텐션소개 _670 79.1 ios 익스텐션 개요 670 79.2 익스텐션 타입 671 79.3 익스텐션 생성하기 676 79.4 요약 677 CHAPTER 80 ios 8투데이익스텐션위젯튜토리얼 _678 80.1 익스텐션 위젯 예제에 대하여 678 80.2 예제 프로젝트 생성하기 679 80.3 프로젝트에 익스텐션 추가하기 679 80.4 익스텐션 파일 리뷰하기 682 xxiv 차례
80.5 위젯 사용자 인터페이스 설계하기 682 80.6 코드로 원하는 콘텐츠 사이즈 설정하기 684 80.7 위젯 뷰 컨트롤러 수정하기 685 80.8 익스텐션 테스트하기 687 80.9 익스텐션에서 포함하는 앱 열기 687 80.10 요약 690 CHAPTER 81 ios 8포토에디팅익스텐션생성하기 _691 81.1 포토 에디팅 익스텐션 생성하기 691 81.2 포토 에디팅 익스텐션 접근하기 692 81.3 Info.plist 파일 설정하기 694 81.4 사용자 인터페이스 설계하기 695 81.5 PHContentEditingController 프로토콜 697 81.6 포토 익스텐션과 조정 데이터 697 81.7 콘텐츠 받기 698 81.8 필터 액션 구현하기 699 81.9 이미지를 사진 앱으로 반환하기 701 81.10 애플리케이션 테스트하기 703 81.11 요약 704 CHAPTER 82 ios 8액션익스텐션생성하기 _705 82.1 액션 익스텐션의 개요 705 82.2 액션 익스텐션 예제에 대하여 706 82.3 액션 익스텐션 프로젝트 생성하기 707 82.4 액션 익스텐션 프로젝트 생성하기 707 82.5 액션 익스텐션 설정하기 708 82.6 액션 익스텐션 사용자 인터페이스 설계하기 709 82.7 콘텐츠 받기 711 82.8 수정된 데이터를 호스트 앱에 돌려보내기 713 82.9 익스텐션 테스트하기 714 82.10 요약 716 CHAPTER 83 ios 8액션익스텐션에서데이터받기 _718 83.1 예제 프로젝트 생성하기 718 83.2 사용자 인터페이스 설계하기 718 83.3 애플리케이션에 공유 버튼 추가하기 719 83.4 애플리케이션에 공유 버튼 추가하기 720 83.5 익스텐션으로부터 데이터 받기 721 83.6 애플리케이션 테스트하기 722 83.7 요약 723 CHAPTER 84 날짜와위치기반의미리알림제작을위한iOS 8 Event Kit이용하기 _724 84.1 Event Kit 프레임워크의 개요 724 84.2 EKEventStore 클래스 725 84.3 데이터베이스에 있는 캘린더 접근하기 727 차례 xxv
84.4 미리 알림 생성하기 727 84.5 알람 생성하기 728 84.6 예제 프로젝트 생성하기 728 84.7 날짜/시간 기반의 미리 알림 화면을 위한 사용자 인터페이스 설계하기 729 84.8 미리 알림 코드 구현하기 730 84.9 키보드 숨기기 732 84.10 위치 기반 미리 알림 뷰 설계하기 733 84.11 위치 기반 미리 알림 생성하기 734 84.12 Usage Description Key 설정하기 737 84.13 애플리케이션 테스트하기 737 84.14 요약 738 CHAPTER 85 ios 8카메라와포토라이브러리접근하기 _739 85.1 UIImagePickerController 클래스 739 85.2 UIImagePickerController 인스턴스 만들고 구성하기 740 85.3 UIImagePickerController 델리게이트 구성하기 741 85.4 디바이스의 지원 여부 확인하기 742 85.5 무비와 이미지 저장하기 743 85.6 요약 744 CHAPTER 86 ios 8카메라예제애플리케이션 _745 86.1 예제 애플리케이션에 대하여 745 86.2 카메라 프로젝트 만들기 746 86.3 사용자 인터페이스 설계하기 746 86.4 액션 메서드 구현하기 747 86.5 델리게이트 메서드 구현하기 748 86.6 애플리케이션 빌드하고 실행하기 750 CHAPTER 87 AVPlayer와 AVPlayerViewController를 이용하여 ios 8비디오재생하기 _752 87.1 AVPlayer 클래스와 AVPlayerViewController 클래스 752 87.2 ios 무비 플레이어 예제 애플리케이션 753 87.3 AVKit 프레임워크를 Xcode 프로젝트에 추가하기 753 87.4 사용자 인터페이스 설계하기 753 87.5 비디오 재생 초기화하기 754 87.6 애플리케이션 빌드하고 실행하기 755 87.7 코드로 AVPlayerViewController 인스턴스 생성하기 755 87.8 요약 756 CHAPTER 88 AVAudioPlayer를이용하여 ios 8에서 오디오 재생하기 _ 757 88.1 지원하는 오디오 포맷 757 88.2 재생 알림 받기 758 88.3 재생 제어하기와 모니터링하기 758 88.4 오디오 예제 애플리케이션 만들기 759 xxvi 차례
88.5 프로젝트 리소스에 오디오 파일 추가하기 759 88.6 사용자 인터페이스 설계하기 759 88.7 액션 메서드 구현하기 761 88.8 AVAudioPlayer 객체 만들고 초기화하기 761 88.9 AVAudioPlayerDelegate 프로토콜 메서드 구현하기 762 88.10 애플리케이션 빌드하고 실행하기 763 88.11 요약 763 CHAPTER 89 AVAudioRecorder로 ios 8에서 오디오 녹음하기 _ 764 89.1 AVAudioRecorder 튜토리얼의 개요 764 89.2 녹음 프로젝트 만들기 765 89.3 사용자 인터페이스 설계하기 765 89.4 AVAudioRecorder 인스턴스 생성하기 766 89.5 액션 메서드 구현하기 767 89.6 델리게이트 메서드 구현하기 768 89.7 애플리케이션 테스트하기 769 CHAPTER 90 ios 8애플리케이션에트위터와페이스북통합하기 _770 90.1 UIActivityController 클래스 770 90.2 Social 프레임워크 771 90.3 Accounts 프레임워크 771 90.4 UIActivityViewController 클래스 이용하기 772 90.5 SLComposeViewController 클래스 이용하기 774 90.6 요약 776 CHAPTER 91 UIActivityViewController를이용한 ios 8페이스북통합튜토리얼 _777 91.1 페이스북 소셜 앱 생성하기 777 91.2 사용자 인터페이스 설계하기 777 91.3 아웃렛과 액션 생성하기 778 91.4 selectimage와 델리게이트 메서드 구현하기 779 91.5 키보드 감추기 780 91.6 페이스북에 메시지 포스팅하기 780 91.7 소셜 애플리케이션 실행하기 781 91.8 요약 782 CHAPTER 92 SLRequest를이용한 ios 8페이스북과트위터통합 _783 92.1 SLRequest와 Accounts 프레임워크 이용하기 784 92.2 SLRequest를 이용한 트위터 통합 784 92.3 SLRequest를 이용한 페이스북 통합 787 92.4 요약 789 CHAPTER 93 SLRequest를이용한 ios 8트위터통합튜토리얼 _790 93.1 TwitterApp 프로젝트 생성하기 790 93.2 사용자 인터페이스 설계하기 790 차례 xxvii
93.3 인터페이스 파일 수정하기 792 93.4 트위터 API 접근하기 793 93.5 gettimeline 메서드 호출하기 795 93.6 TableView 델리게이트 메서드 796 93.7 애플리케이션 빌드하기와 실행하기 797 93.8 요약 797 CHAPTER 94 SKStoreProductViewController 클래스로 판매하기 _ 798 94.1 SKStoreProductViewController 클래스 798 94.2 예제 프로젝트 생성하기 799 94.3 사용자 인터페이스 생성하기 800 94.4 스토어 킷 제품 뷰 컨트롤러 표시하기 800 94.5 델리게이트 메서드 구현하기 802 94.6 애플리케이션 테스트하기 802 94.7 요약 803 CHAPTER 95 ios 8 애플리케이션에 앱 내 결제 구축하기 _ 804 95.1 앱 내 결제 옵션들 804 95.2 앱 스토어가 호스팅하도록 콘텐츠 업로드하기 805 95.3 앱 내 결제 아이템 구성하기 805 95.4 제품 요청 전송하기 806 95.5 Payment Queue 접근하기 807 95.6 트랜잭션 감시자 객체 807 95.7 결제 시작하기 807 95.8 트랜잭션 처리 808 95.9 트랜젝션 복원 810 95.10 앱 내 결제 테스트 810 95.11 요약 810 CHAPTER 96 앱내결제를위한 ios 8애플리케이션준비하기 _812 96.1 예제 애플리케이션에 대하여 812 96.2 Xcode 프로젝트 생성하기 813 96.3 앱 내 결제를 위한 AppID 등록하고 활성화하기 813 96.4 itunesconnect에서 애플리케이션 설정하기 813 96.5 앱 내 결제 아이템 생성하기 814 96.6 요약 815 CHAPTER 97 ios 8앱내결제튜토리얼 _816 97.1 애플리케이션 사용자 인터페이스 816 97.2 스토리보드 설계하기 817 97.3 결제 뷰 컨트롤러 생성하기 818 97.4 앱 델리게이트 클래스에 Home View Controller 저장하기 820 97.5 ViewController 클래스 완성하기 821 97.6 PurchaseViewController 클래스 완성하기 822 97.7 애플리케이션 테스트하기 824 xxviii 차례
97.8 문제 해결 825 97.9 요약 826 CHAPTER 98 ios 8앱내결제를위하여앱스토어가호스팅하는 콘텐츠 구성하고 생성하기 _ 827 98.1 앱 내 결제에서 호스팅된 콘텐츠를 위한 애플리케이션 구성하기 827 98.2 콘텐츠 패키지를 호스팅하는 앱 내 결제 해부하기 828 98.3 콘텐츠 패키지를 호스팅하는 앱 내 결제 생성하기 828 98.4 호스팅될 콘텐츠 패키지 아카이빙하기 829 98.5 호스팅될 콘텐츠 패키지 검증하기 830 98.6 호스팅될 콘텐츠 패키지 업로드하기 831 98.7 요약 831 CHAPTER 99 ios 8애플리케이션을앱스토어에등록할준비하기와 제출하기 _ 832 99.1 ios 배포 인증서 검증하기 832 99.2 앱 아이콘 추가하기 834 99.3 시작 화면 설계하기 835 99.4 프로젝트를 팀에게 할당하기 836 99.5 배포를 위해 애플리케이션 아카이브하기 836 99.6 itunes Connect에서 애플리케이션 설정하기 837 99.7 애플리케이션 검증하기와 제출하기 838 99.8 리뷰를 위해 앱 설정하고 제출하기 839 찾아보기 841 차례 xxix
옮 긴 이 머 리말 애플의 8번째 모바일 운영체제인 ios 8은 2014년 6월 2일 Worldwide Developers Conference (WWDC)에서 발표되었습니다. 전 세계에 배포된 것은 같은 해 9월 17일이었죠. 제가 느끼기에 는 2014 WWDC는 스티브 잡스 이후로 가장 큰 행사가 아닐까 싶을 정도로 성대하게 치러졌 습니다(iOS 8을 발표하던 팀 쿡은 세션을 마치면서 U2 의 13번째 앨범(Songs of Innocence)을 itunes Store 에서 무료로 배포하는 깜짝 이벤트도 열었고, 저 역시 이때다 싶어서 얼른 itunes Store에 접속하여 내려받 았죠). ios 8이 개발자인 우리에게 전하는 메시지는 무엇이며, 어떤 기능들을 구현할 수 있도록 해주었을까요 ios 8에서 가장 눈에 띄는 특징 중 하나가 새로운 프로그래밍 언어인 Swift(스 위프트)의 도입일 것입니다. 애플은 차세대 ios 앱을 개발하기 위한 언어로 스위프트를 발표하 였습니다(물론, 여전히 오브젝티브 C 언어로도 개발할 수 있습니다). 개발자 대부분은 프로그래밍이 좋아서, 그리고 내 손으로 무언가를 만든다는 것이 좋아서 개 발자의 길을 걷고 있을 겁니다. 저도 그러합니다. 그렇게 개발을 좋아하는 개발자들이라도 가 능하다면 피하고 싶은 것 중에 하나가 새로운 언어를 배우는 것일 겁니다. 2014 WWDC에서 스위프트의 발표를 보고 저는 흥분과 짜증( )을 동시에 느꼈습니다. 스위프트를 배워야 하긴 할 텐데, 새로운 언어를 배운다는 것 자체가 큰 부담이었기 때문입니다. 게다가 오브젝티브 C 로 코딩해도 된다고 하지 않았는가 아마도 저처럼 이런저런 이유를 들며 스위프트를 반기면 서도 배우기를 꺼리는 개발자들이 많을 것으로 생각됩니다. 새로운 언어를 배운다는 것 자체가 힘든 것은 아닙니다. 정말로 힘든 것은 배운 것을 적절하게 사용하는 방법을 모른다는 점과 정말로 모르는 부분이 나오면 어떻게 해결해야 하는지조차도 모른다는 점입니다. 누군가 이런 얘기를 해준 적이 있습니다. 배워서 하려면 어렵지만, 하면서 배우기는 쉽다. 그렇습니다. 하면서 배우기는 쉽습니다. 저는 이 책뿐만 아니라 이 책의 이전 버전들도 번역했었는데, 개인적으로 이 책의 내용과 구성을 좋아합니다. 제가 번역해서 애착 xxx 옮긴이 머리말
이 가는 것이 아니라, 앞에서 말했던 하면서 배우는 방법을 사용하는, 즉 개발자의 입장에서 너무 보기 좋은 책이기 때문입니다. 이 책은 스위프트 언어와 문법에 대한 설명을 포함하고 있으며, 모든 예제 애플리케이션 역시 스위프트 언어를 사용하여 만들어졌습니다. 간단한 Hello World 부터 시작해서 심도 있는 주 제까지를 스위프트 언어로 어떻게 코딩하는지 보여주고 있습니다. 이 책은 스위프트 언어만 을 가르치고 끝내는 책이 아니라 어떻게 애플리케이션을 만들어갈 것인지도 보여줍니다. 물론, Xcode 6와 ios 8에 새롭게 도입된 기능들(예를 들어, 터치아이디(TouchID) 인증, 익스텐션 등)에 대 한 예제와 설명도 포함되어 있습니다. 어찌 보면 이 책은 새로운 언어인 스위프트에 대한 학습 과 ios 8의 새로운 기능을 구현하는 방법에 대한 습득이라는 두 가지 큰 목표를 두고 있습니 다. 이 책을 가장 먼저 읽어본 독자의 입장에서 감히 말씀드리자면, 여러분이 이 책을 끝까지 읽고 책을 덮을 때쯤에는 스위프트와 ios 8 애플리케이션 개발이라는 두 마리 토끼를 다 잡게 될 것입니다. 여러분의 성공과 멋진 앱을 기대하고 응원하겠습니다. 저의 개발 경험과 지식을 바탕으로 이 책을 먼저 읽고 우리말로 옮기는 작업을 하였지만, 저 역시 부족한 사람임을 잘 알고 있습니다. 이 책이 출간되어 여러분 손에 들려 있는 그 순간까 지 저를 포함한 여러 사람이 읽고 또 읽으면서 원서와 대조하기도 하고, 다시 번역도 해보면서 매의 눈으로 다듬은 결과물입니다. 하지만, 어쩌면 여러분이 이 글을 읽고 있는 지금도 아~ 라는 짧은 탄식과 함께 부족함을 발견하고 발을 동동 구르고 있을지도 모르겠네요. 이러한 아 쉬움을 조금이나마 채우고자 인터넷 카페(http://cafe.naver.com/petersbook)를 운영하고 있습니다. 많 이 놀러와 주세요. :) 부끄럽게도 저의 이름만이 표지에 있지만, 이 책이 나오기까지 많은 분의 관심과 노력이 없었 다면 불가능했음을 잘 압니다. 언제나 가야 할 길을 보여주시고 인도하시는 하나님께 감사와 찬양을 드립니다. 임신 중에도 항상 응원해주고 힘을 불어넣어 준 최고의 아내(강승희)에게 더 없이 큰 사랑과 고마움을 전합니다. 그리고 이제는 세상에 나와서 온 가족의 사랑과 귀여움을 독차지하고 있는 사랑하는 나의 딸(단비)에게도 사랑을 전합니다. 힘든 상황 속에서도 열정으 로 달리고 있는 트렌디앱(http://www.trendyapp.co.kr) 모두에게 격려와 박수를 보냅니다. 지금 이 시 각에도 멋진 책을 만들고 있는 제이펍 과 베타 리더들에게도 감사의 마음을 전합니다. 그리고 늘 보고 싶고, 그립고, 존경하는 제 아버지. 사랑합니다, 아버지! 2015년 따뜻한 봄에 황반석 옮긴이 머리말 xxxi
베 타 리 더 후 기 애플이 스위프트 언어를 발표한 지 1년이 다 되어가는데도 국내 서적이 몇 권 되지 않아 아쉬 웠는데, 이렇게 번역서가 나오게 되어 너무 반가웠습니다. 이 책을 통해 초보자는 개발환경을 구축하고 애플리케이션을 만드는 전 과정에 대해 알아볼 수 있을 것 같고, ios를 개발해본 사 람들은 기존에 사용했던 오브젝티브 C와 다른 새로운 기능을 이 책을 통해 빠르게 습득할 수 있을 것 같습니다. ios 프로그래밍 입문 초보자도 쉽게 다가갈 수 있게 스위프트부터 ios 8 SDK까지 잘 설명되 어 있었습니다. ios 8으로 할 수 있는 기본적인 내용이 모두 수록되어 있어서 ios 프로젝트 진 행 시 필요한 부분을 찾아보기에도 좋습니다. 또한, 책의 구성도 이론을 설명하는 장과 실습 할 수 있는 장이 나란히 배치되어 있어서 각각의 내용을 살펴보고 곧바로 구현해볼 수 있는 것도 강점으로 보입니다. 스위프트 기반으로 정말 다양한 ios의 기능을 다루는 책입니다. 스위프트 기본 문법부터 시 작하여 icloud 저장소, 데이터베이스, 멀티터치 및 탭, iad, 로케이션 등 ios의 기능 대부분을 소개하고 개발 예제를 다룹니다. 특히 튜토리얼에 대한 자세한 설명은 이해를 한층 도와줍니 다. 이러한 친절한 설명으로 ios 개발을 처음 시작하는 사람도 자신이 필요한 내용을 쉽게 찾 아 참조할 수 있을 것으로 보입니다. xxxii 옮긴이 머리말
NHN 실제 앱 개발에 필요한 핵심적인 내용으로 구성되어 있어서 필요한 부분만 그때그때 골라봐도 도움이 될 것으로 생각됩니다. 애플에서 새롭게 내놓은 스위프트 언어를 이용하여 쉽고 빠르 게 앱 개발을 해보고 싶은 사람들에게 추천합니다. 비교적 최근에 발표된 스위프트 언어와 ios 8 앱 개발에 대해 번역서가 아직 많이 없는 시점에 서 궁금한 점, 중요한 점을 시원하게 긁어주는 책이라고 생각합니다. 이 책으로 인해 좀 더 많 은 앱이 스위프트로 작성되길 바랍니다. 버킷 리스트 중 하나인 책 저술, 번역에 앞서 이렇게 베타 리딩이라는 좋은 방법으로 발을 내디딘 것 같아 만족스러운 기회였습니다. 스위프트 언어를 처음 접하거나 아이폰 개발을 염두에 두고 있다면 좋은 참고서로 생각됩니 다. 저자는 Xcode의 소개부터 개발자 등록, 스위프트 언어의 특징적 기능/예시, UI 구성에 화 두가 되고 있는 스토리보드/유니버셜 앱 제작 등을 포함해 앱 개발에 사용되는 기술 전반을 다루고 있습니다. 또한, 번역된 용어의 혼선이 예상되는 단어는 영어로 병기하신 역자의 센스 도 돋보입니다. >_< ios 8에는 상당히 많은 변화가 있었습니다. 또한, 스위프트라는 새로운 언어도 함께 나왔습니 다. 이런 변화를 빠르게 살펴보고 배우려면 이 책을 추천합니다. 제목 그대로 핵심만 나와 있 어서 입문서로는 부족할지도 모르겠지만, 기존에 ios 개발자에게는 딱 맞는 책입니다. 변화에 빠르게 적응할 필요가 있습니다. 이제 스위프트를 시작할 때입니다. 제이펍은 책에 대한 애정과 기술에 대한 열정이 뜨거운 베타리더들로 하여금 출간되는 모든 서적에 사전 검증을 시행하고 있습니다. 옮긴이 머리말 xxxiii
C H A P T E R 1 이책에대하여 이 책의 목적은 ios 8 SDK와 Xcode 6, 그리고 스위프트(Swift) 프로그래밍 언어를 이용하여 ios 애플리케이션을 생성하는 데 필요한 기술을 가르치는 것이다. 여러분이 ios 개발에 처음인지, 아니면 ios 7으로 작업한 경험이 있어서 ios 8의 기능들과 스 위프트 프로그래밍 언어를 빠르게 습득하고자 하는지에 따라 이 책의 활용 방법이 크게 달라 질 것이다. 하지만 이 책은 양쪽 모두를 대상으로 하고 있으니 안심해도 좋다. 1.1 ios 만일 여러분이 ios 개발에 처음이라면 이 책의 전체 내용이 여러분에게 필요할 것이다. 기초부터 시작하는 이 책은 ios 개발환경을 구축하는 데 필요한 전반적인 내용을 제공하며, ios 애플리케이션과 사용자 인터페이스 설계에 관하여 자세히 살펴본 다음, ios 8의 아키텍처와 스위프트 프로그래밍에 관해 소개한다. 더불어서 파일 핸들링, 데이터베이스 관리, 앱 내 결제 (In App Purchase), 그래픽 드로잉, 그리고 애니메이션을 다루며, 터치 스크린 핸들링, 제스처 인식, 멀티태스킹, iad 통합, 위치 관리, 로컬 노티피케이션, 카메라 접근, 그리고 비디오 및 오디오 재 생에 관한 지원도 다룬다. 이 외에도 자동 레이아웃, 트위터 및 페이스북 통합, 이벤트 미리 알 림, 앱 내 결제 내용을 관리하는 앱 스토어, 컬렉션 뷰 등을 포함한 다른 기능들도 다룬다. 게다 가 스프라이트 킷(Sprite Kit) 기반의 게임 개발, 로컬 맵 검색, 그리고 UIKit 다이나믹스를 이용한 1
사용자 인터페이스 애니메이션 등을 포함한 다른 기능들도 다룬다. 스위프트 플레이그라운드, 사이즈 클래스를 이용한 유니버셜 사용자 인터페이스 설계, 인터페 이스 빌더 라이브 뷰, 임베디드 프레임워크, 클라우드킷(CloudKit) 데이터 저장소, 그리고 터치 아이디(TouchID) 인증을 포함하여 ios 8 SDK와 Xcode 6의 새로운 핵심 기능들도 다룰 것이다. 따라서 이 책의 목표는 여러분의 ios 8용 앱을 만드는 데 필요한 기술들을 가르치는 것이다. 이 책은 여러분이 ios 8 SDK와 Xcode를 다운로드한 상태이며, 인텔 기반의 맥과 함께 개발하 려는 어떤 아이디어로 시작할 준비가 되었다고 가정한 채 진행할 것이다. 1.2 ios 7 여러분이 핵심만 골라 배우는 ios 7 프로그래밍 (제이펍) 책을 이미 읽었거나 ios 7 SDK에 대 한 경험이 있다면, ios 8의 새로운 내용들을 바로 읽어보고 싶을 것이다. ios 8과 Xcode 6에 도입된 모든 변경 사항과 특징을 반영하기 위하여 이 책의 모든 내용이 업 데이트되었다. 이전 버전의 책에 포함되지 않았거나 ios 8과 Xcode 6와 관련하여 다시 집필된 장들은 다음과 같다. 스위프트 플레이그라운드 (Playground) 소개 스위프트 데이터 타입과 상수, 그리고 변수 스위프트 연산자와 표현식 스위프트 흐름 제어 스위프트 Switch 구문 스위프트 함수와 클로저(Closure)의 개요 스위프트의 객체지향 프로그래밍 기초 스위프트 상속 소개 스위프트의 배열(Array)과 딕셔너리(Dictionary) 컬렉션으로 작업하기 사이즈 클래스(Size Class)를 이용하여 유니버셜(Universal) ios 사용자 인터페이스 설계하기 ios 8의 CloudKit 데이터 저장소 소개 ios 8 CloudKit 예제 ios 8 CloudKit 구독 예제 ios 8 앱에 터치아이디 (TouchID) 인증 구현하기 2 CHAPTER 1 이 책에 대하여
인터페이스 빌더 라이브 뷰(Live View)와 ios 8 임베디드(Embedded) 프레임워크 ios 8의 익스텐션(Extension) 소개 ios 8 투데이(Today) 익스텐션 위젯 튜토리얼 ios 8 포토 에디팅(Photo Editing) 익스텐션 생성하기 ios 8 액션(Action) 익스텐션 생성하기 ios 8 액션 익스텐션으로부터 데이터 받기 또, 다음의 내용이 변경되었다. 이 책의 모든 장은 새로워진 Xcode 6를 반영하기 위하여 필요한 모든 내용을 업데이트하 였다. 이 책의 모든 내용과 예제는 오브젝티브 C 대신에 스위프트 (Swift)를 사용한다. 테이블뷰 (TableView) 예제는 셀프 사이징(self sizing) 테이블 셀과 동적(dynamic) 타입을 반영 하도록 업데이트되었다. 스프라이트킷 (SpriteKit) 장은 새로워진 Xcode 6의 스프라이트킷 레벨 편집기(SpriteKit Level Editor) 환경을 사용하도록 업데이트되었다. SQLite 장은 FMDB 래퍼 (wrapper) 클래스를 사용하도록 업데이트되었다. 비디오 재생 장은 AVPlayerViewController와 AVPlayer 클래스를 사용하도록 변경되었다. 1.3 이 책에 포함된 예제의 소스 코드와 Xcode 프로젝트 파일은 다음의 URL에서 다운로드받을 수 있다. URL http://www.ebookfrenzy.com/jpub/ios8/ 혹은 http://www.jpub.kr의 이 책 소개페이지 1.4 여러분이 이 책을 선택한 것에 만족하기를 바란다. 혹시 이 책에 오류가 있거나 언급할 사항, 또는 질문 등이 있다면 feedback@ebookfrenzy.com(저자) 혹은 naya.peter@gmail.com(역자)으로 연 락하길 바란다. 1.4 피드백 3
1.5 이 책 내용의 정확성을 위해 많은 노력을 했지만, 다양하고 복잡한 주제를 다루는 책은 몇몇 오류와 실수가 있을 수 있다. 이 책에 대해 알려진 모든 오탈자와 그 해결책은 다음의 URL에 서 설명한다. URL http://www.ebookfrenzy.com/errata/ios8.html 혹시 위의 URL에 있지 않은 에러를 발견했다면 우리의 기술 지원팀의 이메일 주소인 feedback@ebookfrenzy.com으로 보내주길 바란다. 번역서에 대한 오탈자는 역자의 인터넷 카페(http://cafe.naver.com/petersbook)에서 확인할 수 있다. 4 CHAPTER 1 이 책에 대하여
C H A P T E R 2 Apple ios개발자프로그램에 가입하기 ios 8 기반의 아이폰 애플리케이션 개발의 첫 번째 단계는 등록된 애플 개발자(Registered Apple Developer)와 ios 개발자 프로그램 회원(iOS Developer Program Member)의 차이점에 대하여 확실히 이해하는 것이다. 차이점에 관해 이해하고 나면 어떤 종류의 ios 개발자 프로그램에 비용을 내고 가입하는 것이 좋은지 결정할 수 있을 것이다. 이번 장에서는 두 종류의 개발자 프로그 램에 대한 차이점과 비용, 혜택 등에 관해 살펴보고 등록하는 각 과정을 알아보기로 하자. 2.1 애플 개발자로 등록하는 데에는 별도의 비용이 들지 않는다. 간단하게 다음의 웹 페이지를 방 문하여 등록 절차를 시작하면 된다. URL http://developer.apple.com/programs/register/ 아이튠즈나 애플 스토어에서 사용하는 애플 ID를 가지고 있다면 그 계정을 가지고 등록할 수 있다. 등록 과정이 완료되면 온라인 문서나 튜토리얼과 같은 개발자 자료에 접근할 수 있으며, 이전 버전의 ios SDK와 Xcode 개발환경을 다운로드받을 수도 있다. 5
2.2 Xcode 6 ios 8 SDK 최신 버전의 ios SDK와 Xcode는 맥용 앱 스토어(App Store)에서 무료로 다운로드받을 수 있다. Xcode가 무료라서 ios 개발자 프로그램으로 업그레이드할 것인지, 아니면 그대로 등록된 애 플 개발자로 남아 있을지 결정해야 한다. 그래서 ios 개발자 프로그램이 주는 혜택이 무엇인 지를 이해하는 것이 중요하다. 2.3 ios ios 개발자 프로그램의 멤버십은 현재 1년에 99달러다. 멤버십에는 앞에서 말한 최신 버전의 ios SDK와 Xcode 개발환경을 다운로드받을 수 있는 권한이 포함되어 있다. 하지만 멤버십이 주는 혜택은 등록된 애플 개발자 수준을 훨씬 뛰어넘는다. 개발자 프로그램에 포함된 주요한 혜택들 중 한 가지는 실제 기기에서 애플리케이션을 테스트 할 수 있는 프로비저닝 프로파일과 인증서를 만들 수 있다는 점이다. Xcode에는 디바이스 시 뮬레이터가 있어서 대부분의 테스트를 수행할 수 있지만, 위치 추적과 터치아이디(TouchID) 인 증, 그리고 디바이스의 움직임과 같은 특정 기능들은 실제 기기에서만 테스트할 수 있다. 그리 고 중요한 점은 아이클라우드(iCloud) 접근과 미리 알림(Reminders), 그리고 앱 내 결제 관련 애 플리케이션은 실제 기기에서만 테스트할 수 있다는 것이다. 또한, ios 개발자 프로그램 멤버는 최신 ios SDK와 관련된 모든 종류의 지침서나 튜토리얼에 접근할 수 있으며, 더 중요한 것은 (1년에 단 두 번의 문의만 무료이긴 하지만) 애플의 ios 기술 지 원 엔지니어에게 기술 문의를 할 수 있다는 점이다. 가장 중요한 점은 ios 개발자 프로그램 멤버만이 앱 스토어를 통한 애플리케이션 판매 및 배 포를 할 수 있다는 점이다. 따라서 앱 스토어에 애플리케이션을 올리려면 어느 특정 시점에서는 개발자 프로그램 멤버에 가입해야 한다. 그렇다면 언제 가입해야 할까 2.4 ios ios 개발자 프로그램 멤버십이 여러 혜택을 제공하며, 특히 애플리케이션을 판매하기 위해서 는 필수적이라는 것이 분명해졌다. 그렇다 하더라도 지금 가입할지 아니면 나중에 가입할지는 6 CHAPTER 2 Apple ios 개발자 프로그램에 가입하기
개인적인 상황에 따라 다를 것이다. 만약 여러분이 ios 애플리케이션 개발에 관해 공부를 하 는 첫 단계이거나 아직까지 멋진 아이디어가 없다면, 등록된 애플 개발자 패키지가 제공하는 것이면 충분하다. 개발 관련 기술을 습득하고 애플리케이션 개발에 관한 아이디어를 충분히 가다듬은 후에 개발자 프로그램에 가입해도 늦지 않다. 반면에 조만간 프로그램 개발이 끝나고 배포를 계획하고 있거나 실제 기기에서 테스트해야 하 는 기능이 있다면 가능한 빨리 개발자 프로그램에 가입해야 한다. 2.5 ios 만약 지금 여러분이 속한 회사에서 사용할 ios 애플리케이션을 개발하려고 하는 것이라면, 회사가 이미 멤버십 가입을 했는지 확인하는 것이 필요하다. 가입되어 있다면 회사의 프로 그램 관리자에게 연락하여 개발 팀원으로 참여할 수 있도록 ios 개발자 프로그램 멤버 센터 의 초대장을 요청하자. 이 과정이 진행되면 멤버십을 활성화시킬 수 있는 링크가 포함된 You Have Been Invited to Join an Apple Developer Program 이라는 제목의 이메일을 애플로부터 받을 것이다. 여러분의 회사가 개발자 프로그램 멤버십 가입을 하지 않았다면 다음의 링크를 통해 가입할 수 있다. URL http://developer.apple.com/programs/ios/ 애플은 가입 옵션으로 기업과 개인의 두 가지 방법을 제공한다. 개인으로 가입하려면 신분을 증명하기 위한 신용카드 정보를 제공해야 한다. 기업으로 가입하려면 사업자등록증 및 법인에 대한 정보를 제공해야 한다. 개인용 멤버 등록은 보통 24시간 이내에 애플로부터 활성화(activation) 이메일이 올 것이다. 기 업용 멤버 등록은 추가적인 확인 사항이 많기 때문에 훨씬 긴 시간이 필요하며, 경우에 따라 수주 또는 수개월이 걸릴 수도 있다. 활성화를 기다리는 동안에도 아래 URL을 통해 애플 ID와 암호를 사용하여 로그인하면, 제한 적이긴 하지만 자료 접근이 가능하다. URL http://developer.apple.com/membercenter 로그인한 후 화면 상단의 Your Account 탭을 선택하면 개발자 프로그램 가입 상태가 Enrollment Pending 으로 보일 것이다. 2.5 ios 개발자 프로그램에 가입하기 7
2 1 활성화 이메일을 받은 후에 멤버 센터에 접속하면 그림 2 2와 같은 다양한 형태의 자료에 접근 이 가능하다. 2 2 2.6 ios 8 애플리케이션 개발 초기 단계에서 중요한 부분인, 등록된 애플 개발자 및 ios 개발자 프 로그램 멤버십 가입 시점에 대해 알아보았다. 이 장에서는 두 가지 프로그램의 개략적인 차이 와 개발자 프로그램에 대해 주의해야 할 점 및 등록 과정에 대해 간략하게 알아보았다. 다음 단계에서는 ios 8 SDK 및 Xcode 6 개발환경을 다운로드받고 설치하는 방법에 대해 알아보자. 8 CHAPTER 2 Apple ios 개발자 프로그램에 가입하기
C H A P T E R 6 스위프트 플레이그라운드소개 애플은 ios 8과 Xcode 6뿐만 아니라, ios 앱 개발의 기본인 오브젝티브 C를 대체하는 새로운 스위프트(Swift) 프로그래밍 언어를 발표하였다. 이 책에서는 9개의 장에 걸쳐 새로운 언어인 스위프트 기초에 대해 소개할 것이다. 또한, 이 책의 모든 샘플들은 새로운 프로그래밍 언어 인 스위프트를 이용하여 개발되었다. 스위프트 프로그래밍 언어에 대한 설명을 하기 전에 스위프트 플레이그라운드(Swift playground)를 먼저 살펴보도록 하자. 플레이그라운드는 Xcode 6에서 도입된 새로운 기능들 중 하나로, 훨씬 더 쉽게 스위프트를 배우고 ios 8 SDK를 경험할 수 있도록 해준다. 이번 장에서는 이후의 수 많은 스위프트 샘플에서 사용하게 될 개념들을 다룰 것이다. 6.1 플레이그라운드는 스위프트 코드를 입력할 수 있고 실행할 수 있으며, 실시간으로 그 결과를 볼 수 있는 대화형 환경이다. 이것은 표준 Xcode ios 프로젝트에서 일반적으로 이뤄지는 코딩/ 컴파일/실행/디버그 과정 없이 스위프트 구문을 배울 수 있도록 가상 환경을 만들어준다. 36
6.2 새로운 플레이그라운드를 생성하기 위해서 Xcode를 실행하고, 환영 화면(welcome screen)에서 Get started with a playground 옵션을 선택하거나 File New Playground 메뉴를 선택한다. 그 다음에 나온 화면에서 플레이그라운드 이름을 LearnSwift라고 하고 Platform 메뉴를 ios로 설 정한다. 설정이 끝났으면 Next를 클릭하고 저장될 적당한 위치를 선택하자. 플레이그라운드가 생성되었다면 다음과 같이 스위프트 코드를 입력할 수 있는 화면이 나타날 것이다. A B 6 1 화면의 왼쪽 패널(그림 6 1에서 A 로 표시된 부분)은 스위프트 코드가 입력되는 플레이그라운드 에 디터(playground editor)다. 오른쪽 패널(그림 6 1에서 B 로 표시된 부분)은 결과 패널(result panel)이라고 부르며, 플레이그라운드 에디터 패널에 입력한 스위프트 코드의 결과가 표시된다. 플레이그라운드 환경에 익숙해지려면 간단한 예제를 만들어보는 것이 가장 빠른 방법일 것이다. 6.3 아마도 모든 프로그래밍 언어에서의 가장 간단한 예제는 한 줄의 텍스트를 출력하는 코드를 작성하는 것이다. 스위프트 역시 예외는 아니다. 플레이그라운드 화면의 에디터 패널에 있는 현재 스위프트 코드를 삭제하자. 6.3 스위프트 플레이그라운드 예제의 기초 37
var str = "Hello, playground" 그런 다음, 다음과 같이 스위프트 코드를 입력한다. println("welcome to Swift") 위의 코드는 문자열 매개변수를 받아서 콘솔에 표시하는 내장된 스위프트 함수인 println을 호 출한다. 다른 프로그래밍 언어에 익숙한 독자라면 코드 끝에 세미콜론이 없다는 것을 알아차 렸을 것이다. 스위프트에서 세미콜론은 선택사항이며, 한 줄에 여러 개의 코드가 있을 때 그 것들을 구분하기 위해서만 사용된다. 위의 코드를 입력했다면 그림 6 2와 같이 에디터 패널 오른쪽의 결과 패널에 println을 호출한 결과가 보일 것이다. 6 2 6.4 플레이그라운드는 스위프트로 알고리즘을 만들고 테스트할 때 유용하며, 플레이그라운드 타 임라인 어시스턴트(Playground Timeline Assistant)와 결합하여 사용하면 특히 유용하다. 플레이그 라운드 에디터에서 위에 작성한 println 구문 아래에 다음의 코드를 입력하자. var x = 10 for index in 1...20 { let y = index * x -- } 38 CHAPTER 6 스위프트 플레이그라운드 소개
앞의 코드는 산술식을 수행하는 루프가 20번 반복한다. 위의 코드를 에디터에 입력했다면 플 레이그라운드는 루프를 실행할 것이며, 결과 패널에 몇 번 수행되었는지 표시될 것이다. 여기 서 흥미로운 점은 결과 패널에 나타난 결과 부분으로, 마우스 포인터로 가져가면 그림 6 3과 같이 두 개의 버튼이 나타난다는 것이다. 6 3 두 개의 버튼 중에 왼쪽에 있는 버튼은 퀵 룩(quick look) 버튼으로, 이를 선택하면 결과를 표시 하는 팝업 패널이 나타날 것이다. 현재는 그냥 (20 times) 라는 메시지만 보여주고 있지만, 나중 에 하게 될 사용자 인터페이스 뷰(view)나 그래픽 드로잉 코드를 가지고 작업할 때 더욱 유용 할 것이다. 오른쪽에 있는 버튼은 밸류 히스토리(value history) 버튼으로, 이것을 선택하면 플레이 그라운드 타임라인 어시스턴트 패널이 표시될 것이다. 지금은 타임라인 패널에 루프에서 생성 된 결과 값을 표시하는 그래프가 나타난다. 6 4 타임라인은 플레이그라운드 에디터 패널의 모든 표현식에 대한 밸류 히스토리를 기록하고 표 시한다. 예를 들면, 우리가 맨 처음에 입력한 println 구문도 항목으로 포함하고 있다. 6.4 플레이그라운드 타임라인 39
타임라인 패널의 하단에 있는 슬라이더(slider)를 움직이면 각 지점에서의 결과를 확인할 수 있 다. 예를 들어, 슬라이더를 왼쪽으로 움직이면 그래프의 여러 값들이 표시되는 것을 볼 수 있 을 것이다. 6 5 6.5 UIKit 플레이그라운드 환경은 간단한 스위프트 코드 구문만 할 수 있는 것이 아니다. 대부분의 ios 8 SDK를 플레이그라운드에서 테스트할 수도 있다. 위에서 플레이그라운드를 생성했을 때 ios UIKit 프레임워크를 임포트하는 코드가 이미 추가 되어 있었다. UIKit 프레임워크는 ios 애플리케이션용 사용자 인터페이스를 구현하는 데 필요 한 대부분의 클래스를 포함하고 있으며, 이 책에서 자세하게 설명할 부분이기도 하다. 플레이 그라운드의 가장 강력한 특징은 ios 8 SDK에 포함된 다른 프레임워크와 함께 UIKit을 사용할 수 있다는 것이다. 예를 들어, 다음의 코드는 UILabel 인스턴스를 생성하고 색상과 텍스트, 그리고 폰트 속성을 설정한다. let mylabel = UILabel(frame: CGRectMake(0, 0, 200, 50)) mylabel.backgroundcolor = UIColor.redColor() mylabel.text = "Hello Swift" mylabel.textalignment =.Center mylabel.font = UIFont(name: "Georgia", size: 24) mylabel 40 CHAPTER 6 스위프트 플레이그라운드 소개
위의 코드를 플레이그라운드 에디터에 입력하고, 결과 패널에서 마지막에 있는 레이블 객체 의 밸류 히스토리 버튼을 클릭하면 다음과 같이 표시될 것이다. 6 6 이번 예제는 퀵 룩 기능을 유용하게 사용할 수 있는 좋은 예제다. 이번 예제에서의 각 코드 줄 은 UILabel 인스턴스의 모양을 구성하는 스위프트 코드다. 첫 번째 줄의 퀵 룩 버튼을 클릭하 면 비어 있는 뷰가 표시될 것이다. 왜냐하면 레이블을 생성하긴 했지만 아직 시각적으로 보이 는 속성을 주지 않았기 때문이다. 하지만 배경색을 설정한 그 밑에 있는 퀵 룩 버튼을 클릭해 보면 빨간색 레이블이 표시될 것이다. 6 7 마찬가지로, 텍스트 속성을 설정하는 줄의 퀵 룩 버튼을 클릭하면 Hello Swift 라는 텍스트가 빨간색 레이블의 왼쪽에 정렬되어 표시될 것이다. 6 8 폰트를 설정하는 퀵 룩 버튼을 클릭하면 중앙 정렬된 Georgia 폰트의 레이블이 표시될 것이다. 6 9 mylabel 6.5 플레이그라운드에서 UIKit으로 작업하기 41
6.6 스위프트 플레이그라운드는 스위프트 프로그래밍 언어로 프로그래밍하는 방법을 배우기 위 한 이상적인 환경을 제공하며, 이후의 스위프트에 대해 설명하는 장에서는 플레이그라운드를 사용하길 권장한다. 스위프트의 기초를 배운 후에도 한동안은 플레이그라운드를 사용하는 것이 유용할 것이며, ios 개발에서 조금 더 고급 기술을 사용할 때도 많은 도움이 될 것이다. ios 8 SDK는 프레임워크들과 클래스들의 거대한 집합이다. 따라서 숙련된 개발자라도 프로젝 트에 코드를 추가하기 전에 익숙하지 않은 ios 기능들을 테스트해보게 될 것이다. 지난 경험 들을 비춰보면 원하는 기능을 구현하기 위해서 임시로 ios 프로젝트를 생성하고 코딩과 컴파 일, 그리고 실행을 반복하곤 했었다. 여러분도 이런 식으로 하기보다는 프로젝트를 할 때 플레 이그라운드에서 테스트를 하면서 프로젝트를 진행할 것을 권장한다. 6.7 이번 장에서는 스위프트 플레이그라운드에 대한 개념을 설명하였다. 플레이그라운드는 스위 프트 코드를 입력할 수 있는 환경과 동적으로 그 결과를 볼 수 있는 환경을 제공한다. 이것은 스위프트 프로그래밍 언어를 배우기 위한 환경을 제공할 뿐만 아니라 임의의 Xcode 프로젝트 를 생성하지 않고도 ios 8 SDK에 포함된 많은 클래스와 API를 테스트할 수 있게 해준다. 42 CHAPTER 6 스위프트 플레이그라운드 소개
C H A P T E R 34 ios 8에서파일다루기 이전 장에서는 Foundation 프레임워크의 NSFileManager, NSFileHandle과 NSData에 대해 알 아보았으며, 특히 ios 8 애플리케이션에서 NSFileManager를 이용하여 어떻게 디렉터리를 다루 는지에 대해 알아보았다. 또, ios에서 사용하는 파일 시스템 구조에 대해 다루었으며, 특히 각 애플리케이션에 할당되는 Documents 디렉터리와 임시 디렉터리에 대해 알아보고 애플리케이 션 코드에서 해당 디렉터리를 확인하는 방법에 대해 살펴보았다. 이번 장에서는 ios 8 SDK에서 파일을 처리하는 방법에 대해 알아보겠다. 파일 처리에 대한 이 론을 배운 다음, 다음 장에서 예제 애플리케이션을 만들어보자. 34.1 NSFileManager 진행하기에 앞서 다시 한 번 애플리케이션의 NSFileManager 인스턴스를 얻는 방법에 대해 알 아보자. 앞 장에서 언급한 것처럼 NSFileManager 클래스는 클래스의 인스턴스를 얻는 데 사 용되는 defaultmanager라는 클래스 메서드를 가지고 있다. 예를 들면, 다음과 같다. let filemgr = NSFileManager.defaultManager() 파일 매니저 객체를 얻었다면 이를 이용하여 기본적인 파일 처리 작업을 수행할 수 있다. 278
34.2 NSFileManager 클래스는 fileexistsatpath라는 인스턴스 메서드를 가지고 있으며, 이 메서드는 특정한 파일이 존재하는지를 체크한다. 이 메서드는 존재를 확인하고 싶은 파일 경로를 포함 한 파일명을 값으로 가진 NSString 객체를 인자로 가지며, 해당 파일이 존재하는지를 불리언 (Boolean) 값으로 반환한다. if filemgr.fileexistsatpath("/applications") { println("file exists") } else { println("file not found") } 34.3 contentsequalatpath 메서드는 두 개의 파일 내용이 같은지를 체크한다. 이 메서드는 비교할 두 개의 파일의 경로명을 인자로 받으며, 비교 결과를 불리언 값으로 반환한다. if filemgr.contentsequalatpath(filepath1, andpath: filepath2) { println("file contents match") } else { println("file contents do not match") } 34.4 대부분의 운영체제는 파일 접근 제어 수준을 제공한다. 일반적인 경우 파일에 대한 사용 자 혹은 사용자 그룹의 접근 수준을 속성의 형태로 제공한다. 그러므로 여러분의 프로그램 이 특정한 파일에 대해 쓰기, 읽기, 삭제 및 이름변경 권한이 있을 수도 있고 없을 수도 있 다. 프로그램에서 특정 파일에 대한 권한을 쉽게 확인할 수 있는 방법은 isreadablefileatpath, iswritablefileatpath, isexecutablefileatpath, isdeletablefileatpath 메서드를 이용하는 것이다. 각 메서드는 체크할 파일의 경로를 인자로 받으며, 결과를 불리언 값으로 리턴한다. 다음의 예 는 파일에 쓰기 권한이 있는지를 확인한다. if filemgr.iswritablefileatpath(filepath1) { println("file is writable") } else { println("file is read-only") } 34.4 파일의 읽기가능/쓰기가능/실행가능/삭제가능 상태 확인하기 279
위의 예제에서 다른 접근 권한을 체크하고 싶으면 위의 코드에서 iswritablefileatpath에 해당 하는 메서드 이름만 적절하게 바꿔주면 된다. 34.5 적절한 권한이 있다면 moveitematpath 메서드를 사용하여 파일 이름을 바꿀 수 있다. 이 메 서드는 불리언 값을 반환하며, 인자로는 옮겨질 파일의 경로명, 목적 경로명과 에러가 발생했 을 때 에러 정보를 저장할 NSError 객체를 가질 수 있다. 에러 정보가 필요하지 않으면 이 인 자는 nil로 설정한다. 해당 경로에 파일이 이미 존재하면 메서드 수행은 실패한다. var error: NSError? if filemgr.moveitematpath(filepath1, topath: filepath2, error: &error) { println("move successful") } else { println("moved failed with error: \(error!.localizeddescription)") } 34.6 파일의 복사는 copyitematpath 메서드를 통해 수행된다. 이동 메서드와 마찬가지로 소스, 목 적지 경로명과 선택적인 NSError 객체를 인자로 갖는다. 메서드 실행의 성공 여부는 반환되는 불리언 값으로 알 수 있다. var error: NSError? if filemgr.copyitematpath(filepath1, topath: filepath2, error: &error) { println("copy successful") } else { println("copy failed with error: \(error!.localizeddescription)") } 34.7 removeitematpath 메서드는 지정한 파일을 파일 시스템에서 제거한다. 이 메서드는 삭제할 파 일의 경로명과 선택적인 NSError 객체를 인자로 갖는다. 불리언 형식의 반환 값으로 메서드 수 행의 성공 여부를 확인할 수 있다. 280 CHAPTER 34 ios 8에서 파일 다루기
var error: NSError? if filemgr.removeitematpath(filepath1, error: &error) { println("remove successful") } else { println("remove failed: \(error!.localizeddescription)") } 34.8 심볼릭 링크(symbolic link)는 createsymboliclinkatpath 메서드에 의해 만들어지는 특별한 파 일이다. 이 메서드는 심볼릭 링크의 경로명, 심볼릭 링크가 가리킬 파일의 경로명과 선택적인 NSError 객체를 인자로 갖는다. var error: NSError? if filemgr.createsymboliclinkatpath(filepath2, withdestinationpath: filepath1, error: &error) { println("link successful") } else { println("link failed: \(error!.localizeddescription)") } 34.9 NSFileManager NSFileManager 클래스는 기본적인 파일 읽기와 쓰기 기능을 갖고 있다. 이들 기능은 NSFileHandle 클래스가 제공하는 기능에 비해 제한적이긴 하지만, 그래도 대부분의 경우 사 용할 수 있다. 먼저, contentsatpath 메서드를 이용하여 파일의 내용을 읽어 NSData 객체에 저장한다. let databuffer = filemgr.contentsatpath(filepath1) NSData 객체에 파일의 내용을 저장했다면 createfileatpath 메서드를 이용하여 새로운 파일을 만들 수 있다. filemgr.createfileatpath(filepath2, contents: databuffer, attributes: nil) 34.9 NSFileManager로 파일 읽고 쓰기 281
앞의 코드에서는 기존 파일의 내용을 읽어 새로운 파일에 썼다. 그렇지만 이 방법은 얼마나 많 은 데이터를 읽고 쓰는지 제어를 할 수 없으며, 기존 파일의 뒷부분에 데이터를 추가하는 방법 도 제공하지 않는다. 위의 예제에서 가리키는 파일 이 이미 존재하는 파일이고 어떠한 내용을 가지고 있다면 파일의 내용으로 덮어쓰게 된다. 따라서 좀 더 유연한 기능이 필요한데, 파운데 이션 프레임워크(Foundation Framework)의 NSFileHandle 클래스가 이를 제공한다. 34.10 NSFileHandle NSFileHandle 클래스는 파일과 관련된 좀 더 고급적인 메커니즘을 제공하기 위해 설계된 다 양한 메서드를 제공한다. 이 클래스는 파일뿐 아니라 디바이스나 네트워크 소켓(network socket) 을 다루는 데 사용될 수도 있다. 이어지는 절에서 이 클래스에 대해 알아보자. 34.11 NSFileHandle NSFileHandle 객체는 파일 읽기, 쓰기 혹은 갱신(읽고 쓰기)을 위하여 파일을 오픈할 때 만들어 질 수 있다. 오픈된 파일은 작업이 끝나면 반드시 closefile 메서드를 통해 닫아야 한다. 파일을 오픈하는 시도가 실패했다면(파일이 없는 경우 등) 이 메서드는 nil을 반환한다. 다음의 예제는 읽고 쓰기를 위해 파일을 단순히 열고 닫는 코드다. let file: NSFileHandle? = NSFileHandle(forReadingAtPath: filepath1) } if file == nil { println("file open failed") } else { file?.closefile() 34.12 NSFileHandle NSFileHandle 객체는 파일에서 현재의 위치를 가리키는 포인터를 관리한다. 이는 오프셋(offset) 이라고 불린다. 파일이 처음 오픈되었을 때 오프셋은 0(파일의 맨 앞)이다. 따라서 NSFileHandle 인스턴스 메서드를 이용하여 파일을 읽거나 쓸 때 오프셋은 0이다. 파일의 다른 위치에서 작 업이 필요할 때(예를 들면, 파일의 제일 끝에 데이터를 추가할 때)는 먼저 오프셋을 이동해야 한다. 생성될 파일로, 예제 코드에서는 filepath2를 말한다. 282 CHAPTER 34 ios 8에서 파일 다루기
예를 들면, 현재의 오프셋에서 파일의 끝으로 이동하는 경우 seektoendoffile 메서드를 사용 한다. seektofileoffset 메서드는 이동할 오프셋의 위치를 지정할 수 있다. 마지막으로, 현재의 오프셋은 offsetinfile 메서드를 사용하여 확인할 수 있다. 대용량의 파일을 처리하기 위해 오프 셋은 unsigned 64비트 정수형으로 저장된다. 다음의 예제는 읽기 위해 파일을 오픈하고 오프셋을 여러 위치로 이동하면서 그 시점의 오프 셋을 출력하기 위한 메서드들을 수행한다. let file: NSFileHandle? = NSFileHandle(forReadingAtPath: filepath1) if file == nil { println("file open failed") } else { println("offset = \(file?.offsetinfile)") file?.seektoendoffile() println("offset = \(file?.offsetinfile)") file?.seektofileoffset(30) println("offset = \(file?.offsetinfile)") file?.closefile() } 오프셋은 NSFileHandle 클래스를 이용하여 파일을 다루는 작업에서 중요한 개념이므로 이에 대해 충분히 이해해야 한다. 현재의 오프셋의 위치를 알지 못한다는 것은 데이터를 읽거나 써 야 할 파일의 위치가 어디인지 알지 못한다는 것이다. 34.13 파일이 오픈되고 파일 핸들이 할당되면 현재 오프셋에서 파일의 내용을 읽을 수 있다. readdataoflength 메서드는 지정한 바이트의 데이터를 파일의 현재 오프셋부터 읽는다. 예 를 들면, 다음의 코드는 파일의 오프셋 10부터 5바이트의 데이터를 읽는 것이다. 이 데이터는 NSData 객체에 캡슐화되어 반환된다. let file: NSFileHandle? = NSFileHandle(forReadingAtPath: filepath1) if file == nil { println("file open failed") } else { file?.seektofileoffset(10) let databuffer = file?.readdataoflength(5) file?.closefile() } 34.13 파일에서 데이터 읽기 283
반면, readdatatoendoffile 메서드는 현재 오프셋부터 파일의 끝까지 모두 읽는다. 34.14 writedata 메서드는 NSData 객체의 데이터를 현재의 오프셋부터 파일에 쓴다. 해당 오프셋에 이미 데이터가 있으면 내용을 삽입하는 것이 아니라 덮어쓰게 된다. quickfox.txt라는 파일이 다음과 같은 내용을 가지고 있다고 가정하자. The quick brown fox jumped over the lazy dog 이제 갱신을 위해 파일을 오픈하고 오프셋을 10으로 이동시킨 후 그 위치에 데이터를 쓴다. let file: NSFileHandle? = NSFileHandle(forUpdatingAtPath: filepath1) if file == nil { println("file open failed") } else { let data = ("black dog" as NSString).dataUsingEncoding(NSUTF8StringEncoding) file?.seektofileoffset(10) file?.writedata(data!) file?.closefile() } 위의 프로그램을 실행하면 quickfox.txt 파일의 내용은 다음과 같이 바뀔 것이다. The quick black dog jumped over the lazy dog 34.15 truncatefileatoffset 메서드를 사용하여 지정한 오프셋에서 파일을 잘라낼 수 있다. 전체 파일 의 내용을 잘라내려면 오프셋을 0으로 설정하고 이 메서드를 호출하면 된다. let file: NSFileHandle? = NSFileHandle(forUpdatingAtPath: filepath1) if file == nil { println("file open failed") } else { file?.truncatefileatoffset(0) file?.closefile() } 284 CHAPTER 34 ios 8에서 파일 다루기
34.16 다른 운영체제와 마찬가지로 ios도 사용자와 애플리케이션의 파일과 데이터를 저장하기 위해 파일 시스템을 제공한다. 이전 장과 이번 장에서 파일과 디렉터리를 다루는 방법에 대해 알아 보았다. 다음 장인 35장 ios 8 디렉터리 관리 및 파일 입출력 예제 에서는 ios의 파일과 디렉터리 처리를 위한 예제 프로그램을 만들 것이다. 34.16 요약 285
찾 아보기 숫자 및 기호.Down 413.exit 333.FiresOnce 391.FiresOnRecordUpdate 391.Left 413.Right 413.storyboard 확장자 17.swift 확장자 16.tables 333.Up 413.xcdatamodeld 356 // MARK: Table view data source 235 @IBDesignable 471 @IBInspectable 472 [Environment: Sandbox] 824? 문자 52 <app id> 273 <device id> 273 <user name> 273 A absolute path names 271 ACAccountStore 784 ACAccountType 784 Accounts 탭 28, 30 Accounts 프레임워크 771, 783, 784, 790 accountswithaccounttype 785 ACFacebookAudienceEveryone 788 ACFacebookAudienceFriends 788 ACFacebookAudienceKey 787 ACFacebookAudienceOnlyMe 788 ACFacebookPermission 787 Action Extension 674, 707 Action 119, 120, 126 Activate 692 activity view controller 672 ad refresh rate 581 AdBannerView 574 ADBannerViewDelegate 574, 578 Add Apple ID 29 Add Attribute 356 Add Attribute 버튼 350 Add Entity 356 Add Entity 버튼 350 Add Missing Constraints 376 addchildbehavior 516 addconstraint 173 addgesturerecognizer 411 addimage 775 addurl 775 adjustmentdata 703 afconvert 툴 758 Affected by Gravity 545 Affine transformations 500 AirPlay 752 alarmwithabsolutedate 728 alarmwithrelativeoffset 728 Align 메뉴 22 Alignment 167 All Frames in Container 22 allowablemovement 414 Allows Rotation 545 allowsediting 740 allowsrotation 515 찾아보기 841