홈페이지 연동 iOS 어플 개발

운영하고 있는 사이트 중 하나에서 안드로이드/iOS 어플 개발을 요청했습니다.
안드로이드 어플 개발은 다른 사람에게 맡기고, 저는 iOS 어플 개발을 맡았습니다.

안드로이드 어플 개발은 해 보았지만 iOS 어플 개발은 경험이 없었습니다.
그래서 두 가지 방법으로 공부를 시작했습니다.
1) iOS 어플 개발 카페 가입 – 맥부기 애플(iOS,Mac) 개발자모임
2) 관련 서적 구입 – 시작하세요! 아이폰 5 프로그래밍

iOS 어플 개발을 하기 위해서는 Mac OS가 설치된 기기가 필요했는데, 당장 맥북이나 아이맥을 구입할 형편이 못 되어서 기존 노트북 내에 VirtualBox를 설치하고 그 안에서 Mac OS 및 X Code를 설치하였습니다.
개발된 iOS 어플을 테스트하기 위해서는 iOS가 설치된 기기가 필요했는데, 아이폰보다는 저렴한 아이팟 터치 4세대를 선택했습니다.

개발이 완료된 후에는 99달러를 결제하고 iOS 개발자 등록을 신청했습니다.
안드로이드 개발자 등록에 비해 비용이 비싸고, 한 번 등록된 뒤에 평생 유지되는 것이 아니라 1년간만 유효하다는 점에서 차이가 있었습니다.
또한 개발자 등록이 즉시 이루어지는 것이 아니라 일주일 정도의 심사 기간을 거친 뒤에 허가되는 방식이었습니다.

개발자 등록을 마치고 어플 심사를 위해 binary 파일을 제출했습니다.
일 주일 정도 waiting for review 기간을 거친 뒤에 in review 상태로 전환되었고, 얼마 뒤에 어플 등록 승인을 받았습니다.

어플이 출시된 이후에 발견된 일부 버그를 수정하고, 기능들을 추가한 뒤에 다시 어플의 새 버전의 심사를 위해 binary 파일을 제출했습니다.
첫 어플 등록과 마찬가지의 기간을 거쳐 어플이 업데이트되었습니다.

어플을 개발하고 등록하는 과정에서 여러 가지 문제점들이 있었고, 이를 통해서 많은 것들을 배웠습니다.

문제점 #1. .xib 파일이 없는 문제

새 프로젝트를 생성하고 디자인을 하는 데까지는 기존 강좌들에 적혀 있는 방식대로 하면 되었지만, 프로젝트 탐색기에서 .xib 파일을 사용해야 하는 상황에서 .xib 파일을 찾지 못했고, .storyboard 파일만  찾을 수 있었습니다.

문제의 원인은 최신 버전의 iOS SDK를 사용하면 프로젝트를 생성할 떄에 xib 대신에 storyboard를 사용하는 것이 디폴트로 선택되어 있었기 때문입니다.
새 프로젝트를 생성할 때에, 이 옵션을 해지하여 기존 방식대로 개발을 할 수 있었습니다.

문제점 #2. 콜백 블럭에서 이벤트 처리 문제

와이파이 연결에는 아무 이상이 없는데 로그인을 하거나, 글을 불러오는 과정에서 시간이 너무 오래 걸리는 현상이 발생했습니다.
또한 로그인 버튼을 두 번 터치하면 어플이 예외를 발생시키는 상황도 발생했습니다.

문제의 원인은 안드로이드 어플에서와 마찬가지로, 어플의 메인 스레드가 아닌 스레드에서 메인 스레드를 건드리지 않아야 한다는 점 때문이었습니다.
보다 구체적으로는 로그인이나 글 읽기를 위해 HTTP Request를 보낼 떄에 sendAsynchronousRequest 메서드를 사용하였는데, 이 메서드의 콜백 블록에서 메인 스레드의 메서드를 직접 호출하면서 교착 상태에 빠지거나 예외가 발생한 것이었습니다.

이를 해결하기 위해서 처음에는 performSelectorOnMainThread라는 메서드를 사용하여 메인 스레드의 메서드를 호출했습니다.
그러나 이 경우에는 메인 스레드에 있는 메서드로 파라미터를 2개 이상 넘겨주기가 까다로웠습니다.
결국에는 dyspatch_sync라는 함수를 사용하여 해결하였습니다.

문제점 #3. 푸시 서비스 등록 문제

푸시 서비스는 시뮬레이터에서는 테스트해볼 수 없습니다.
실기기에서 테스트해 본 결과 푸시 서버로의 접속 자체가 이루어지지 않았습니다.
그러면서 콘솔에서는 다음과 같은 에러 메시지가 출력되었습니다.

no valid aps environment entitlement string found for application …

원인은 처음에 개발용으로 발급받은 프로비저닝 프로파일 때문이었습니다.
처음에 개발용으로 프로파일을 발급받을 당시에는 APNS 인증서를 발급받은 상태가 아니었기 때문에 프로파일 내에 푸시 서비스 등록에 대한 내용이 포함되어 있지 않았습니다.

이를 해결하기 위해서는 푸시 서비스 등록에 관한 내용이 포함된 프로비저닝 프로파일을 재발급 받아야 합니다.
처음에 발급받은 프로비저닝 프로파일은 재발급을 받더라도 푸시 서비스 등록 기능이 추가되지 않습니다.
따라서 처음 발급받은 개발용/배포용 프로비저닝 프로파일을 모두 파기하고 새로 프로비저닝 프로파일을 발급받아야 합니다.
그런 뒤 새 프로비저닝 프로파일을 등록하면 푸시 서비스가 잘 등록됩니다.

문제점 #4. Easy APNS를 사용한 푸시 알림 문제

애플의 개발자 센터를 통해서 APNS를 위한 인증서를 발급받아 서버에 설치하고 Easy APNS를 사용하여 푸시 메시지를 전송하도록 하였습니다.
그런데 서버에서 메시지를 전송해 보면 매번 실패했습니다.
처음에는 서버에서의 SSL 연결이 차단되어 있는 줄 알았지만, phpinfo를 사용해서 서버 환경을 조사해 보니 open ssl이 잘 작동하고 있었습니다.

나중에 원인을 알고 보니 인증서에 걸려 있는 암호 때문이었습니다.
Easy APNS에서는 기본적으로 인증서에 걸려 있는 암호를 따로 처리하지 않습니다.
따라서 암호가 없는 인증서를 설치하고 사용하거나, 또는 직접 Easy APNS의 소스를 수정하여 인증서에 걸려 있는 암호를 등록해 주어야 합니다.

문제점 #5. 검수 과정에서 접속 문제

검수를 위한 binary 파일을 제출하고 waiting for review 기간이 지나 in review 상태로 전환되었습니다.
그런데 얼마 지나지 않아 rejected 로 바뀌었고, 이유를 확인해 본 결과 demo 계정에서 어플 로그인이 이루어지지 않는다는 내용이었습니다.

원인을 확인해 보니 demo 계정에는 문제가 없었고, 검수하는 서버(해외)에서 기존 웹사이트 서버(국내)로의 접속이 이루어지지 않는 것이 문제였습니다.
다른 어플의 검수 과정에서도 이러한 경우가 종종 있다고 합니다.
이런 내용을 영어로 적어서 답장을 보내니, 유튜브에 어플의 모든 기능의 작동에 관한 영상을 찍어서 업로드하면 그것을 바탕으로 검수하겠다는 답변을 주었습니다.
그렇게 하여 검수를 통과하였습니다.

관련 포스트