nyancoder

WWDC 2021 - Add intelligence to your widgets 본문

WWDC/WWDC 2021

WWDC 2021 - Add intelligence to your widgets

nyancoder 2021. 7. 9. 02:36

원본 영상: https://developer.apple.com/videos/play/wwdc2021/10049/

 

Widget intelligence overview

  • iOS 14에 적용된 스마트 회전을 사용하면 시스템이 스택의 위젯 중 현재 상황에 알맞은 위젯으로 자동 스크롤할 수 있습니다.
  • 자동 스크롤할 시점을 판단하기 위해 위젯이 제공하는 타임라인과 신호를 사용합니다.
  • 사용자의 앱을 사용하는 행동 패턴도 학습되어 반영됩니다.

  • 위젯 스택에 날씨, 일정, 알림이 있을 때 아침에는 그날 날씨를 안내하기 위해 날씨를 보여줄 수 있습니다.
  • 이후 10시 회의가 있으면 9시 30분쯤에는 캘린더로 회전하여 회의 일정을 보여줄 수 있습니다.
  • 알림에 등록된 일정의 시간이 가까워지면 위젯은 알림 위젯으로 회전할 것입니다.
  • 저녁에 비가 내리기 시작하면 다시 날씨 위젯을 보여주어 날씨에 대비할 수 있도록 합니다.

  • 위젯 제안은 사용자가 새로운 위젯을 발견하고 관련성 있는 정보를 얻을 수 있는 방법입니다.
  • 위젯 제안이 활성화된 스마트 스택은 새 위젯을 시스템이 추가할 수 있습니다.
  • 시스템은 앱 제안하는 위젯을 넣을 수 있으며, 사용자의 행동 패턴을 학습하여 제안을 만들 수 있습니다.

  • 위젯 스택에 날씨 위젯과 알림 위젯을 넣으면 기본적으로 이 둘에 대해서만 보여줍니다.
  • 하지만 10시에 회의가 있으면 캘린더 앱이 9시 30분에 위젯을 추가할 것을 안내할 수 있습니다.
  • 회의 시간이 지나 더 이상 캘린더 위젯의 연관성이 없어지면, 해당 위젯은 제거됩니다.
  • 운동을 마친 이후에는 운동량을 보여주는 위젯이 추가되어 운동 결과를 요약해줄 수 있습니다.
  • 이후에는 다시 기본 상태로 돌아갑니다.

 

Donating to the system

  • 시스템에 제공할 위젯을 선택할 때의 목표는 사용자가 한눈에 볼 수 있고 가치 있는 정보를 적절한 시간에 제공하는 것입니다.

  • 예를 들어 날씨 위젯은 갑자기 비가 오는 경우가 위젯을 제안하기에 적합한 상황입니다.

  • 날씨 위젯이더라도 단순히 온도가 크게 변한 것은 위젯을 제안하기에 적절하지 않은 상황입니다.

  • 위젯을 생성해야 하는 시기를 시스템에 제안하기 위해 INRelevantShortcut을 제공할 수 있습니다.
  • 위젯이 스택에 있을 때, 스마트 회전을 활성화하기 위해 TimelineEntryRelevance를 통해 관련성 점수를 제공할 수 있습니다.
  • 위젯이 설정 가능한 위젯인 경우, INInteraction를 제공하면 시스템이 사용자의 행동 패턴을 학습하여 스마트 회전 및 위젯 제안을 할 수 있습니다.

  • 앱이 사용자에게 위젯을 표시하기 적절한 상황에 INRelevantShortcut를 전달하면, 해당 위젯이 홈 화면에 없는 경우 시스템이 사용자의 스택 중 하나에 위젯을 삽입할 수 있습니다.
  • INRelevantShortcut은 기간을 지정하거나 시스템이 사용자의 행동 패턴에 따라 위젯을 삽입할 시점을 결정하도록 할 수 있습니다.
  • INRelevantShortcut은 정적 및 intent-configured 위젯을 모두 지원합니다.

  • 위젯이 StaticConfiguration을 지원하는 경우 새 INRelevantShortcut을 만들고 widgetKind 속성을 위젯의 종류에 알맞은 문자열로 설정하면 됩니다.
  • 위젯을 노출할 시기를 시스템에 알려줄 필요가 있는 경우에는 relevanceProviders 속성을 INRelevanceProviders 배열로 설정합니다.

  • 위젯이 IntentConfiguration을 지원하는 경우 적절한 파라미터를 설정하여 intent를 생성합니다.
  • intent를 INShortcut으로 전달하여 INRelevantShortcut을 생성합니다.
  • StaticConfiguration의 경우와 동일하게 widgetKind, relevanceProviders를 설정합니다.

  • 위젯을 제안하기 위해서 기본 INRelevantShortcut내의 연관 바로가기 배열을 설정해야 합니다.
  • 제안된 바로가기는 새로운 바로가기 배열을 전달하여 업데이트할 수 있습니다.
  • 새로 전달된 배열에서 특정 바로가기를 제외해서 기존에 제안된 바로가기를 제거할 수 있습니다.
  • intent가 포함된 관련 단축키를 제안하면 Siri 시계 화면에 intent가 표시될 수 있습니다.

  • 위젯을 추가할 시점을 시스템에 알리려면 관련 바로 가기에 INRelevanceProviders 배열을 설정해야 합니다.
  • 두 가지 방식이 가능한데, INDateRelevanceProvider를 사용하여 예정된 이벤트와 같이 알려진 하나 이상의 고정된 시간 범위를 제공할 수 있습니다.
  • 두 번째 방식은 빈 배열을 제공하여 위젯에 표시할 것이 있음을 시스템에 알리면 시스템은 사용자가 앱을 사용하는 주기에 따라 위젯을 제안할 시간을 선택합니다.
  • 다른 relevance provider들은 Siri 시계 모드에 대한 INRelevantShortcuts만 지원하며 위젯 제안에는 지원되지 않습니다.

  • 앱에서 INRelevantShortcuts를 전달하여 적절한 시점에 위젯을 제안하는 예제 앱을 만들어 볼 것입니다.
  • 우선 "Intent is eligible for Siri Suggestions"이 선택되어있지 않는지를 확인해야 합니다.

  • 그런 다음 intent를 생성할 때 필요한 매개변수 조합을 만들어야 합니다.
  • 예제에서는 카드와 카테고리를 모두 선택할 것입니다.

  • INRelevantShortcuts의 빈 배열을 만들고 표시할 내용에 필요한 정보(예제에서는 IntentCard)를 생성합니다.
  • intent를 포함하는 INShortcut를 만들고, 이후 INRelevantShortcut을 만듭니다.
  • 사용자가 위젯에서 정보를 보기 때문에 shortcutRole을 information으로 설정합니다.
  • INDateRelevanceProvider의 1800초 (30분) 후에 위젯 제안을 끝내도록 설정하고 배열에 추가합니다.

  • setRelevantShortcuts를 호출하여 등록하고, 핸들러에서 오류가 발생한 경우에 대한 처리를 합니다.

  • TimelineEntryRelevance를 제공하여 스마트 회전에서 위젯이 그 순간에 얼마나 보여주기에 적합한지를 나타냅니다.
  • 현재 위젯을 보여줘야 할 가치는 위젯이 제공하는 시간대에 존재하는 다른 위젯들과의 적합도와 연관이 있습니다.

  • 구조체의 float형의 score는 이 항목이 다른 항목에 비해서 얼마나 관련성이 있는지를 나타냅니다.
  • 점수가 높을수록 시스템이 해당 위젯으로 회전해서 보여줄 가능성이 높아집니다.
  • 점수가 0이면 위젯에 표시할 정보가 없거나 해당 위젯을 보여주는 것이 사용자에게 부정적일 때 시스템에 해당 위젯을 보여줘서는 안 된다는 것을 알려줍니다.
  • 이 점수의 중요성은 위젯이 보이는 시간대의 다른 위젯들의 점수와 비교가 된다는 점을 염두에 둬야 합니다.

  • 구조체의 duration항목은 연관성 점수가 유효한 기간을 지정합니다.
  • 시스템은 date항목과 함께 사용하여 스택을 해당 위젯으로 회전할 시간 프레임을 결정합니다.
  • 지정된 기간이 지나면 해당 위젯의 연관성 점수는 다시 점수가 제공될 때까지 0점으로 처리됩니다.
  • 다음에 연관성 점수가 제공될 때까지만 점수를 유효하게 하려면 duration을 0으로 지정할 수 있습니다.

  • TimelineEntry 프로토콜을 따르는 CardRecentPurchasesEntry 구조체에 연관성 속성을 추가하기 위해서 relevance 필드를 추가해줍니다.
  • 그러면 CardRecentPurchasesEntry를 생성할 때, TimelineEntryRelevance을 전달할 수 있게 됩니다.

  • 구매 내역을 보여주는 위젯의 경우를 예로 보겠습니다.
  • 구매 내역 위젯은 더 많은 지출을 할 때 사용자가 더 관심이 있을 수 있다고 생각할 수 있습니다.
  • 따라서 구매에 대한 점수를 지출 금액에 따라 선형적으로 결정할 수 있습니다.
  • 처음 8시 15분에는 구매 항목이 없기 때문에 0의 연관성 값을 가지고, 나머지 시간대에는 지출 금액만큼의 연관성 점수를 가집니다.
  • 이때 3시 30분의 구매가 가장 높으므로 해당 시점에 위젯이 보일 가능성이 제일 높고, 8시 15분을 제외한 다른 시점도 0보다 큰 값을 가지므로 보일 가능성은 있지만 우선순위는 낮을 수 있습니다.

  • 다른 방식의 점수 계산 예제도 있습니다.
  • 구매 금액이 50 이상인 경우 50점을 주고, 그보다 적은 경우는 1점을 준다고 가정하였습니다.
  • 이 경우 처음에는 0점인 상태에서 3시 30분 구매까지는 50점이 유지되고, 이후에는 1점이 유지되는 것을 볼 수 있습니다.
  • 50점이 가장 높은 점수이기 때문에 해당 시점에 위젯이 보일 가능성이 높습니다.

  • 사용자가 오래된 구매 항목을 보는 것을 원치 않는다고 가정하면 duration 속성을 제공할 수 있습니다.
  • duration을 1800초 (30분)으로 지정하였습니다.
  • 이런 경우 구매 이후 30분 동안은 보일 가능성을 가지고 그 이외에는 보이지 않습니다.

  • 앱은 사용자가 정보를 볼 때마다 INInteraction을 전달합니다.
  • 정보가 전달될 때마다 시스템의 행동 모델이 사용자가 앱에서 정보를 보는 패턴을 학습합니다.
  • 이후 학습된 모델로 사용자가 다시 상호작용하려 할 때, 시스템은 이를 제안하는 Intent를 생성합니다.
  • 전달된 Intent가 위젯을 구성하는 Intent와 동일한 경우 스마트 회전 및 위젯 제안을 자동으로 생성합니다.

  • 프로젝트에서 Intent가 시스템의 다른 위치에 표시될 때를 위한 제안 UI를 디자인해야 합니다.

  • 예를 들어 카드 앱을 만들 때, 사용자가 최근 구매내역을 확인할 때마다 위젯의 Intent를 전달하여 위젯에 표시되는 정보에 사용자가 관심이 있다는 것을 알릴 수 있습니다.
  • 이를 위해서는 먼저 인텐트를 초기화할 때, 사용자가 보고 있는 카드를 전달하고 category를 all로 설정합니다.
  • intent를 INInteraction로 감싸서 donate 함수를 호출하면 시스템에서 사용자가 앱에서 이 카드에 대한 구매를 확인했음을 알 수 있습니다.

  • 설정 앱의 개발자 설정에 있는 WidgetKit 개발자 모드를 켜면, 위젯 표시에 대한 시스템의 제한을 우회할 수 있기 때문에 개발에 도움이 됩니다.

 

목차: https://nyancoder.tistory.com/2

Comments