아이폰 개발 요약

gisman

이 문서는 작성중입니다.

몇 가지 방법으로 변경사항을 확인 할 수 있습니다.


목차

도움말 이용방법을 잘 익힌다

아이폰 개발은 오브젝티브 씨 언어를 아는 것보다 코코아 라이브러리에 대해 아는 것이 중요하다. 그런데 코코아 라이브러리는 델리게이트 디자인 패턴을 적극적으로 쓰고, 클래스명, 함수나 상수의 이름이 보통 긴게 아니다. 20자 넘어가는 경우도 허다하다. 따라서 이런 복잡한 것을 외워서 쓰기보다는 도움말을 참고해서 복사하여 붙여 넣기 방식으로 개발하는 것이 좋다. 도움말에는 샘플 프로젝트 다운로드가 잘 나와 있으므로 적극적으로 활용해야 한다.

코드 완성 기능 사용

코드완성 기능은 MSVS 개발자라면 익숙한 기능일텐데, XCode도 마찬가지로 코드 완성 기능을 제공한다. 코코아 라이브러리의 명칭들이 매우 길기 때문에, 외우기 쉽지 않으니 코드 완성 기능은 아주 중요하다. 그리고 긴 명칭들을 다 외울 생각하지 말고 앞의 한 단어만 외운다. 이렇게 쉽게 쉽게 생각해야 한다.

코드 완성 리스트의 정렬 순서

코드 완성을 시키려고 하면 작은 스크롤 창이 나타나는데, 알파벳 순으로 나타나는게 기본 설정이다. 자주 쓰는 놈부터 나타나도록 설정을 바꾸면 편하다.

objective C 눈에 익히기

[self init] 이런 문법도 생소하지만, 함수 선언은 C++개발자에게 너무 이상하게 보이는데, 몇 가지 이해를 하면 좀 쉽게 읽힌다. 예)

- (BOOL)textFieldShouldReturn:(UITextField *)textField
  • 괄호로 묶은 것은 무조건 Type 이다.
  •  : 은 함수명과 파라미터 사이에 넣는다. ( )로 구분하는 C++과 다르다.
  • 앞에 붙은 -는 static이 아니라는 뜻.

위 함수를 C++ 형태로 바꾸면,

BOOL textFieldShouldReturn (UITextField * textField)

가 된다.

예) table뷰의 델리게이트 함수.

- (NSInteger) tableView:(UITableView*)table numberOfRowsInSection:(NSInterger)section

이렇게 파라미터가 여러 개인 함수들은 무지 헷갈린다. Objective-C는 함수명 사이에 파라미터가 올 수 있다는 점이 키포인트다. C++형태로 표현하면,

NSInteger  tableView_numberOfRowsInSection(UITableView* table, NSInterger section)

정도가 되겠다.

그리고 이 예에서 중요한 것은 이 함수가 tableView로 시작한다는 것이다. 코코아에서 이런 명명 규칙은 UITableView의 델리게이트 함수라는 것을 의미한다. 보통 tableView 라는 이름으로 멤버변수를 선언하는 경우가 많기 때문에, 위 함수명이 뭘 의미하는지 더 헷갈리기 쉽다. C++로 표현하면 tableView_numberOfRowsInSection이라고 이해하면 쉬운데, tableView.numberOfRowsInSection 라고 오해하면 절망하게 된다.

이런 명명규칙은 UIImage의 imageNamed 함수처럼 static 함수를 의미하기도 한다.

delegate 이해하고, 어떤 것들이 있는지 외우기

delegate 디자인 패턴은 코코아 프로그래밍의 필수중의 필수요소이다. 어떤 delete들이 있는지 눈에 익혀 둬야 한다. 아울러 C++의 상속에 해당하는 프로토콜에 대해서도 이해해야 한다.

클래스 선언과 구현, 프로퍼티 선언과 구현 익히기

클래스 선언부도 이상하고, @로 시작하는 이상한 키워드도 있고, 함수 선언은 더더욱 이상하다.

클래스 선언부와 @키워드는 외우거나 복사해서 붙여 넣기로 해결하는 수 밖에 없다. 언젠가는 저절로 외워지겠지만, 절대적인 시간이 필요하다. 어쩔 수 없다.

코드 모음집 만들기

코코아 프로그래밍은 외워서 해결하기 힘들다는 점을 받아들이고, 대신 빠르게 찾아서 쓸 수 있도록 자신만의 코드 모음을 만든다.

중요한 UI 요소들의 종류와 사용법을 익힌다

UI 요소들이 윈도와 다르다. 심지어 Cocoa Touch와 Cocoa도 꽤 다르다.

사용법도 RAD툴(델파이 , VB)의 콘트롤 사용법과도 다르고, 윈도 API나 MFC의 SendMessage 방식과도 많이 다르다. 어쩔 수 없다. 익숙해져야 한다. 핵심은 Delegate이다.


특히 테이블뷰에 대해 깊이 이해해야 한다. 가장 많이 쓴다.


멀티 뷰

뷰가 여러 개 들어가는 경우가 일반적이므로 탭뷰와 내비게이션 컨트롤러 사용법을 알아야 한다.

나는 어플리케이션을 제작할 때 뷰와 뷰 사이의 전환 관계부터 구현한다. 그 다음에 각 뷰 내에서의 코드를 작성한다.

GPS

PC와 스마트폰의 가장 큰 차이점은 들고 다닌다는 것이다. 다른 말로 하면 위치가 실시간이다. 따라서 GPS 좌표 사용법이 중요하다. 윈도 모바일 기기는 GPS 장치를 시리얼 포트로 잡아서 NMEA라는 규약으로 라인단위 텍스트를 읽어들여 파싱하여 좌표를 얻어내는 방식을 썼다.

하지만 아이폰은 GPS 신호를 파싱해서 적절한 시점에 통지해 준다. 역시나 delegate 패턴이다.

정확히 얘기하면 아이폰은 GPS뿐 아니라 3G나 wifi를 이용한 좌표를 알려준다. 따라서GPS가 안 달려있는 아이팟도 도심에서는 꽤 정확하게 위치를 알 수 있다.

framework이란?

framework이라는 용어는 특히 Java개발자들에게 혼란을 주는데, 아이폰에서 framework이란 단순히 .lib 라고 보면 된다.


문자열

카메라 라이브러리

UIImagePickerController

카메라 UI는 변경 불가. 반드시 프레임웍에서 제공하는 UIImagePickerController를 써야 하고 모달로 띄워야 한다. 대신 그 화면에 들어가기 전에 사용자에게 선택을 받는 버튼들(액션 시트)을 적당한 모양으로 바꾸는 방법으로 물 흐르듯 자연스러운 UI를 제공하는 것이 좋다.

카메라로 이미지를 만든 다음, 확대해서 클리핑 하는 것도 가능.

어플리케이션이 설치된 폴더와 하위 폴더만 접근 가능하도록 한 것을 샌드박스라고 부른다. 아이폰의 보안 문제를 해결하기 위한 방법으로서, 샌드박스를 벗어난 접근을 시도한다면, 앱스토어에 등록 심사를 통과할 수 없다. 따라서 가능한 폴더는 설치된 폴더와 그 하위폴더라고 딱 정해져 있으며, 그 외는 다 접근 불가능이다.

사진과 동영상 폴더도 경로를 통해 접근할 수 없다. 다만 UIImagePickerController 프레임웍에서 제공하는 클래스를 통해서만 접근할 수 있다. 아이폰의 디바이스 정보(예를 들어 카메라가 있냐 없냐 등) 역시 프레임웍을 통해서만 알아낼 수 있다.

폴더

현재 어플리케이션의 경로 찾기는 NSHomeDirectory()함수를 참고.

이미지

나는 .png만 사용함. 굳이 다른 포맷을 사용해야 한다면 png로 바꾸어서 서비스 하시는게 낫다고 생각함. 아이폰은 그래픽 효과를 중시하기 때문에, 코어 애니메이션이 제공하는 효과를 주려면 알파채널이 있는게 좋다고 생각함.

하지만 아이폰은 jpge, gif, tiff, bmp, ico등 다양한 이미지 형식을 지원함.

테이블뷰에 이미지 표시

테이블뷰의 각 레코드는 하위 뷰를 가질 수 있다. 따라서 레코드의 모양을 마음대로 변경할 수 있고, 물론 이미지와 텍스트를 display하는 것도 가능.

주소록

ABNewPersonViewController 참고

사운드

MPAVController를 참고. 오디오 관련 기능은 좀 복잡. 애플에서도 약간 오락가락 하는 거 같음(SDK 버전별로 달라짐)

지원 포맷을 검색해 보니 “MOV, MP4, MPV, M4V, and 3GP, as well as MP3,AIFF, M4A” 라고 함. Avi는 지원하지 않는 거 같음.

오디오 스트리밍

CoreAudio라는 라이브러리가 담당. 아래 문서를 참고.

http://developer.apple.com/legacy/mac/library/documentation/MusicAudio/Reference/CoreAudio/core_audio_types/core_audio_types.html#//apple_ref/doc/uid/TP30001108-CH210-DontLinkElementID_90


Notify 메시지(푸쉬메시지)

애플 푸시 노티피케이션 서비스(APNS)를 사용.

개념을 간략히 보면, 단말기와 애플의 APNS서버 사이에 커넥션이 하나 있고, 이 커넥션을 통해 보내진 메시지를 단말기가 해석하여 관련 어플리케이션에게 전달.

반드시 메시지가 전달된다고 보장하지 못 하므로 기획시 주의. 특히 와이파이 연결상태에서 전원절약 상태로 들어가면, 와이파이를 꺼버리므로, 메시지를 전달 받지 못 하는 경우가 많을 수 밖에 없음. 4.0 OS부터 백그라운드를 지원하므로, 직접 노티파이를 주는 방법을 고려해 보는 것도 좋겠다.

APNS를 통해 전달하는 메시지는 JSON형식으로 최대 256바이트. JSON안에는 표시할 문자열과 뱃지 숫자와 사운드 파일명이 들어감. 그 외에도 괄호나 따옴표 등의 JSON포맷 문자들이 포하되어야 하니, 보낼 수 있는 순수 메시지의 크기는 200바이트 정도로 보시는게 좋겠음.

메신저 어플이 푸시알람 서비스를 받을 수 있도록 하려면, 애플에서 인증서를 받아 추가하면 되고,

메신저 서버에서 APNS와 통신하려면, 애플이 정한 바이너리 포맷의 프로토콜을 사용해야 하며, PHP, Java등 많은 서버 환경의 통신 방법 소스코드들이 공개되어 있음.

참고한 정보는 “시작하세요 아이폰 프로그래밍” 이라는 책인데, 일곱장 정도 간략한 설명이 나옴. 자세한 정보는 애플 문서에서 About Local Notifications and Push Notifications 를 참고.

http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Introduction/Introduction.html

Map

디버깅, 로깅

단축키

시뮬레이터 초기화