Today Extension

  • Today Extension, 일명 위젯(Widget)이라 불리는 Today Extension은 메인앱에 종속되어 있는 앱이다.
  • Today Extension은 메인앱에 종속되어 있기 때문에 일반적인 App Life Cycle을 따르지 않는다.
  • Today Extension의 App Life Cycle은 TodayViewController와 매핑되며 TodayViewController의 viewDidLoad는 메인앱의 application(_:didFinishLaunchingWithOptions:)와 매핑된다.
  • 그렇기 때문에 Today Extension만 단독으로 존재할 순 없다.
  • iOS 10 이상부터는 compact mode, expanded mode가 존재하는데 compact가 기본이며 이때 높이는 110pts다. (이보다 작아질 수 없다.)

Today Extension 추가하기

  • File -> New -> Target -> Today Extension 선택

compact mode, expanded mode 다루기

  • viewDidLoadextensionContext?.widgetLargestAvailableDisplayMode = .expanded를 추가하면 더보기 버튼이 활성화된다.
  • widgetActiveDisplayModeDidChange은 옵셔널 메서드로 더보기 혹은 간략히보기를 누르면 호출된다.

Today Extension 최신 상태 유지

  • widgetPerformUpdate를 이용해 위젯 스크린이 꺼져있는 동안에도 뷰를 업데이트 하도록 지원한다.
func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
    // Perform any setup necessary in order to update the view.
    
    // If an error is encountered, use NCUpdateResult.Failed
    // If there's no update required, use NCUpdateResult.NoData
    // If there's an update, use NCUpdateResult.NewData
    
    //completionHandler(NCUpdateResult.newData) // 업데이트 성공시 호출하는 방법
    //completionHandler(NCUpdateResult.NoData) // 아무런 업데이트가 없을 시
    //completionHandler(NCUpdateResult.Failed) // 업데이트 실패 했을 시
    
    // 이런식으로 사용할 수 있다.
    if self.isSuccessUpdate() == true {
        // do something
        completionHandler(.newData)
    } else {
        // do something
        completionHandler(.failed)
    }
}