다음을 통해 공유


Xamarin의 watchOS 3에 대한 빠른 상호 작용 기술

이 문서에서는 Apple이 watchOS 3에 추가한 빠른 상호 작용 기술과 Apple Watch용 Xamarin.iOS에서 이를 구현하는 방법을 설명합니다.

빠른 사용자 상호 작용을 제공하는 것은 매력적인 Apple Watch 앱 및 합병증을 만드는 데 필수적입니다. watchOS 3의 새로운, 애플은 제스처 인식기, 디지털 크라운에 대한 액세스 및 새로운 사용자 알림 및 탐색 기술에 대한 지원을 추가했습니다. 이렇게 하면 SceneKit 및 SpriteKit에 대한 추가 지원과 함께 개발자가 빠르고 반응성이 뛰어난 풍부하고 눈에 띄는 인터페이스를 쉽게 만들 수 있습니다.

빠른 상호 작용이란?

iOS 또는 macOS용 애플리케이션을 만드는 데 사용되는 개발자의 경우(사용자가 앱과 상호 작용하는 데 소요되는 시간을 분 또는 몇 시간 단위로 측정) Apple Watch에 대한 성공적인 앱을 디자인하는 것은 어려울 수 있으며 다른 접근 방식이 필요합니다.

watchOS에서 사용자는 일반적으로 손목을 올리고 앱과 빠르게 상호 작용한 다음(보통 몇 초 간) 손목을 떨어뜨리고 그들이 하고 있던 일을 계속하려고 합니다.

다음은 Apple Watch에서 일반적인 빠른 상호 작용의 몇 가지 예입니다.

  • 타이머를 시작합니다.
  • 날씨를 확인합니다.
  • 할 일 목록에서 항목을 표시합니다.

이러한 목표를 달성하려면 Apple Watch의 앱은 다음이어야 합니다.

  • 한눈에 볼 수 있습니다 . 즉, 사용자가 필요한 정보를 빠르게 얻을 수 있어야 합니다.
  • 실행 가능 - 즉, 사용자가 신속하고 합리적인 의사 결정을 내릴 수 있어야 합니다.
  • 응답성 - 즉, 사용자가 필요한 정보를 받거나 원하는 작업을 달성하기 위해 기다리지 않아야 합니다.

빠른 상호 작용 길이

Apple Watch 앱의 눈에 띄는 특성 때문에 Apple은 빠른 상호 작용의 이상적인 길이가 2초 이하여야 한다고 제안합니다. 이 두 번째 제한의 결과로 개발자는 Apple Watch 앱을 디자인하고 구현하는 데 상당한 시간을 할애해야 합니다.

새로운 watchOS 3 기능 및 API

Apple은 개발자가 Apple Watch 앱에 빠른 상호 작용을 추가할 수 있도록 WatchKit에 몇 가지 새로운 기능과 API를 추가했습니다.

  • watchOS 3은 다음과 같은 새로운 종류의 사용자 입력에 대한 액세스를 제공합니다.
    • 제스처 인식기
    • 디지털 크라운 회전
  • watchOS 3은 다음과 같은 정보를 표시하고 업데이트하는 새로운 방법을 제공합니다.
    • 향상된 테이블 탐색
    • 새 사용자 알림 프레임워크 지원
    • SpriteKit 및 SceneKit 통합

개발자는 이러한 새로운 기능을 구현하여 watchOS 3 앱이 눈에 돋보이고 실행 가능하며 반응성이 뛰어난지 확인할 수 있습니다.

제스처 인식기 지원

개발자가 iOS에서 제스처 인식기를 구현한 경우 watchOS 3에서 제스처 인식기가 작동하는 방식을 잘 알고 있어야 합니다. 새로 고치기 위해 제스처 인식기는 하위 수준 터치 이벤트를 인식 가능한 미리 정의된 제스처로 구문 분석하는 개체입니다.

watchOS 3은 다음 네 가지 제스처 인식기를 지원합니다.

  • 불연속 제스처 유형:
    • 살짝 밀기 제스처(WKSwipeGestureRecognizer).
    • 탭 제스처(WKTapGestureRecognizer).
  • 연속 제스처 유형:
    • 이동 제스처(WKPanGestureRecognizer)입니다.
    • 긴 누름 제스처(WKLongPressGestureRecognizer)입니다.

새 제스처 인식기 중 하나를 구현하려면 Xcode의 인터페이스 작성기에서 보기로 끌어와 속성을 구성하기만 하면 됩니다.

코드에서 인식기의 동작에 응답하여 사용자가 트리거하는 제스처를 처리합니다. 이 작업은 iOS에서 처리되는 것과 동일한 방식으로 수행됩니다.

불연속 제스처 상태

불연속 제스처의 경우 제스처가 인식되고 상태(WKGestureRecognizerState)가 다음과 같이 할당될 때 동작이 호출됩니다.

불연속 제스처 상태

모든 불연속 제스처는 상태에서 시작하여 Possible 상태 또는 Recognized 상태로 전환 Failed 됩니다. 불연속 제스처를 사용하는 경우 개발자는 일반적으로 상태를 직접 처리하지 않습니다. 대신 제스처가 인식될 때만 호출되는 작업을 사용합니다.

연속 제스처 상태

연속 제스처는 제스처가 인식될 때 동작이 여러 번 호출되는 불연속 제스처와 약간 다릅니다.

연속 제스처 상태

다시 말하지만 연속 제스처는 Possible 상태에서 시작되지만 여러 업데이트를 진행합니다. 여기서 개발자는 제스처가 최종적으로 Recognized 또는 Canceled완료될 때까지 인식기 상태를 고려하고 단계 중에 Changed 앱의 UI를 업데이트해야 합니다.

제스처 인식기 사용량 팁

Apple은 watchOS 3에서 제스처 인식기를 사용할 때 다음을 제안합니다.

  • 개별 컨트롤 대신 그룹 요소에 제스처 인식기를 추가합니다. Apple Watch의 실제 화면 크기가 작기 때문에 그룹 요소는 사용자가 더 크고 쉽게 적중할 수 있는 대상이 되는 경향이 있습니다. 또한 제스처 인식기는 기본 UI 컨트롤에 이미 있는 기본 제공 제스처와 충돌할 수 있습니다.
  • 조사식 앱의 Storyboard에서 종속성 관계를 설정합니다.
  • 일부 제스처는 다음과 같은 다른 제스처 유형보다 우선합니다.
    • 스크롤
    • Force Touch

디지털 크라운 회전

개발자는 watchOS 3 앱에서 Digital Crown 지원을 구현하여 사용자에게 향상된 탐색 속도와 정밀도 상호 작용을 제공할 수 있습니다.

watchOS 2 이후 Apple Watch 앱은 목록 및 선택기 스타일(목록WKPickerItems, 누적 또는 이미지 시퀀스)을 제공하여 개체를 사용하여 WKInterfacePicker 디지털 크라운에 액세스할 수 있습니다. 그런 다음 watchOS를 사용하면 사용자가 Digital Crown을 사용하여 목록에서 항목을 선택할 수 있습니다.

WatchKit를 WKInterfacePicker사용하는 경우 다음을 통해 대부분의 작업을 처리합니다.

  • 목록 및 개별 인터페이스 요소 그리기
  • 디지털 크라운 이벤트 처리
  • 항목을 선택할 때 작업 호출

watchOS 3에 새로 추가된 개발자는 이제 회전 값에 응답하는 자체 UI 요소를 만들 수 있는 Digital Crown 회전 이벤트에 직접 액세스할 수 있습니다.

디지털 크라운 액세스는 다음 요소에 의해 제공됩니다.

  • WKCrownSequencer - 초당 회전에 대한 액세스를 제공합니다.
  • WKCrownDelegate - 회전 델타 이벤트에 대한 액세스를 제공합니다.

초당 회전 수

디지털 크라운에서 초당 회전에 액세스하는 것은 물리학 기반 애니메이션으로 작업할 때 유용합니다. 초당 회전에 액세스하려면 조사식 확장의 WKInterfaceController 속성을 사용합니다CrownSequencer. 예시:

var rotationsPerSecond = CrownSequencer.RotationsPerSecond;

회전 델타

디지털 크라운의 회전 델타를 사용하여 회전 수를 계산합니다. 회전 델타에 CrownDidRotate 액세스하려면 재정의 WKCrownDelegate 메서드를 사용합니다. 예시:

using System;
using WatchKit;
using Foundation;

namespace MonkeyWatch.MonkeySeeExtension
{
  public class CrownDelegate : WKCrownDelegate
  {
    #region Computed Properties
    public double AccumulatedRotations { get; set;}
    #endregion

    #region Constructors
    public CrownDelegate ()
    {
    }
    #endregion

    #region Override Methods
    public override void CrownDidRotate (WKCrownSequencer crownSequencer, double rotationalDelta)
    {
      base.CrownDidRotate (crownSequencer, rotationalDelta);

      // Accumulate rotations
      AccumulatedRotations += rotationalDelta;
    }
    #endregion
  }
}

여기서 앱은 회전 수를 결정하는 누적기(AccumulatedRotations)를 기본. 디지털 크라운의 전체 회전은 누적된 델타 1.0 와 같고 반 회전은 다음과 같습니다 0.5.

Apple은 회전 수가 업데이트되는 UI 요소의 변경 민감도에 해당하는 방식을 결정하기 위해 개발자에게 맡기고 있습니다.

회전 델타의 기호(+/-)는 사용자가 Digital Crown을 돌리는 방향을 나타냅니다.

회전 델타의 기호는 사용자가 디지털 크라운을 돌리는 방향을 나타냅니다.

사용자가 위로 스크롤하는 경우 WatchKit는 양수 델타를 반환하고 아래로 스크롤하면 사용자가 시계를 착용하는 방향에 관계없이 음의 델타가 반환됩니다.

디지털 크라운 포커스

다른 인터페이스 요소와 마찬가지로 Digital Crown에는 포커스 개념이 있습니다. 이 포커스는 사용자가 시계와 상호 작용하는 방식에 따라 디지털 크라운에서 다른 인터페이스 요소로 이동할 수 있습니다.

예를 들어 다음 컨트롤 중에서 디지털 크라운의 포커스를 도용할 수 있습니다.

  • Picker
  • 슬라이더
  • 스크롤 컨트롤러

개발자는 사용자 지정 인터페이스 요소가 디지털 크라운의 포커스여야 하는 시기를 결정해야 합니다. Apple은 새 제스처 인식기를 사용하여 사용자 지정 UI 요소에 초점을 맞출 것을 제안합니다.

세로 페이징

사용자가 watchOS 앱에서 테이블 뷰를 탐색하는 표준 방법은 원하는 데이터 조각으로 스크롤하고, 특정 행을 탭하여 자세히 보기를 표시하고, 세부 정보 보기를 마쳤을 때 뒤로 단추를 탭하고, 테이블 내에서 관심 있는 다른 정보에 대한 프로세스를 반복하는 것입니다.

테이블과 세부 정보 보기 간 이동

watchOS 3을 새롭게 접하는 개발자는 테이블 뷰 컨트롤에서 세로 페이징을 사용하도록 설정할 수 있습니다. 이 기능을 사용하도록 설정하면 사용자는 스크롤하여 테이블 뷰 행을 찾고 행을 탭하여 이전과 같이 세부 정보를 볼 수 있습니다. 그러나 이제 테이블 뷰로 돌아가지 않고도 위로 살짝 밀어 테이블의 다음 행을 선택하거나 아래로 살짝 밀어 이전 행(또는 디지털 크라운 사용)을 선택할 수 있습니다.

테이블과 세부 정보 보기 사이를 이동하고 위아래로 살짝 밀어 다른 행 사이를 이동합니다.

이 모드를 사용하도록 설정하려면 편집을 위해 Xcode에서 watchOS 앱의 Storyboard를 열고 테이블 보기를 선택하고 세로 세부 정보 페이징 검사 상자를 검사.

세로 세부 정보 페이징 검사 확인란

테이블이 Segues를 사용하여 자세히 보기를 표시하고 변경 내용을 Storyboard에 저장하고 동기화할 Mac용 Visual Studio 돌아갑니다.

개발자는 테이블 뷰에 대해 다음 코드를 사용하여 수직 페이징을 특정 행에 프로그래밍 방식으로 연결할 수 있습니다.

// Segue into Vertical Paging and select the first row
MenuTable.PerformSegue (0);

세로 페이징을 사용하는 경우 개발자는 WatchKit에서 컨트롤러의 사전 로드를 자동으로 처리하므로 UI가 실제로 표시되기 전에 일부 컨트롤러 수명 주기 메서드를 호출할 수 있습니다.

알림 향상

알림은 사용자가 일반적으로 watchOS에서 경험하고 첫 번째 Apple Watch 및 watchOS 1 이후 사용할 수 있는 빠른 상호 작용의 기본 형태입니다.

일반적인 알림 빠른 상호 작용은 다음과 같습니다.

  1. 사용자는 새 알림이 수신될 때 알림 촉각을 느낍니다.
  2. 그들은 알림에 대한 짧은 보기 인터페이스를 보기 위해 손목을 들어 올립니다.
  3. 손목을 계속 올리면 watchOS가 자동으로 Long Look 알림 인터페이스로 전환됩니다.

사용자가 알림에 응답할 수 있는 몇 가지 방법이 있습니다.

  • 잘 정의되고 표시된 알림의 경우 사용자는 아무 작업도 수행하지 않고 알림을 해제하기만 하면 됩니다.
  • 알림을 탭하여 watchOS 앱을 시작할 수도 있습니다.
  • 사용자 지정 작업을 지원하는 알림의 경우 사용자는 사용자 지정 작업 중 하나를 선택할 수 있습니다. 다음 중 하나일 수 있습니다.
    • 포그라운드 작업 - 작업을 수행하기 위해 앱을 시작합니다.
    • 백그라운드 작업 - 항상 watchOS 2에서 i전화 라우팅되었지만 watchOS 3의 watchApp으로 라우팅할 수 있습니다.

watchOS 3의 새로운 기능:

  • 알림은 모든 플랫폼(iOS, watchOS, tvOS 및 macOS)에서 유사한 API를 사용합니다.
  • Apple Watch에서 로컬 알림을 예약할 수 있습니다.
  • 백그라운드 알림은 Apple Watch에서 예약된 경우 앱의 확장으로 라우팅됩니다.

알림 예약 및 배달

사용자의 i전화 알림은 다음이 발생하면 Apple Watch로 전달됩니다.

  • i전화 화면이 꺼져 있습니다.
  • 애플 워치가 착용 중이며 잠금이 해제되었습니다.

watchOS 3에서는 Apple Watch에서 로컬 알림을 예약할 수 있으며 시계에서만 배달됩니다. 앱에서 필요한 경우 해당 i전화 알림을 예약하는 것은 개발자의 요지입니다.

Apple Watch 및 i전화 버전의 알림 모두에 동일한 알림 식별자를 포함하면 중복 알림이 시계에 표시되지 않습니다. 알림의 Apple Watch 버전이 i전화 버전보다 우선합니다.

watchOS 3은 iOS 10과 동일한 UINotification API 프레임워크를 사용하므로 자세한 내용은 iOS 10 사용자 알림 프레임워크 설명서를 참조하세요.

SpriteKit 및 SceneKit 사용

watchOS 3을 새롭게 접하는 개발자는 이제 앱의 사용자 인터페이스 디자인에서 SpritKit 및 SceneKit 개체를 모두 사용하여 2D 및 3D 그래픽을 모두 표시할 수 있습니다.

이 기능을 지원하기 위해 두 개의 새 인터페이스 클래스가 추가되었습니다.

  • WKInterfaceSKScene - SpriteKit 2D 그래픽으로 작업합니다.
  • WKInterfaceSCNScene - SceneKit 3D 그래픽으로 작업합니다.

이러한 개체를 사용하려면 Xcode의 인터페이스 작성기에서 조사식 앱의 Storyboard 내부 디자인 화면으로 끌어와 특성 검사기를 사용하여 구성하면 됩니다.

이 시점에서 SpriteKit 또는 SceneKit 장면으로 작업하는 작업은 iOS 앱 내에서와 동일하게 작동합니다. 조사식 앱은 메서드 중 하나를 호출하여 표시 WKInterfaceSKScene 합니다 Present . SceneKit의 경우 개체의 Scene 속성을 설정하기 WKInterfaceSCNScene 만 하면 됩니다.

실행 가능한 합병증

watchOS 2에서 Apple은 타사 앱에 대한 복잡성을 도입했습니다. watchOS 3에서 Apple은 개발자가 WatchKit 합병증에 포함할 수 있는 기능을 확장했습니다.

또한, 더 많은 내장 시계 얼굴은 이제 합병증을 포함 할 수 있으며, 이미 합병증을 지원하는 기존 시계 얼굴은 이제 더 많은 합병증을 포함 할 수 있습니다.

또한 사용자가 왼쪽이나 오른쪽으로 빠르게 살짝 밀어 Apple Watch에 설치한 모든 시계 얼굴을 전환할 수 있는 기능도 새롭게 추가되었습니다. Apple Watch의 동반자 i전화 앱의 새 갤러리를 사용하여 사용자는 새 시계 얼굴과 포함할 수 있는 합병증을 추가하고 사용자 지정할 수 있습니다.

이러한 새로운 기능 때문에, 애플은 애플 워치의 모든 응용 프로그램은 또한 적어도 하나의 합병증을 포함해야한다고 제안하고, 네이티브 애플 워치 응용 프로그램의 모든 지금 합병증이.

복잡성은 앱에 다음과 같은 기능을 제공합니다.

  • 그들은 항상 시계 얼굴에 존재하기 때문에 그들은 매우 눈에 띄는.
  • 복잡성은 watchOS에서 자주 업데이트됩니다. 사용자의 현재 표시된 시계 얼굴에 합병증이 포함된 모든 앱은 한 시간에 두 번 이상 업데이트됩니다.
  • 사용자의 현재 표시된 시계 얼굴에 합병증이 있는 모든 앱은 메모리에 유지되므로 앱이 빠르게 시작되고 앱의 응답 속도가 향상됩니다.
  • 복잡성을 통해 사용자는 watchOS 앱에서 특정 기능을 쉽게 시작할 수 있습니다.

눈에 띄는 알림

Apple Watch에 대한 알림은 사용자에게 이벤트 또는 들어오는 메시지 또는 운동 앱의 목표 달성과 같은 새로운 정보를 빠르게 알릴 수 있는 훌륭한 사용자 지정 방법을 제공합니다.

알림을 사용하면 사용자에게 중요한 정보를 빠르게 표시할 수 있습니다. 대부분의 경우 잘 설계된 알림은 사용자가 실제로 앱을 시작할 필요성을 제거할 수 있습니다.

watchOS 3이 새로 추가되었으므로 이제 모든 알림이 다음을 지원합니다.

  • SpriteKit
  • SceneKit
  • 인라인 비디오

SpriteKit 및 SceneKit를 사용하여 향상된 UI

일반적으로 개발자는 SpriteKit 및 SceneKit이 멘션 경우 게임 UI를 생각할 수 있습니다. 그러나 SpriteKit 및 SceneKit은 모두 WatchKit에서만 가능하지 않은 사용자 지정된 레이아웃, 콘텐츠 및 애니메이션을 포함하는 비게임 UI를 만드는 데 유용할 수 있습니다.

예를 들어 사진 공유 앱의 사용자 알림은 SpriteKit을 사용하여 실제 이미지 및 사용자 환경을 풍요롭게 하는 기타 사용자 지정 정보와 함께 사진을 게시한 사용자를 포함하여 풍부한 사용자 환경을 제공할 수 있습니다.

또한 SpriteKit 및 SceneKit는 모두 앱의 사용자 인터페이스 디자인에서 표준 WatchKit UI 요소와 혼합할 수 있습니다.

간단한 탐색

watchOS 3는 개발자가 새로운 세로 페이징, 제스처 인식기 지원 및 위에 제시된 디지털 크라운 회전 기능과 같은 watchOS 앱 내에서 탐색을 간소화할 수 있는 여러 가지 방법을 제공합니다.

디지털 크라운은 Apple Watch에 고유하며 탐색을 간소화하기 위해 다양한 방법으로 사용할 수 있습니다. 예를 들어 타이머 애플리케이션은 Digital Crown을 사용하여 사용 가능한 타이머 길이를 스크럽할 수 있습니다.

사용자 지정 제스처는 사용자가 조사식 앱과 상호 작용하는 새롭고 고유한 방법을 제시할 수 있으며 앱 탐색을 간소화하는 데 사용할 수도 있습니다.

Apple은 watchOS 3에 추가된 모든 새로운 빠른 상호 작용 기능을 결합하여 watchOS 앱 인터페이스를 풍부하고 쉽고 빠르게 사용할 수 있는 방법을 찾는 것이 좋습니다.

빠른 상호 작용 완료

잘 설계된 빠른 상호 작용 환경은 사용자가 현재 상호 작용을 마쳤을 때 손목을 떨어뜨리고 앱과 분리할 수 있는 자신감을 줍니다.

이것이 특히 문제가 되는 곳은 조사식 앱이 모든 유형의 네트워크 연결을 수행하거나 해당 도우미 i전화 앱과 정보를 공유하는 경우입니다. 트랜잭션이 진행되는 동안 대기 표시기가 발생하는 경우가 많으며, 이는 빠른 상호 작용 중에는 바람직하지 않습니다. 다음 예제를 참조하세요.

네트워크 연결을 수행하고 도우미 i전화 앱과 정보를 공유하는 시계 앱의 다이어그램

  1. 사용자가 시계에서 구매할 항목을 선택합니다.
  2. 구매 단추를 탭합니다.
  3. 앱은 네트워크 트랜잭션을 시작하고 로드 표시기를 표시합니다.
  4. 얼마 후 트랜잭션이 완료되고 앱에 구매 준수가 표시됩니다.
  5. 사용자는 손목을 떨어뜨리고 앱과 분리합니다.

사용자가 구매 단추를 탭한 후 트랜잭션이 완료될 때까지 로드 표시기를 보면 손목이 올라오게 됩니다. 이 상황을 해결하기 위해 Apple은 개발자가 로드 표시기를 표시하는 대신 사용자에게 즉각적인 피드백을 제공해야 한다고 제안합니다.

Apple의 제안된 모델을 사용하여 동일한 빠른 상호 작용을 다시 살펴보세요.

Apples 추천 모델 다이어그램

  1. 사용자가 시계에서 구매할 항목을 선택합니다.
  2. 구매 단추를 탭합니다.
  3. 앱은 네트워크 트랜잭션을 시작하고 구매가 성공적으로 시작되었다는 메시지를 표시합니다.
  4. 사용자는 손목을 떨어뜨리고 앱과 분리합니다.
  5. 트랜잭션이 몇 시간 후에 성공적으로 완료되면 앱은 사용자에게 성공적인 구매를 알리는 로컬 알림을 표시합니다.

이번에는 사용자가 구매 단추를 탭하는 즉시 구매가 시작되었다는 메시지가 표시되므로 자신있게 손목을 떨어 뜨리고 이 시점에서 빠른 상호 작용을 끝낼 수 있습니다. 나중에 사용자 알림에서 트랜잭션의 성공 또는 실패를 알 수 있습니다. 이러한 방식으로 사용자는 프로세스의 "활성" 단계 동안에만 앱과 상호 작용합니다.

네트워킹을 수행하는 앱의 경우 백그라운드 NSURLSession 를 사용하여 다운로드 작업과 네트워크 통신을 처리할 수 있습니다. 이렇게 하면 다운로드한 정보를 처리하기 위해 백그라운드에서 앱을 깨울 수 있습니다. 백그라운드 처리가 필요한 앱의 경우 백그라운드 작업 어설션을 사용하여 필요한 처리를 처리합니다.

빠른 상호 작용 디자인 팁

빠른 상호 작용의 원하는 길이는 2초 이하이므로 개발자는 디자인 프로세스의 시작 부분에서 앱 상호 작용의 디자인에 집중해야 합니다. 이러한 상호 작용을 간소화할 수 있는 영역을 찾고(위에 제시된 기술을 사용하여) watchOS 3의 새로운 기능을 사용하여 앱을 빠르고 신속하게 응답할 수 있습니다.

Apple은 다음을 제안합니다.

  • 앱에서 가장 많이 사용되는 기능을 전달하여 빠른 상호 작용에 집중합니다.
  • 복잡성 및 사용자 알림을 사용하여 일반적인 기능과 함수를 표시합니다.
  • SceneKit 및 SpriteKit을 사용하여 풍부하고 눈에 띄는 사용자 인터페이스를 만듭니다.
  • 가능하면 앱 내에서 탐색을 간소화합니다.
  • 사용자가 기다리지 않도록 하여 손목을 떨어뜨리고 가능한 한 빨리 앱과 분리할 수 있습니다.

요약

이 문서에서는 Apple이 watchOS 3에 추가한 빠른 상호 작용 기술과 Apple Watch용 Xamarin.iOS에서 구현하는 방법을 설명했습니다.