if kakao 2019 - App Initialization with Priority Queue / Sheldon님

- 8 mins

19/12/23

if (kakao) dev 2019

App initialization with priority queue - Sheldon (이상규)님

이번 세션은 카카오 T가 어떻게 초기화 과정을 거치는지에 대한 소개하지만, 일반적으로 개발자들이 겪을 수 있는 이슈나 사례를 소개하고, 그 것들을 잘 해결 하기 위해서 특정 자료구조를 활용한 방안에 대해서 고민해보고자 함.

초기화를 먼저 생각해보자.

카카오 T의 초기화 과정

Priority Queue?

카카오 T initialization로 돌아가보면..

But Why Priority Queue?

  1. Login Task
    • Task4에서 예외처리가 났을 경우, 결국, Task1로 보내야한다. 물론, 캐싱, 함수를 나누던지 여러 방법이 있지만 복잡해짐.
    • Ex) Get my Information -> Check Kakao Auth*Exception 발생
         struct TaskKakaoLoginAction: TaskActionable {
       func runTask(param: Any?) {
         if KOSession.shared().state == .open {
           self.nextTask()
           return
         } else { //카카오 인증이 정상적인 경우는 다음 task로...
           KOSession.shared().open(completionHandler: { success in //카카오 인증이 안되어 있는경우는 인증 processs를 태운다
           if success {
             TaskQueueScheduler.instance.enQueueTask(action: CoreTaskPack(task: .rankCheckMyInformation, param: nil))
             TaskQueueScheduler.instance.startTask()
           } else { ... }
         }, authTypes: [NSNumber(value: KOAuthType.talk.rawValue)]) }
       }
         }
      
  2. Push Notification
    • Push payload: AppDelegate - didReceiveRemoteNotification
    • Initial function: AppDelegate - applicationDidBecomeActive
    • 위 두가지가 충돌날 경우
       func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
         TaskQueueScheduler.instance.enQueueTask(action: CoreTaskPack(task: .rankPushNotification, param:JSON(userInfo)))
       }
      
       func applicationDidBecomeActive(_ application: UIApplication) {
         TaskQueueScheduler.instance.enQueueTask(action: CoreTaskPack(task: .rankCheckMyInfomation, param: nil))
         TaskQueueScheduler.instance.enQueueTask(action: CoreTaskPack(task: .rankKakaoLogin, param: nil))
         TaskQueueScheduler.instance.enQueueTask(action: CoreTaskPack(task: .rankUseLocation, param: nil))
         TaskQueueScheduler.instance.enQueueTask(action: CoreTaskPack(task: .rankAppInfo, param: nil))
         TaskQueueScheduler.instance.enQueueTask(action: CoreTaskPack(task: .rankActiveService, param: nil))
         ...
         TaskQueueScheduler.instance.startTask()
       }
      
    • pushNotification의 우선순위는 kakaoLogin보다 낮음
  3. Sceme URL
      func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
     TaskQueueScheduler.instance.enQueueTask(action: CoreTaskPack(task: .rankSchemeUrl, param:url))
      }
    
    • Push Payload에 URL이 들어온다면?
    • 우선순위는 pushNotification과 거의 동일한 우선순위
  4. 기획적 요구사항
    • Service Banner 우선순위를 가장 마지막에 해두면 됨.
    • 갑자기, 추가적인 banner를 보여줘야하는 상황에서도 우선순위 조정하여 enqueue만 해주면 된다.
  5. 끊임없는 기획적 요구사항
    • 인 실행시 필수/선택 권한 고지 화면 필요
    • 앱 실행시 바로 띄워야함
    • 위와 같은 경우, 우선순위를 최상위로 해두면 된다.

Git commit history

comments powered by Disqus
rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora