아이폰 5s를 사용한 지 이제 일주일 정도가 지나서, 아이폰 5s에 대한 사용기를 적어보고자 한다.


참고로 나는 아이폰 3gs -> 아이폰 4s -> 아이폰 5s 로 갈아탄, 부모님꺼나 친구꺼 조금씩 만져본 걸 제외하면, iOS만 사용해본 사람이다.


에버노트에 끄적끄적 적어놨던 걸 복붙 하는거라, 그냥 음슴체로...



- 매우 빠르고 쾌적함. 물론 이건 아이폰 5s이기 때문이라기보단, 새로 나온 아이폰이기 때문인 것 같음. 아이폰 3gs에서 아이폰 4s로 갈아탔을 때도 매우 빠르고 쾌적했음.


- Touch ID(지문인식)이 정말 잘 됨. 평소에 아이폰을 그립(?)하는 것을 미리 생각하며 양 손 엄지손가락을 옆으로 기울인 채로 지문을 인식 시켜뒀는데, 지금까지 비밀번호를 직접 쓰며 잠금해제 한 적이 1~2번 정도밖에 없었음. 그 1~2번은 손씻고나서 아직 손이 마르지 않았을 때인데, 사실 바지에 쓱 하고 엄지손가락만 닦으면 인식 잘 됨.


- 아이폰 5s의 특징은 아니지만, 3G에서 LTE로 변경되고 나니 정말 빨라서 좋음. 3G일 때는 출근길에 지하철에서 웹툰 보려면 속터졌는데, 지금은 나름 쾌적하게 볼 수 있음. 페이스북이나 웹서핑도 쾌적함. 하지만 1년이 지나고 이 느낌이 익숙해지면 다시 느리다고 불평하고 있겠지...


- 아이폰 5s에서 가장 마음에 드는 것은 카메라. 최근 DSLR을 살까 말까 고민 중인, 사진의 '사' 자도 잘 모르는 사람이었는데 아이폰 5s 카메라의 성능을 확인하고는 잠시 카메라 구매에 대한 마음을 접음. 평소에 기본카메라는 잘 안 쓰고, 푸딩카메라를 쓰는데 만족하고 있음. 후면 카메라로 사진을 찍었을 때 그 느낌은 갤럭시 S4보다 훨씬 좋은 듯. 하지만 전면 카메라는 별로 좋지 않음.



- 핸드폰을 바꾸게 되면 엄청 설레고 벅찬 감정이 있어야 하는데, 포장된 박스를 처음 받았을 때만 설레고 iTunes를 이용해 동기화 하고나니 감흥이 바로 없어짐. 물론 iTunes를 이용한 동기화가 있기 때문에 기존에 있던 많은 앱들과, 앱 내의 데이터들을 그대로 사용할 수 있다는 것은 편하다고 생각함. 하지만 기존 아이폰 4s 사용할 때와 똑같은 느낌(빨라진 것만 빼면). 세로 길이가 길지만, 손바닥으로 아랫부분을 가리고 보면 기존 아이폰 4s랑 완전 똑같게 느껴짐. 


- 안드로이드는 조금씩만 사용해봐서 객관적인 비교는 되지 않지만, 개인적으로 아이폰 5s 구매를 후회하진 않지만, 안드로이드 폰(넥서스나 갤럭시S4)으로 바꿨어도 괜찮았을텐데 하는 생각은 듦. 안드로이드에 대한 동경이 아니라, 핸드폰을 새로 산 것 같은 느낌을 더 강하게 받고 싶은 마음..ㅋㅋ




총평 : 아이폰 5s는 정말 좋다. 하지만 아이폰 3gs -> 아이폰 4s -> 아이폰 5s로 5년 째 아이폰을 쓰다보니 약간 질리는 느낌이 드는 것은 사실. 기회가 된다면 안드로이드 OS도 내 폰으로써 사용해보고 싶다.


(사진 출처는 모두 Flicker)

최근에 '앱스토어 골드러시(정태훈)'를 읽고 있는데, 중간에 아이폰 어플리케이션 제작을 위해서는 팀이 각자 책임지는 일을 분담하여야 한다는 내용이 나온다. 그렇게 하지 않으면 인간은 게으르기 때문에, 서로에게 업무를 떠넘기다가 일정이 늦어지게 될 가능성이 있다는 것이다.

 

이렇게 분담해야 하는 업무를 크게 9가지로 적어주었는데, 당연하게 생각되면서도 참 분담하기에 적절히 나눴다고 생각한다. 물론 기획이나 각종 의사결정의 경우 함께 해야할 경우도 많이 있지만, 큼직하게 분담을 하면 그렇다는 것이다.

 

참고로 개발이나 디자이너가 포함되지 않은, 앱을 기획할 수 있는 사람들로만 이루어진 팀의 경우에 필요한 업무들이다.

<아이폰 어플리케이션 제작을 위해 필요한 업무들>

1. 마케팅

2. 외주 제작자 구인(개발자, 디자이너 등)

3. 앱 기획

4. 기획된 기획안에 따라 디자이너와 소통해 디자인을 만들어내는 일

5. 기획된 기획안에 따라 프로그래머와 소통해 프로그래밍을 지시하는 일

6. iTunes Connect 관리(엑셀 잘 하는 사람이 유리)

7. 애플 개발자 계정 만들기

8. 디스크립션 작성

9. 홈페이지 또는 블로그 관리

(출처 : 앱스토어 골드러시 by 정태훈)

 

그리고 아래 내용은, '앱스토어 골드러시'에서 본 내용 + 평소 주변의 어플리케이션 기획자, 개발자, 디자이너 등을 보며 느낀 내용 + 주어들은 지식으로 적은 내용이고, 나는 막상 앱 기획이나 개발이나 디자인을 해보지 않았으므로 좀 맘에 안 드는 내용이 있더라도 '그냥 그런가보다' 하고 넘어가주길 :)

 

1. 마케팅

어플리케이션의 경우 마케팅을 할 수 있는 방법이 그렇게 많지 않은 것 같다. 크게 2가지로 나누어서 광고와 마케팅이 있을 것 같은데, 광고의 경우 초기자본이 없는 사람들이라면 하기 어려우므로 패스. 마케팅은 돈이 안 드는 것들만 적어보자면 ...

1) 아이폰 관련 커뮤니티에 글을 올린다.

2) 만드는 앱의 특성과 관련된 커뮤니티에 글을 올린다.

3) 페이스북, 트위터 등 SNS를 이용해 알린다.

뭐 이 외에도 많이 있을 수 있지만, 효과적인 방법은 저정도? 블로그를 이용하는거는 아래에 있으므로 패스.

 

2. 외주 제작자 구인(개발자, 디자이너 등)

개발자, 디자이너를 구할 때는 개발자 커뮤니티, 디자이너 커뮤니티에 구인글을 올리는 것이 좋다고 한다. 맥부기라는 카페가 있는데, 여기에 글을 올려도 개발자, 디자이너들이 많은 것 같다. 구인을 할 때는 아이디어를 다 알려주기 보다는, 어떤 기능을 구현해야 하는지, 어떤 페이지 디자인들이 필요할지, 어느 정도 규모가 될지 등을 간단히 올리고 이에 적합한 사람을 구인한다. 그리고 포트폴리오를 받는 것이 좋다. 구인을 하고 나서 상세협의를 할 때는 기획이나 아이디어를 모두 알려줘야 하므로 아이디어 보호 서약서? 지적재산 보호 서약서? 이런걸 작성한다.

 

3. 앱 기획

말 그대로 어플리케이션을 기획한다. 아이디어가 있다면 이 아이디어를 문서로 나타내어 개발자나 디자이너에게 보여줄 수 있어야 한다. 처음에는 종이에 그리기를 시작하더라도, 나중에는 ppt에 깔끔하게 정리하는 것이 좋다. 일단은 생각나는 페이지를 모두 그려보고, 각 페이지의 설명을 간단히 쓰고, 그려진 페이지들을 연결하는 순서로 작업하는 것이 좋다.

 

4. 기획된 기획안에 따라 디자이너와 소통해 디자인을 만들어내는 일

기획된 기획안을 바탕으로 디자이너에게 필요한 디자인 내용들을 정리하여 보내고, 팔로우업한다. 이때 최대한 상세하게, 가능하면 예를 들어가며 설명해야한다. 자신은 머릿속으로 상상을 하며 그림을 그리고 글로 써서 보내주는 것이지만, 디자이너 입장에서는 다르게 생각될 가능성이 높기 때문이다. 커뮤니케이션이 정말 중요하다.

 

5. 기획된 기획안에 따라 프로그래머와 소통해 프로그래밍을 지시하는 일

디자이너와의 소통과 마찬가지로, 최대한 상세히 기록하고 설명하여 자신이 원하는 기능이 구현되도록 한다. 예를 들어 버튼을 눌렀을 때 화면 속의 공이 튀기는 기능을 구현하고 싶다면, 공은 어느정도 높이로 튀기게 하면 좋을지, 어느 정도 속도로 튀기게 하는게 좋을지(최고 높이까지 몇초만에 도달할것인지 등), 한번만 튀기고 말 것인지 점점 튀는 높이가 낮아지면서 계속 튈 것인지 등등 최대한 상세하게!(적어놓고 보니 좀 부적절한 예 같긴 하지만, 암튼 자세히...)

 

6. iTunes Connect 관리

이건 정말 한번도 사용해보지 않았는데, 앱스토에 올린 어플리케이션 매출을 확인해주는 앱이라고 한다. 엑셀을 잘 다루는 것이 좋다고 하는 것으로 보아 앱에서만 확인하는 것이 아니라, 엑셀로도 다운로드 받을 수 있는 형태가 아닌가 예상해본다. 근데 내 생각에 앱을 출시하기까지의 단계에서는 그냥 애플 개발자 계정을 만드는 사람이 같이 관리해도 좋을 듯...

 

7. 애플 개발자 계정 만들기

애플 개발자 홈페이지(http://developer.apple.com)에 들어가보면 1년에 $99를 지불하고 개발자 계정을 만들 수 있다. 앱스토어에 앱을 출시하거나, 실제 기기에서 테스트하려면 꼭 개발자 계정이 있어야 한다. 개인계정과 법인계정이 있는데, 개인계정은 쉽게 만들 수 있지만 법인계정의 경우 영문사업자등록증 등을 제출해야하므로 좀 귀찮을 수 있다. 참고로 Enterprise 계정도 있는데, 이는 1년에 $299를 지불한다. Enterprise 계정을 생성하면 앱스토어에는 앱을 올릴 수 없고, In-House App이라고 하여 웹을 통해 앱을 내부적으로 배포할 수 있다.

 

8. 디스크립션 작성

앱스토어에 올라간 앱의 설명, 스샷 등을 작성하는 작업이다. 어디선가 본 통계에서 젊은 층일 수록 스샷을 많이 참고하고, 나이가 있는 층일수록 설명을 많이 참고한다고 한다. 나의 경우에만 봐도 일단 스샷을 보고, 끌리면 다운로드를 클릭하고 설명을 읽어보는 것 같다.

 

9. 홈페이지 또는 블로그 관리

홈페이지나 블로그가 있다면 관리를 하는 역할. 하지만 앱을 처음 출시하는 입장이라면 홈페이지나 블로그가 없지 않을까? 뭐 블로그는 쉽게 만들 수 있긴 하지만... 블로그는 크게 2가지 목적을 가지고 운영, 포스팅할 수 있다. 하나는 기획자, 개발자의 스토리를 솔직하게 올리고 리뷰를 받을 수 있는 소통의 창으로서 활용한다는 것, 나머지 하나는 특정 키워드로 검색을 했을 때 상위에 노출이 되도록 함으로써 직간접적인 홍보를 할 수 있는 수단으로 활용한다는 것. 당연히 이 두가지 모두로 사용할 수도 있다. 그런데 나름 방문자수가 많았던 기업블로그를 운영해본 입장에서, 완전 단기간에 블로그에 포스팅을 하여 메인 포탈의 상위에 글을 노출시키긴 쉽지 않다. 앱을 만들어야지 하고 생각한 순간부터 블로그에 꾸준히 포스팅을 하다가, 앱이 완성된 시점(아마... 짧으면 1달, 길면 3달 정도?) 쯤에는 홍보를 위한 포스팅을 한다면 효과가 있을 것이다.

 

블로그 관련된 글 예전에 쓴거 같은데 임시저장만 해두고 발행을 안 했나보네.. 나중에 다시 정리해서 올려야지.

 

 

 

 


뷰를 전환할 때 모달 뷰(Modal View) 형태로 띄우고 싶을 경우를 위해 포스팅을 해본다. 해놓고 나니 완전 기초 코드였고 도대체 내가 왜 헤맸을까 싶기도 했지만, 처음에는 모달 뷰라는 것이 뭔지도 몰랐고 어버버버 하다가 구글링에 구글링을 거듭해 겨우 해냈던거 ㅜㅜ

 

0. 목표

우선 하려고 하는 바를 정리해보면, 뷰를 2개 만들고, 뷰1에서 버튼을 클릭하면 뷰2가 모달 뷰로 나타나도록 하고 여기에 전환 효과를 살짝 넣어보는 것이다. 그리고 뷰2에서 닫기 버튼을 클릭하면 모달 뷰가 사라지고 다시 뷰1이 나타나게 한다.

 

1. 뷰 2개 생성하기

뷰를 2개 만들어준다. 처음에 프로젝트를 생성할 때 view based project로 생성하면, "프로젝트명ViewController"와 함께 스토리보드 혹은 xib파일이 생성되니 이미 뷰 1개는 만든 것이다. 그리고 뷰 하나 추가는 New File을 생성할 때 View Controller Subclass로 생성하면 .h, .m, .xib파일이 하나씩 생성된다. 이로써 뷰 2개 생성은 완료! 아래 코드에서는 편의상 뷰1의 뷰컨트롤러는 뷰1.h, 뷰1.m라 하고, 뷰2의 뷰컨트롤러는 뷰2.h, 뷰2.m 이라고 하자.

 

2. 뷰1 헤더파일(뷰1.h)에 메서드 선언

- (IBAction)popupSetting;

이 메서드는 뷰1의 스토리보드나 xib에 만들 버튼에 연결할 메서드이다. 헤더파일에 선언 한 다음에 스토리보드나 xib에서 버튼 만들고, control + 클릭해서 touch on inside 오른쪽 원 부분 클릭하고 끌어서 popupSetting에 연결하면 된다.

 

3. 뷰1 구현파일(뷰1.m)에 메서드 정의

#import "뷰2.h"

일단 뷰2를 모달 뷰로 띄울 것이기 때문에, 뷰2.h를 임포트!

- (IBAction)popupSetting
{
    Setting *modalSetting = [[Setting alloc]initWithNibName:@"Setting" bundle:nil];
    [modalSetting setModalTransitionStyle:UIModalTransitionStylePartialCurl]; //모달뷰 전환효과
    [self presentModalViewController:modalSetting animated:YES];
}

메서드 내부에는 딱 저 3줄만 있으면 된다. 심지어 2번째 줄은 전환 효과를 위한 것이고, 전환 효과를 디폴트로 주고 싶으면 굳이 입력하지 않아도 된다.

 

4. 뷰2 헤더파일(뷰2.h)에 메서드 선언

-(IBAction)closeSetting;

모달 뷰로 사용될 뷰2에는 해당 모달 뷰를 닫기 위한 버튼을 만든다. 위의 뷰1에서 했던 것 처럼, 메서드를 생성하고 버튼에 메서드를 연결시키면 된다.

 

5. 뷰2 구현파일에 메서드 정의

-(IBAction)closeSetting
{
    [self dismissModalViewControllerAnimated:YES];
}

모달 뷰 닫기 버튼에 대한 메서드는 심지어 단 한 줄!

 

이렇게 한 후에 빌드를 해보면 시뮬레이터에서 모달 뷰가 아름답게 떴다가 사라졌다가 하는 것을 볼 수 있다. 잘 안 되면 아마 버튼과 메서드를 연결을 시키지 않아서일 가능성이 높음...

 

** 모달뷰 전환효과 더 알아보기

기본적으로 사용할 수 있는 모달 뷰 효과는 총 4가지이다. 위에서 이미 사용한 효과는 종이를 말아 올리는 듯한 효과이고, 아래에 있는 3개 효과도 추가로 있다. (디폴트는 CoverVertical이다.) 

    [modalSetting setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
    
    [modalSetting setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
    
    [modalSetting setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];

 

 

아이폰 수동 메모리 관리와 관련된 기초적인 내용.

그냥 읽으니깐 머리 속에 잘 안 들어와서 정리하는 겸 포스팅!

 

클래스/프로토콜 

메서드 이름

의미

 NSObject Protocol

 retainCount

 객체 혹은 인스턴스 변수가 특정 메모리 공간을 참조하고 있는가를 나타내주는 정수인 레퍼런스 참조 횟수 값을 저장.

 NSObject Class  alloc  생성된 객체에 메모리 공간을 할당. 객체에 메모리가 할당되면 retainCount 메서드에는 1이라는 값이 저장됨.
 NSObject Protocol  retain

 객체가 메모리 공간을 참조하고 있다는 사실을 아이폰에 알림. 메모리 주소는 가지고 있으나 메모리 공간을 사용할 수 없는 어떤 객체가 retain 메서드로 메모리 공간을 참ㅁ조하면 retainCount 메서드의 값은 1만큼 증가.

 NSObject Protocol  release

 객체가 현재 참조하는 메모리 공간을 더는 참조하지 말라는 명령을 내림. 실제로 release 메서드는 retainCount 메서드의 값을 1만큼 감소시킴.

 NSObject Class  dealloc

 메모리 공간을 참조하고 있는 모든 객체가 더는 해당 메모리 공간을 사용하지 말라는 명령을 내림. 어떤 조건이든 retainCount 메서드의 값이 0이 됨.

<참조 횟수를 관리하는 메서드>

 

alloc 메서드와 init 메서드를 통해서 하나의 객체가 생성되면, 사용자는 retain 메서드로 메시지를 보내 새로 생성된 객체가 메모리 공간을 참조하고 이를 사용할 권한을 가지고 있음을 알려주어야 한다(소유권). 또한 release 메서드는 객체가 지정된 메모리 공간을 참조할 필요가 없다는 것을 알려준다(소유권 반환). 정리하면 아래와 같다.

 1. 객체의 참조 횟수 값이 1 또는 그 이상일 경우 아이폰은 메모리 공간을 소유하고 사용할 수 있다.

 2. 객체의 참조 횟수 값이 0이 될 경우, 아이폰은 객체의 메모리 공간에 대한 소유권을 반환받아 할당되었던 메모리 공간을 회수한다.

 

객체의 메모리 할당, 참조, 반환 과정에 따른 참조 횟수의 변화를 보자.

먼저 Foo 클래스를 인스턴스화 하고, 메모리 공간을 할당한 첫 번째 객체 myFooOne을 만들어보자. 

 Foo * myFooOne = [[Foo alloc] init];   //retainCount = 1

이때 myFooOne 객체의 참조 횟수 값은 1이다. 이제 myFooOne 객체를 참조하는 두 번째 객체인 myFooTwo를 생성해보자.

 

 Foo * myFooTwo = myFooOne;    //retainCount = 1

 [myFooTwo retain];                   //retainCount = 2

첫 번째 줄은 myFooTwo 객체가 Foo 클래스를 인스턴스화 했으며 myFooOne 객체를 참조하도록 한다. 하지만 myFooOne 객체의 메모리 공간을 참조한다는 사실을 아이폰이 알고 있지는 않다. 따라서 메모리 공간의 참조 횟수 값은 여전히 1이다.

두 번째 줄에서는 retain 메서드를 사용하여 myFooTwo 객체가 myFooOne 객체와 같은 메모리 공간을 사용한다는 메시지를 myFooTwo 객체에 보낸다. 따라서 해당 메모리 공간의 참조 횟수 값은 2가 된다.

 

이제 myFooOne 객체와 myFooTwo 객체가 더 이상 필요하지 않다고 생가해보자. 이럴 때 사용자는 release 메서드를 사용하여 더는 해당 메모리 주소와 공간을 참조하지 않는다는 메시지를 myFooOne 객체와 myFooTwo 객체에 보낸다.

 [myFooOne release];    //retainCount = 1

 [myFooTwo release];   //retainCount = 0

이때 메모리 공간의 참조 횟수 값은 0이 되며, 아이폰은 myFooOne과 myFooTwo 객체가 함께 사용하던 메모리 공간을 회수한다.

 

 

 

출처 : iOS 앱 개발 시작을 위한 단계별 40개 예제 Objective-C 프로그래밍 (Mc Graw Hill 길벗 출판)


앱을 실행하는데 있어서, 간단한 설정값이나 데이터를 저장해야할 경우가 있다. 로그인이 필요한 앱의 경우에는 ID와 Password를 저장해야 할 것이고, 기타 설정들이 있을 경우 그 설정값들을 저장할 필요가 있다. 이 경우 별도의 DB를 이용하는 것이 아니라, 간단하게 값을 저장하고 불러와서 사용할 수 있다.


NSUserDefaults를 이용하면 되는데, 나도 자세한 내용은 모르므로 깊이있게 공부하고 싶다면 애플에서 제공하는 NSUserDefaults Class Reference를 참고하고, 여기서는 아주 간단하게 사용법만 소개!(혹시 틀리게 적은 내용이 있다면, 공격하진 마시구 조언 or 코멘트 부탁드립니다)



1. 설정값 저장하는 방법

아래 나와있는 코드처럼 작성하면 된다. setValue의 경우 id 형식으로 모든 데이터 타입을 담을 수 있고, forKey에는 String값으로 해당 데이터의 키값을 정하여 입력하면 된다.

[[NSUserDefaults standareUserDefaults] setValue:데이터 forKey:키값];


예를 들어 userID라는 이름의 textField에 입력되어있는 값을 saveID라는 키값으로 저장하고 싶다면 아래와 같이 입력하면 된다.

[[NSUserDefaults standardUserDefaults] setValue :userID.text forKey:@"saveID"];

 

그리고 Integer값으로 값이 바뀌었는지 안바뀌었는지 여부를 0 혹은 1로 저장하고 싶은 경우(키값은 isChange) 아래와 같이 입력하면 된다.

[[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"isChange"];


그리고 아래 코드를 한 줄 더 입력하게 되면 값이 저장되는 듯하다

[[NSUserDefaults standardUserDefaults] synchronize];



2. 설정값 불러오는, 사용하는 방법

저장한 데이터를 불러오는 방법은 더 쉽다. 아래와 같이 한 줄 입력하면 해당 데이터를 바로 사용할 수 있다.

[[NSUserDefaults standardUserDefaultsstringForKey:키값]

[[NSUserDefaults standardUserDefaults] integerForKey:키값]


아까 위에서 저장했던 saveID 키값의 데이터를 불러오고 싶다면

[[NSUserDefaults standardUserDefaultsstringForKey:@"saveID"]


isChange키값의 데이터를 불러오고 싶다면 

[[NSUserDefaults standardUserDefaults] integerForKey:@"isChange"]

코드로 바로 데이터를 사용할 수 있다.



뭣보다 코드가 쉬워서 너무 좋은듯!