Overview

기능 정의

홈화면

  1. 화면
  • Hdac, Bitcoin 지갑을 로딩할 수 있는 버튼이 있습니다.
  1. 기능
  • Hdac, Bitcoin 버튼을 누르면 해당 지갑을 로딩합니다.
  • 서버에 공지가 있는 경우 이를 공지합니다.
  • 약관의 업데이트가 있는지 체크합니다.
  • Hdac Survey가 진행중인지 체크합니다.

약관 동의 화면

  1. 화면
  • 이용약관 및 개인정보처리방침에 동의할 수 있는 체크박스와 버튼이 있습니다.
  1. 기능
  • 앱 최초 실행시 이용약관 및 개인정보처리방침에 동의해야만 하며, 한 번 동의하게 되면 약관의 업데이트가 발생하기 전까지 다시 동의받지 않습니다.

로그인 화면

  1. 화면
  • 지갑 생성, 지갑 복구 버튼이 있습니다.
  1. 기능
  • 지갑 생성과 복구를 구분하여 다른 url을 로드합니다.

지갑 복구 화면

  1. 화면
  • 지갑 생성시 주의사항에 동의하는 체크박스와 버튼이 있습니다.(생성시)
  • 12개의 복구단어를 보여줍니다.(생성시)
  • 12개의 복구단어를 입력 인풋창이 나타납니다.(생성, 복구 동일)
  1. 기능
  • 지갑 생성시 주의사항에 동의해야만 하며, 동의하지 않는 경우 지갑을 생성할 수 없습니다.
  • 입력된 12개의 단어를 대소문자 구문 없이, 띄어쓰기 한 칸 이상 무시하여 유효성을 검증합니다.
  • 유효하다면 다음으로 진행이 가능하며, 그렇지 않는 경우 생성 및 복구를 할 수 없습니다.

비밀번호 생성 화면

  1. 화면
  • 0~9 숫자패드와 지우기 버튼과 인디케이터가 있습니다.
  1. 기능
  • 0~9 사이의 4자리 숫자를 1차 2차 나눠서 입력받습니다.
  • 1차와 2차가 똑같이 입력됐는지 체크합니다.
  • 동일하다면 4자리의 PIN Code를 SHA256 방식으로 2번 암호화하여 저장합니다.
  • 12개의 복구단어의 경우 AES128을 이용하여 저장합니다.

지갑 메인 화면

  1. 화면
  • 지갑 잔액, 거래내역을 확인할 수 있는 페이지가 있습니다.
  • 코인 수신을 위한 QR코드 생성 페이지가 있습니다.
  • 코인 전송을 위한 QR코드 스캐너, 전송 인풋창이 있습니다.
  • 기타 앱의 설정을 관리하는 페이지가 있습니다.
  1. 기능
  • 거래내역을 클릭하면 전송과정, 수신 발신 여부 등 상세한 정보를 확인할 수 있습니다.
  • 새로고침 버튼을 누르면 애니메이션과 함께 새로고침 됩니다.
  • 받을 수량을 입력하면 QR코드가 업데이트 됩니다.
  • 주소를 누르면 주소를 복사합니다.
  • 주소와 요청 수량을 문자 메시지 등 다른 사람과 공유할 수 있습니다.
  • 전송시 주소, 수량 등의 유효성을 체크합니다.
  • 현재 통화, PIN Code를 바꿀 수 있으며 지갑 자체를 초기화 할 수 있습니다.
  • 개인정보처리방침, 이용약관을 다시 확인할 수 있습니다.

설문조사 화면

  1. 화면
  • 투표가 진행중인 경우 투표가 표시됩니다.
  • 결과보기의 경우 투표 결과를 Pie Chart로 나타냅니다.
  1. 기능
  • 투표 참여시 투표 내용을 서버에 전송합니다.
  • 결과보기의 경우 서버로부터 결과를 받아와 보여줍니다.

개발 기간

  • 약 1.5개월

어려웠던 점

  • iOS <-> 자바스크립트 통신
    • iOS는 안드로이드와 달리 자바스크립간의 통신이 동기식으로 작동하지 않는다.
    • 때문에 안드로이드에 맞춰진 자바스크립트의 경우 동기식으로 작동하는 구간을 비동기식으로 모두 바꿔줘야 했다.
    • 또 UIWebView의 경우 URL Scheme을 통해서 자바스크립트의 메시지를 받는데, 이 URL Scheme을 동시에 여러번 받는 경우 마지막 URL Scheme만을 받는다.
    • 따라서 URL Scheme을 전송할때도 그 과정을 다 끊어야만 한다. (예: 3번 보내고 3번 받기 = 실패, 1번 보내고 1번 받기 * 3 = 성공)
  • UIWebView 성능 이슈
    • 지갑 로딩 중 node를 생성하는 과정에서 해쉬함수를 여러번 반복하게 되는데 이때, iOS의 자바스크립트 성능 문제 때문에 로딩 시간에서 안드로이드와 큰 차이가 벌어졌다.
    • 아이폰의 경우 디바이스의 성능에 따라 로딩 시간이 크게 좌우됐음. (해당 과정 확인을 위해 사파리, 크롬에서 디버거, 타임라인, 네트워크 등 다양한 디버깅 도구 사용법 습득)
    • 그러나 해당 앱은 로컬로 저장된 HTML위에서 작동하기 때문에 WKWebView로 구현시 AJAX 미지원으로 인해 WKWebView로 진행할 수 없었다.
    • 결국 UIWebView를 쓸 수 밖에 없는 상황에서 해쉬함수 반복 회수를 줄이는 로직 수정으로 어느정도 보완하게 됐다.
    • WKWebView의 경우 UIWebView보다 약 2배 이상의 성능 향상을 가져오지만 CORS 정책을 따르므로 이와 관련된 문제가 있다.
    • 또 UIWebView의 경우 같은 페이지를 반복해서 열 경우 미리 생성된 캐시값을 사용하여 실행시간을 단축시킬 수 있었다.
  • 강제종료 현상
    • 0x8badf00d (일명 “ate bad food”) 현상과 함께 앱이 강제종료 되는 현상이 발생했다.
    • 해당 현상을 재현해보고자 했으나 계속 실패하다 결국에 성공했다. (앱이 강제종료 되면 바로 확인해보고자 계속 Xcode에서 빌드했지만 Xcode에서 실행하면 정상 작동했고, 설치만 해두고 Xcode 없이 실행하는 경우에는 재현이 됐다.)
    • 해당 증상은 일반적으로 어떤 문제 요인이 메인 스레드를 오래 동안 차단하게 되면서 시스템이 앱을 죽이는 현상이었다.
    • 메인 스레드는 사용자의 터치나 기타 컨트롤에 반응해야하는 책임이 있는데, 이를 차단하는 과정으로 인해 앱이 죽는 것이다.
    • 따라서 Xcode에서 해당 디바이스의 Crash log를 통해서 (command + shift + 2 -> View Device Logs) 앱이 죽는 위치를 찾아내 해당 과정을 수정하면서 해결했다.
  • 안드로이드 소스를 보면서 iOS 만드는 과정
    • 안드로이드 소스가 통째로 주어졌지만 안드로이드에 관한 지식이 전무했기에 힘든 부분이 있었지만 대충의 흐름은 알 수 있었다.
    • iOS에서의 ViewController는 안드로이드에서 Activity다.
    • ViewController에서 일반적으로 viewDidLoad가 시작점이라면 안드로이드에서는 onCreate가 시작점이다.
    • 안드로이드의 AndroidManifest를 보면 앱의 시작 Activity를 확인할 수 있다.
    • 안드로이드의 경우 Storyboard 대신 layout의 xml 파일을 보면 UI 구성을 확인해 볼 수 있다.
    • 안드로이드앱은 Java와 Java Script로 짜여져 있었고, Java와 Java Script를 몰랐지만, 대략적인 문맥은 이해할 수 있어서 요구사항 로직짜는 것에 참고를 할 수 있었다.

사용 라이브러리

  • Alamofire
  • Crashlytics
  • CryptoSwift
  • Fabric
  • NVActivityIndicatorView
  • QRCodeReader
  • RKPieChart
  • SwiftyJSON
  • Toast-Swift