Overview

프로젝트 인원 및 개발 파트

  • 1명

프로젝트 기간

  • 2018.06 ~ 2018.08

배운 점

  • UIWebView, 자바스크립트간 통신 방법
  • Instruments를 통한 디버깅 방법
  • 사파리를 통한 UIWebView 디버깅 방법
  • 크롬을 통한 안드로이드 웹뷰 디버깅 방법
  • 암호화 종류 및 암호화 기초 지식

어려웠던 점

  • 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에서의 UIViewController는 안드로이드에서 Activity다.
    • UIViewController에서 일반적으로 viewDidLoad()가 시작점이라면 안드로이드에서는 onCreate()가 시작점이다.
    • 안드로이드의 AndroidManifest를 보면 앱의 시작 Activity를 확인할 수 있다.
    • 안드로이드의 경우 Storyboard 대신 layout의 xml 파일을 보면 UI 구성을 확인해 볼 수 있다.
    • 안드로이드앱은 Java와 Java Script로 짜여져 있었고, Java와 Java Script를 몰랐지만, 대략적인 문맥은 이해할 수 있어서 요구사항 로직짜는 것에 참고를 할 수 있었다.

사용 라이브러리

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