...
본문 바로가기

WWDC

WWDC 20 - Widgets Code-along, part 3: Advancing timelines


  • 세션보면서 정리한 내용입니다. 해석이 잘못된 경우가 있을수있으니 발견하시면 댓글로 남겨주시면 감사하겠습니다🙏🏻

https://developer.apple.com/wwdc20/10036

 

Widgets Code-along, part 3: Advancing timelines - WWDC20 - Videos - Apple Developer

Take your widget to the next level as we embark upon the third and final stage of the widgets code-along. Pick up where you left off in...

developer.apple.com

 


 

요약

  • timeline provider는 completion 핸들러를 통해 손쉽게 비동기요청에 대한 데이터를 넣어줄수있다.
    • backgroundSession은 app delegate가 따로없지만, WidgetConfiguration - .onBackgroundURLSessionEvents modifier를 통해서 다룰 수 있다. 
  • medium, large 사이즈에서는 특정뷰에 대해 deep link 를 줄수있는데, widgetURL말고도 Link control을 통해 특정 url을 지정할수있다. 
  • 여러개의 다른 위젯을 지원하고자한다면, WidgetBundle을 이용한다. 
    • @main attribute은 하나의프로세스의 하나 main만 존재해야하므로, WidgetBundle을 채택하는 객체에 붙여준다. 
  • Dynamic Configuration을 지원하기위해서는 새로운 target - Intent extension과 file - Sirikit Intent파일이 필요하다. 
    • Intent파일에서는 Enum대신 Type을 사용한다. 해당 Intent는 자동적으로 INIntent를 채택하는 class가 자동적으로만들어지며, 마찬가지로 ~~IntentHandling 프로토콜도 만들어진다. 
    • Intent Extension내부에서 해당 프로토콜을 채택하여, provide~ 메소드를 구현하여, 내부적으로  INObjectCollection을 매핑하여 내보낸다. 

 

 


요런것들을 다룰예정이다.

 

 

이번에는 리더보드라는 새로운 위젯을 추가했다.

각 캐릭터들의 리스트를 보여주고 체력순으로정렬되어있다.

 

 

 

네트워크요청는 위젯이 데이터를 얻을수있는 기본적인 방법중하나다.

provider API는 value를 Return하는 대신, completion handler로 구성되어있다

이는 네트워킹과같은 비동기적인 작업을들을 쉽게 해준다.

 

이렇게 timeline 메서드에서 비동기적으로 loadLeaderboardData를 호출하여 completion에 넣어주고있다. 

 

 

 

하지만 background session은 어떻게해야할까? 

app delegate가 없는데 어떻게해야해? 

Widget configuration에는 onBackgroundURLSessionEvents modifier가 있다. 

이는 apple delegate method와 유사하다.

sessionIdentifier와 Completion block을 받는다. 

그래서 여기서 app에서 다뤘던것처럼 여기서 다루면된다. 

 


 

그리고 리더보드의 각각의 캐릭터를 특정 디테일 스크린으로 앱에띄우고싶다. 

이번에는 widgetURL이 아닌 SwiftUI Link API를 사용해보자. 

 

리더보드의 view로가서, 

각캐릭터를 감싸는 HStack을 Link로 감싼다. 

그리고 destination에 url을 지정한다. 

 

빌드실행해보면! 이제 특정캐릭터에 하이라이트가 되는걸볼수있따! 

 

 

 

 


 

그리고 잘보면, 위젯이 하나밖에없다 ㅠ ( 리더보드만 있다 ) 

이전에는 각 캐릭터 small, medium사이즈의 위젯도 있었단말이다!

그이유는, @main attribute를 Leaderboard widget으로옮겼기때문이다.

main이 의미하는것과 마찬가지로, 각프로세스는 하나의 Main만 존재해야한다. 

즉 여러 위젯들을 동시에추가할수가없다. 

 

하지만? 할수있는 방법이있다.

그것은 바로 widget bundle!

 

WidgetBundle 프로토콜을 채택하는 Bundle을 만들고, 

Emoji와 Leaderb 위젯둘다 추가해준다!

 

 

 

그리고?! 눈치채셨듯이 @main attribute를 옮겨주자! 

 

짜잔! 그러면 이제 두개의 위젯이 모두 갤러리에서볼수있따!

 

 

 


 

우리가이전에는 Configurable하기위해 Intent를 이용하여 하드코딩했다. 

하지만 우리가 미리 옵션들을 모른다면? 

사용한 configuration은 Sirikit Intent이므로, 우리는 dynamic list옵션을  Intent extension과 함께 줄수있다. 

 

FIle - Target 클릭 

 

intent Extension클릭!

그리고 Statrting Point를 None으로 해준다

 

 

그리고마찬가지로, Sirikit Intent 파일을 만들어주는데 ( 이미 프로젝트에는 만들어져있음 ) 

이전 Sirikit Intent 파일과마찬가지로, 동일하게구성하지만,  

이번에는 Hero 타입이 enum타입이 아닌, Type이다.

  •  이렇게 Enum뿐만아니라 Type도 추가할수있음. 

 

 

 

보면, Hero Type에는 identifier와 displayStirng이있다. 

이것은 Type을 만들면 defualt로 있는 프로퍼티들이다.

그럼 이 프로퍼티의 값들은 어디로부터 오는걸까? 

 

 

 

 

그건 ! 아까 만들었던 Target - Intent Extension - 에있는 IntentHandler로부터온다.

  •  

 

timeline메소드처럼 비동기적인 콜이다. 

여기에서,  Intent로 생성된 해당 프로토콜을 채택하여, provide메소드안에,

Intent에 Type으로만든 Hero로 매핑해주어 INOjbectCollection으로 넣어주자!! 

  • 기본적으로 identifier, display가 있었으니, 각각 매핑! 
  • 그리고 DyanmicCharacterSelectionIntentHandling 프로토콜을 채택하는데,  이는, Intent파일만들때, Intent의 이름을통해서, 자동적으로 코드들이생성되는데, 거기에 DynamicCharacterSelectionIntentHandling protocol이 있다. Build계속 하다보면 어느순간에 생긴다. ㅠ .
  • 여튼 그프로토콜은 provideHeroOptionsCollection메서드가있고, 이를 구현한다.  

 

 

 

자그럼, 이제 기존 Intent에서 Dynamic Intent로 바꿔주자. 

 

그리고 우리는 더이상 Enum을 사용하지않으니, func character(for ) 메섣는 삭제해주자. 

 

 

그리고 선택된캐릭터는,  identifier가 된다. 

 

짜잔~ 이제는 Mr Spook, Cake, Octo 캐릭터들도 볼수있게됐다! 

 


끝!!

 

아래세션들도 보아랏~