Xamarin에서 백그라운드 작업 watchOSwatchOS Background Tasks in Xamarin

WatchOS 3을 사용 하는 경우 세 가지 주요 방법으로 시청 앱이 정보를 최신 상태로 유지할 수 있습니다.With watchOS 3, there are three main ways that a watch app can keep its information up-to-date:

  • 몇 가지 새로운 백그라운드 작업 중 하나를 사용 합니다.Using one of the several new background tasks.
  • Watch에 대 한 복잡 한 문제 중 하나 (업데이트에 추가 시간 제공)Having one of its Complications on the watch face (giving it extra time to update).
  • 사용자가 앱에 고정 하 여 새 도크에 고정 하는 경우 (여기서는 메모리에 유지 되 고 자주 업데이트 됨)Having the user pin to app to the new Dock (where its kept in memory and updated often).

앱을 최신 상태로 유지Keeping an App Up-To-Date

개발자가 watchOS 앱의 데이터와 사용자 인터페이스를 최신으로 유지 하 고 업데이트할 수 있는 모든 방법을 설명 하기 전에이 섹션에서는 일반적인 사용 패턴 집합을 살펴보고, 사용자가 해당 iPhone Apple Watch 및 현재 수행 중인 작업 및 시간 (예: 구동)입니다.Before discussing all of the ways a developer can keep a watchOS app's data and User Interface current and updated, this section will take a look at a typical set of use patterns and how a user might move between their iPhone and their Apple Watch throughout the day based on the time of day and the activity they are currently doing (such as driving).

다음 예제를 참조하세요.Take the following example:

  1. 아침에는 커피를 줄 때까지 기다리는 동안 사용자는 몇 분 동안 iPhone에서 현재 뉴스를 찾아봅니다.In the morning, while waiting in line for a coffee, the user browses the current news on their iPhone for several minutes.
  2. 커피를 떠나기 전에 시계를 신속 하 게 확인 합니다.Before leaving the coffee shop, they quickly check the weather with a Complication on their watch face.
  3. 식사 전에 iPhone의 Maps 앱을 사용 하 여 주변의 식당을 찾고 클라이언트를 충족 하는 예약을 예약할 수 있습니다.Before lunch, they use the Maps app on the iPhone to find an nearby restaurant and book a reservation to meet a client.
  4. 식당으로 이동 하는 동안에는 해당 Apple Watch에 대 한 알림이 표시 되 고,이를 신속 하 게 확인 하 여 점심 약속이 늦게 실행 되 고 있음을 알 수 있습니다.While traveling to the restaurant, they get a notification on their Apple Watch and with a quick glance, they know their lunch appointment is running late.
  5. 저녁에는 집을 구동 하기 전에 iPhone의 Maps 앱을 사용 하 여 트래픽을 확인 합니다.In the evening, they use the Maps app on the iPhone to check traffic before driving home.
  6. Home 방법으로, 일부 우유를 선택 하도록 요청 하는 Apple Watch에 대 한 iMessage 알림을 받고, 빠른 회신 기능을 사용 하 여 응답을 "OK"로 보냅니다.On the way home, they receive an iMessage notification on their Apple Watch asking them to pick up some milk and they use the Quick Reply feature to send the response "OK".

사용자가 Apple Watch 앱을 사용 하려는 방법에 대 한 "빠른 보기" (3 초 미만) 특성 때문에 일반적으로 앱에서 원하는 정보를 가져오고 UI를 업데이트 하 여 사용자에 게 표시 하기 전에는 시간이 충분 하지 않습니다.Because of the "quick glance" (less than three seconds) nature of how a user is wanting to use an Apple Watch app, there typically isn't enough time for the app to fetch desired information and update its UI before displaying it to the user.

WatchOS 3에 포함 된 새 Api를 사용 하 여 앱은 백그라운드 새로 고침 을 예약 하 고 사용자가 요청 하기 전에 원하는 정보를 준비할 수 있습니다.By using the new APIs Apple has included in watchOS 3, the app can schedule for a Background Refresh and have the desired information ready before the user requests it. 위에서 설명한 날씨의 예를 살펴보겠습니다.Take the example of the Weather Complication discussed above:

  1. 앱이 특정 시간에 시스템에 의해 해제 예약 됩니다.The app schedules to be woken up by the system at a specific time.
  2. 앱은 업데이트를 생성 하는 데 필요한 정보를 페치합니다.The app fetches the information that it will require to generate the update.
  3. 앱은 새 데이터를 반영 하기 위해 사용자 인터페이스를 다시 생성 합니다.The app regenerates its User Interface to reflect the new data.
  4. 사용자가 앱의 복잡 한 경우 업데이트를 기다릴 필요가 없는 최신 정보를 glances.When the user glances at the app's Complication, it has up-to-date information without the user having to wait for the update.

위에서 설명한 것 처럼 watchOS 시스템은 하나 이상의 작업을 사용 하 여 앱의 절전 모드를 해제 합니다 .이 작업은 매우 제한 된 풀을 사용할 수 있습니다.As seen above, the watchOS system wakes the app using one or more Tasks, of which it has a very limited pool available:

Apple은 앱이 자신을 업데이트 하는 프로세스를 완료할 때까지이 작업을 보류 하 여 앱에 대 한 제한 된 리소스 이므로이 작업을 최대한 활용 하는 것이 좋습니다.Apple suggest making the most of this Task (since it is such a limited resource to the app) by holding onto it until the app has finished the process of updating itself.

시스템은 WKExtensionDelegate 대리자의 새 HandleBackgroundTasks 메서드를 호출 하 여 이러한 작업을 제공 합니다.The system delivers these Tasks by calling the new HandleBackgroundTasks method of the WKExtensionDelegate delegate. 예를 들면,For example:

using System;
using Foundation;
using WatchKit;

namespace MonkeyWatch.MonkeySeeExtension
{
  public class ExtensionDelegate : WKExtensionDelegate
  {
    #region Constructors
    public ExtensionDelegate ()
    {
    }
    #endregion

    #region Override Methods
    public override void HandleBackgroundTasks (NSSet<WKRefreshBackgroundTask> backgroundTasks)
    {
      // Handle background request here
      ...
    }
    #endregion
  }
}

앱이 지정 된 작업을 완료 하면 완료 된 것으로 표시 하 여 시스템에 반환 합니다.When the app has finished the given Task, it returns it to the system by marking it completed:

새 백그라운드 작업New Background Tasks

watchOS 3에는 앱이 정보를 업데이트 하는 데 사용할 수 있는 몇 가지 백그라운드 작업이 도입 되었으며, 다음과 같이 앱을 열기 전에 사용자에 게 필요한 콘텐츠가 있는지 확인 하는 데 사용할 수 있습니다.watchOS 3 introduces several background tasks that an app can use to update its information ensuring that it has the content the user needs before they open the app, such as:

  • 백그라운드 응용 프로그램 새로 고침 - WKApplicationRefreshBackgroundTask 작업을 사용 하면 앱이 백그라운드에서 상태를 업데이트할 수 있습니다.Background App Refresh - The WKApplicationRefreshBackgroundTask task allows the app to update its state in the background. 일반적으로이 작업에는 NSUrlSession를 사용 하 여 인터넷에서 새 콘텐츠를 다운로드 하는 등의 다른 작업이 포함 됩니다.Typically this will include another task such as downloading new content from the internet using a NSUrlSession.
  • 백그라운드 스냅숏 새로 고침 - WKSnapshotRefreshBackgroundTask 작업을 사용 하면 시스템이 도크를 채우는 데 사용 되는 스냅숏을 만들기 전에 콘텐츠와 UI를 모두 업데이트할 수 있습니다.Background Snapshot Refresh - The WKSnapshotRefreshBackgroundTask task allows the app to update both its content and UI before the system takes a snapshot that will be used to populate the Dock.
  • 백그라운드 감시 연결 -쌍을 이루는 iPhone의 배경 데이터를 받을 때 앱에 대 한 WKWatchConnectivityRefreshBackgroundTask 작업을 시작 합니다.Background Watch Connectivity - The WKWatchConnectivityRefreshBackgroundTask task is started for the app when it receives background data from the paired iPhone.
  • 백그라운드 URL 세션 -백그라운드 전송에 권한 부여가 필요 하거나 완료 (오류)가 완료 되 면 앱에 대 한 WKURLSessionRefreshBackgroundTask 작업이 시작 됩니다.Background URL Session - The WKURLSessionRefreshBackgroundTask task is started for the app when a background transfer requires authorization or completes (successfully or in error).

이러한 작업에 대해서는 아래 섹션에서 자세히 설명 합니다.These Tasks will be covered in detail in the sections below.

WKApplicationRefreshBackgroundTaskWKApplicationRefreshBackgroundTask

WKApplicationRefreshBackgroundTask는 나중에 앱 해제 되도록 예약할 수 있는 일반 작업입니다.The WKApplicationRefreshBackgroundTask is a generic Task that can be scheduled to have the app woken at a future date:

작업의 런타임 내에서 앱은 복잡 한 타임 라인 업데이트 또는 NSUrlSession포함 된 일부 필수 데이터 가져오기와 같은 모든 종류의 로컬 처리를 수행할 수 있습니다.Within the runtime of the Task, the app can do any kind of local processing such as update a Complication timeline or fetch some required data with a NSUrlSession.

WKURLSessionRefreshBackgroundTaskWKURLSessionRefreshBackgroundTask

데이터가 다운로드를 완료 하 고 앱에서 처리할 준비가 되 면 시스템에서 WKURLSessionRefreshBackgroundTask를 전송 합니다.The system will send a WKURLSessionRefreshBackgroundTask when the data has finished downloading and ready to be processed by the app:

백그라운드에서 데이터를 다운로드 하는 동안에는 앱이 실행 되지 않습니다.An app is not left running while data is downloading in the background. 대신, 앱은 데이터에 대 한 요청을 예약 하 고, 일시 중단 되 고, 시스템이 데이터 다운로드를 처리 하 고, 다운로드가 완료 되 면 앱만 reawakening 합니다.Instead, the app schedules the request for data, then it is suspended and the system handles the downloading of the data, only reawakening the app when the download is complete.

WKSnapshotRefreshBackgroundTaskWKSnapshotRefreshBackgroundTask

WatchOS 3에서 Apple은 사용자가 즐겨 찾는 앱을 고정 하 고 신속 하 게 액세스할 수 있는 도크를 추가 했습니다.In watchOS 3, Apple has added the Dock where users can pin their favorite apps and quickly access them. 사용자가 Apple Watch의 측면 단추를 누르면 고정 된 앱 스냅숏의 갤러리가 표시 됩니다.When the user presses the Side Button on the Apple Watch, a gallery of pinned app Snapshots will be displayed. 사용자는 왼쪽 또는 오른쪽으로 살짝 밀어 원하는 앱을 찾은 다음 앱을 탭 하 여 실행 중인 앱의 인터페이스로 스냅숏을 바꿀 수 있습니다.The user can swipe left or right to find the desired app, then tap the app to launch it replacing the Snapshot with the running app's interface.

시스템은 WKSnapshotRefreshBackgroundTask를 전송 하 여 앱 UI의 스냅숏을 주기적으로 가져오고 해당 스냅숏을 사용 하 여 도크를 채웁니다.The system periodically takes snapshots of the app's UI (by sending a WKSnapshotRefreshBackgroundTask) and uses those snapshots to populate the Dock. watchOS를 사용 하면이 스냅숏이 만들어지기 전에 앱에서 콘텐츠 및 UI를 업데이트할 수 있습니다.watchOS gives the app the opportunity to update its content and UI before this Snapshot is taken.

스냅숏은 앱에 대 한 미리 보기 및 시작 이미지 모두로 작동 하므로 watchOS 3에서 매우 중요 합니다.Snapshots are very important in watchOS 3 since they function as both the preview and launch images for the app. 사용자가 도크에서 앱에 대 한 작업을 수행 하는 경우 전체 화면으로 확장 되 고, 포그라운드를 입력 하 고 실행을 시작 하므로 스냅숏이 최신 상태를 유지 해야 합니다.If the user settles on an app in the Dock, it will expand to full screen, enter the foreground and start running, so it is imperative that the Snapshot be up-to-date:

다시 말하지만 스냅숏이 만들어지기 전에 앱이 데이터와 UI를 업데이트 하 여 준비할 수 있도록 시스템은 WKSnapshotRefreshBackgroundTask를 발급 합니다.Again, the system will issue a WKSnapshotRefreshBackgroundTask so that the app can prepare (by updating the data and the UI) before the snapshot is taken:

앱이 WKSnapshotRefreshBackgroundTask 완료로 표시 되 면 시스템은 자동으로 앱의 UI에 대 한 스냅숏을 만듭니다.When the app marks the WKSnapshotRefreshBackgroundTask completed, the system will automatically take a Snapshot of the app's UI.

중요

앱에서 새 데이터를 수신 하 고 해당 사용자 인터페이스를 업데이트 한 후에는 항상 WKSnapshotRefreshBackgroundTask 일정을 예약 하는 것이 중요 합니다. 그렇지 않으면 사용자에 게 수정 된 정보가 표시 되지 않습니다.It is important to always schedule a WKSnapshotRefreshBackgroundTask after the app has received new data and updated its User Interface or the user will not see the modified information.

또한 사용자가 앱에서 알림을 수신 하 고 탭 하 여 응용 프로그램을 포그라운드로 가져올 때 스냅숏은 시작 화면으로 작동 하므로 최신 상태 여야 합니다.Additionally, when the user receives a notification from the app and taps it to bring the app to the foreground, the Snapshot needs to be up-to-date since it is acting as the launch screen as well:

사용자가 watchOS 앱과 상호 작용 하 여 1 시간 이상 경과 된 경우에는 기본 상태로 돌아갈 수 있습니다.If it has been more than one hour since the user has interacted with a watchOS app, it will be able to return to its Default State. 기본 상태는 앱의 디자인에 따라 다른 앱에 대 한 다양 한 작업을 의미할 수 있으며, 기본 상태가 전혀 없을 수도 있습니다.The Default State can mean different things to different apps and, based on the design of an app, it might not have a Default State at all.

WKWatchConnectivityRefreshBackgroundTaskWKWatchConnectivityRefreshBackgroundTask

WatchOS 3에서 Apple은 새로운 WKWatchConnectivityRefreshBackgroundTask를 통해 백그라운드 새로 고침 API와의 통합 된 조사식 연결을 포함 합니다.In watchOS 3, Apple has integrated watch connectivity with the Background Refresh API via the new WKWatchConnectivityRefreshBackgroundTask. 이 새로운 기능을 사용 하 여 iPhone 앱은 watchOS 앱이 백그라운드에서 실행 되는 동안 해당 watch 앱에 새로운 데이터를 전달할 수 있습니다.Using this new feature, an iPhone app can deliver fresh data to its watch app counterpart, while the watchOS app is running in the background:

복잡 한 푸시, 앱 컨텍스트를 시작 하거나 iPhone 앱에서 사용자 정보를 업데이트 하는 것은 백그라운드에서 Apple Watch 앱의 절전 모드를 해제 합니다.Initiating a Complication Push, App Context, sending a file or updating User Information from the iPhone app will wake the Apple Watch app in the background.

WKWatchConnectivityRefreshBackgroundTask를 통해 시청 앱을 해제 하는 경우 iPhone 앱에서 데이터를 수신 하려면 표준 API 메서드를 사용 해야 합니다.When the watch app is woken via a WKWatchConnectivityRefreshBackgroundTask it will need to use the standard API methods to receive the data from the iPhone app.

  1. 세션이 활성화 되었는지 확인 합니다.Ensure that the Session has activated.
  2. HasContentPending 속성을 모니터링 합니다. 값이 true이면 앱에 처리할 데이터가 여전히 있습니다.Monitor the new HasContentPending property as long as the value is true, the app still has data to process. 이전 처럼 앱은 모든 데이터 처리를 마칠 때까지 작업을 유지 해야 합니다.As before, the app should hold onto the Task until it has finished processing all data.
  3. 처리할 데이터가 더 이상 없는 경우 (HasContentPending = false) 작업을 완료로 표시 하 여 시스템에 반환 합니다.When there is no more data to be processed (HasContentPending = false), mark the Task completed to return it to the system. 이 작업을 수행 하지 못하면 응용 프로그램의 할당 된 백그라운드 런타임이 고갈 되어 충돌 보고서가 발생 합니다.Failing to do this will exhaust the app's allotted background runtime resulting in a crash report.

백그라운드 API 수명 주기The Background API Lifecycle

새 백그라운드 작업 API의 모든 부분을 함께 배치 하는 일반적인 상호 작용 집합은 다음과 같습니다.Placing all of the pieces of the new Background Tasks API together, a typical set of interactions would look like the following:

  1. 먼저 watchOS 앱은 나중에 특정 시점으로 중지 되어 하는 백그라운드 작업을 예약 합니다.First, the watchOS app schedules a background Task to be awoke as some point in the future.
  2. 앱은 시스템에 의해 해제 작업을 보냅니다.The app is woken by the system and sent a Task.
  3. 앱은 작업을 처리 하 여 필요한 모든 작업을 완료 합니다.The app processes the Task to complete whatever work was required.
  4. 작업 처리의 결과로 앱은 나중에 추가 작업을 완료 하기 위해 더 많은 백그라운드 작업을 예약 해야 할 수 있습니다. 예를 들어 NSUrlSession를 사용 하 여 더 많은 콘텐츠를 다운로드할 수 있습니다.As a result of processing the Task, the app may need to schedule more background Tasks to complete more work in the future, such as downloading more content using a NSUrlSession.
  5. 앱은 작업을 완료 된 것으로 표시 하 고 시스템에 반환 합니다.The app marks the Task completed and returns it to the system.

리소스 사용Using Resources Responsibly

WatchOS 앱은 시스템의 공유 리소스에 대 한 드레이닝을 제한 하 여이 에코 시스템 내에서 매우 중요 하 게 동작 합니다.It is critical that a watchOS app behaves responsibly within this ecosystem by limiting its drain on the system's shared resources.

다음 시나리오를 살펴보세요.Take a look at the following scenario:

  1. 사용자가 1:00 PM에 watchOS 앱을 시작 합니다.The user launches a watchOS app at 1:00 PM.
  2. 앱은 1 시간 오후 2:00에 새 콘텐츠를 절전 모드에서 해제 하 고 다운로드 하는 작업을 예약 합니다.The app schedules a task to wake up and download new content in an hour at 2:00 PM.
  3. 오후 1:50 시 사용자는 앱을 다시 열어이 시점에서 해당 데이터와 UI를 업데이트할 수 있도록 합니다.At 1:50 PM the user re-opens the app which allows it to update its data and UI at this time.
  4. 앱이 10 분 후에 다시 앱을 절전 모드에서 해제 하는 대신 1 시간 오후 2:50에 실행 되도록 작업을 다시 예약 해야 합니다.Instead of letting the Task wake the app again in 10 minutes, the app should reschedule the Task to run an hour later at 2:50 PM.

모든 앱이 서로 다르지만 Apple에서는 시스템 리소스를 절약 하기 위해 위에 표시 된 것과 같은 사용 패턴을 찾을 것을 제안 합니다.While every app is different, Apple suggests finding patterns of usage, like those shown above, to help conserve system resources.

백그라운드 작업 구현Implementing Background Tasks

예를 들어이 문서는 사용자에 게 축구 점수를 보고 하는 가짜 MonkeySoccer 스포츠 앱을 사용 합니다.For the sake of example, this document will use the fake MonkeySoccer sports app that reports soccer scores to the user.

일반적인 사용 시나리오는 다음과 같습니다.Take a look at the following typical usage scenario:

사용자가 즐겨 사용 하는 축구 팀이 7:00 PM에서 9:00 PM으로 큰 일치 항목을 재생 하 여 앱이 사용자가 점수를 정기적으로 확인 하 고 30 분의 업데이트 간격을 결정 하는 것으로 간주 해야 합니다.The user's favorite soccer team is playing a big match from 7:00 PM to 9:00 PM so the app should expect the user to be checking the score regularly and it decides on a 30 minute update interval.

  1. 사용자가 앱을 열고 30 분 후에 백그라운드 업데이트에 대 한 작업을 예약 합니다.The user opens the app and it schedules a Task for background update 30 minutes later. 백그라운드 API를 사용 하면 지정 된 시간에 하나의 백그라운드 작업을 실행할 수 있습니다.The Background API allows only one type of background Task to be running at a given time.
  2. 앱은 작업을 수신 하 고 해당 데이터와 UI를 업데이트 한 다음 30 분 후에 다른 백그라운드 작업을 예약 합니다.The app receives the Task and updates its data and UI, then schedules for another background Task 30 minutes later. 개발자는 다른 백그라운드 작업을 예약 하는 것을 기억 하는 것이 중요 합니다. 그렇지 않으면 앱이 더 이상 업데이트를 awoken 수 없습니다.It is important that the developer remembers to schedule another background Task, or the app will never be re-awoken to get more updates.
  3. 다시, 앱은 작업을 수신 하 고 해당 데이터를 업데이트 하 고, UI를 업데이트 하 고, 30 분 후에 다른 백그라운드 작업을 예약 합니다.Again, the app receives the Task and updates its data, updates its UI and schedules another background Task 30 minutes later.
  4. 동일한 프로세스가 다시 반복 됩니다.The same process repeats again.
  5. 마지막 백그라운드 작업을 받고 앱에서 해당 데이터와 UI를 다시 업데이트 합니다.The last background Task is received and the app again updates its data and UI. 이 점수는 최종 점수 이므로 새 백그라운드 새로 고침을 예약 하지 않습니다.Since this is the final score it doesn't schedule for a new background refresh.

백그라운드 업데이트 예약Scheduling for Background Update

위의 시나리오에서 MonkeySoccer 앱은 다음 코드를 사용 하 여 백그라운드 업데이트를 예약할 수 있습니다.Given the above scenario, the MonkeySoccer app can use the following code to schedule for a background update:

private void ScheduleNextBackgroundUpdate ()
{
  // Create a fire date 30 minutes into the future
  var fireDate = NSDate.FromTimeIntervalSinceNow (30 * 60);

  // Create 
  var userInfo = new NSMutableDictionary ();
  userInfo.Add (new NSString ("LastActiveDate"), NSDate.FromTimeIntervalSinceNow(0));
  userInfo.Add (new NSString ("Reason"), new NSString ("UpdateScore"));

  // Schedule for update
  WKExtension.SharedExtension.ScheduleBackgroundRefresh (fireDate, userInfo, (error) => {
    // Was the Task successfully scheduled?
    if (error == null) {
      // Yes, handle if needed
    } else {
      // No, report error
    }
  });
}

앱을 awoken 하 고 요청 된 작업의 세부 정보를 저장할 NSMutableDictionary를 만드는 경우 나중에 새 NSDate 30 분이 생성 됩니다.It creates a new NSDate 30 minutes into the future when the app wants to be awoken and creates a NSMutableDictionary to hold the details of the requested Task. SharedExtensionScheduleBackgroundRefresh 메서드를 사용 하 여 예약 된 작업을 요청 합니다.The ScheduleBackgroundRefresh method of the SharedExtension is used to request the task be scheduled.

요청 된 작업을 예약할 수 없는 경우 시스템에서 NSError 반환 됩니다.The system will return a NSError if it was unable to schedule the requested Task.

업데이트 처리Processing the Update

다음으로 점수를 업데이트 하는 데 필요한 단계를 보여 주는 5 분 창에 대해 자세히 살펴보겠습니다.Next, take a closer look at the 5 minute window showing the steps required to update the score:

  1. 오후 7:30:02 시 앱은 시스템에 의해 활성화 되며 업데이트 백그라운드 작업을 제공 합니다.At 7:30:02 PM the app is awakened by the system and given the update background Task. 첫 번째 우선 순위는 서버에서 최신 점수를 가져오는 것입니다.Its first priority is to get the latest scores from the server. 아래 NSUrlSession 예약을 참조 하세요.See Scheduling a NSUrlSession below.
  2. 7:30:05에 앱이 원래 작업을 완료 하면 시스템은 응용 프로그램을 절전 모드로 전환 하 고 요청 된 데이터를 백그라운드에서 계속 다운로드 합니다.At 7:30:05 the app completes the original Task, the system puts the app to sleep and continues to download the requested data in the background.
  3. 시스템이 다운로드를 완료 하면 다운로드 한 정보를 처리할 수 있도록 앱의 절전 모드를 해제 하는 새 작업을 만듭니다.When the system completes the download, it creates a new Task to wake the app so it can process the downloaded information. 백그라운드 작업 처리 및 아래의 다운로드 완료 처리 를 참조 하세요.See Handling Background Tasks and Handling the Download Completing below.
  4. 앱은 업데이트 된 정보를 저장 하 고 작업이 완료 된 것으로 표시 합니다.The app saves the updated information and marks the Task completed. 지금은 개발자가 앱의 사용자 인터페이스를 업데이트 하려고 할 수 있지만 Apple에서 해당 프로세스를 처리 하는 스냅숏 작업 예약을 제안 합니다.The developer may be tempted to update the app's User Interface at this time, however Apple suggests scheduling a Snapshot Task to handle that process. 아래 스냅숏 업데이트 예약을 참조 하세요.See Scheduling a Snapshot Update below.
  5. 앱은 스냅숏 작업을 수신 하 고, 사용자 인터페이스를 업데이트 하 고, 작업이 완료 된 것으로 표시 합니다.The app receives the Snapshot Task, updates its User Interface and marks the Task completed. 아래의 스냅숏 업데이트 처리를 참조 하세요.See Handling a Snapshot Update below.

NSUrlSession 예약Scheduling a NSUrlSession

다음 코드를 사용 하 여 최신 점수 다운로드를 예약할 수 있습니다.The following code can be used to schedule the downloading of the latest scores:

private void ScheduleURLUpdateSession ()
{
  // Create new configuration
  var configuration = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration ("com.example.urlsession");

  // Create new session
  var backgroundSession = NSUrlSession.FromConfiguration (configuration);

  // Create and start download task
  var downloadTask = backgroundSession.CreateDownloadTask (new NSUrl ("https://example.com/gamexxx/currentScores.json"));
  downloadTask.Resume ();
}

NSUrlSession을 구성 하 고 만든 다음 해당 세션을 사용 하 여 CreateDownloadTask 메서드를 사용 하 여 새 다운로드 작업을 만듭니다.It configures and creates a new NSUrlSession, then uses that session to create a new download Task using the CreateDownloadTask method. 다운로드 작업의 Resume 메서드를 호출 하 여 세션을 시작 합니다.It calls the Resume method of the download Task to start the session.

백그라운드 작업 처리Handling Background Tasks

앱은 WKExtensionDelegateHandleBackgroundTasks 메서드를 재정의 하 여 들어오는 백그라운드 작업을 처리할 수 있습니다.By overriding the HandleBackgroundTasks method of the WKExtensionDelegate, the app can handle the incoming background tasks:

using System;
using System.Collections.Generic;
using Foundation;
using WatchKit;

namespace MonkeySoccer.MonkeySoccerExtension
{
  public class ExtensionDelegate : WKExtensionDelegate
  {
    #region Computed Properties
    public List<WKRefreshBackgroundTask> PendingTasks { get; set; } = new List<WKRefreshBackgroundTask> ();
    #endregion

    ...
    
    #region Public Methods
    public void CompleteTask (WKRefreshBackgroundTask task)
    {
      // Mark the task completed and remove from the collection
      task.SetTaskCompleted ();
      PendingTasks.Remove (task);
    }
    #endregion 

    #region Override Methods
    public override void HandleBackgroundTasks (NSSet<WKRefreshBackgroundTask> backgroundTasks)
    {
      // Handle background request
      foreach (WKRefreshBackgroundTask task in backgroundTasks) {
        // Is this a background session task?
        var urlTask = task as WKUrlSessionRefreshBackgroundTask;
        if (urlTask != null) {
          // Create new configuration
          var configuration = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration (urlTask.SessionIdentifier);

          // Create new session
          var backgroundSession = NSUrlSession.FromConfiguration (configuration, new BackgroundSessionDelegate (this, task), null);

          // Keep track of all pending tasks
          PendingTasks.Add (task);
        } else {
          // Ensure that all tasks are completed
          task.SetTaskCompleted ();
        }
      }
    }
    #endregion
    
    ...
  }
}

HandleBackgroundTasks 메서드는 시스템에서 WKUrlSessionRefreshBackgroundTask을 검색 하 여 앱을 전송한 (backgroundTasks) 모든 작업을 순환 합니다.The HandleBackgroundTasks method cycles through all of the Tasks that the system has sent the app (in backgroundTasks) searching for a WKUrlSessionRefreshBackgroundTask. 이 항목이 발견 되 면 세션에 다시 참가 하 고 다운로드 완료를 처리 하 NSUrlSessionDownloadDelegate를 연결 합니다 (아래 완료 된 다운로드 처리 참조).If one is found, it rejoins the session and attaches a NSUrlSessionDownloadDelegate to handle the download completing (see Handling the Download Completing below):

// Create new session
var backgroundSession = NSUrlSession.FromConfiguration (configuration, new BackgroundSessionDelegate (this, task), null);

컬렉션에 추가 하 여 완료 될 때까지 태스크에 대 한 핸들을 유지 합니다.It keeps a handle on the Task until it has completed by adding it to a collection:

public List<WKRefreshBackgroundTask> PendingTasks { get; set; } = new List<WKRefreshBackgroundTask> ();
...

// Keep track of all pending tasks
PendingTasks.Add (task);

앱에 전송 되는 모든 작업을 완료 해야 하며, 현재 처리 중인 모든 작업에 대해 완료로 표시 합니다.All of the Tasks sent to the app need to be completed, for any task not currently being handled, mark it complete:

if (urlTask != null) {
  ...
} else {
  // Ensure that all tasks are completed
  task.SetTaskCompleted ();
}

다운로드 완료 처리Handling the Download Completing

MonkeySoccer 앱은 다음 NSUrlSessionDownloadDelegate 대리자를 사용 하 여 다운로드를 처리 하 고 요청 된 데이터를 처리 합니다.The MonkeySoccer app uses the following NSUrlSessionDownloadDelegate delegate to handle the download completing and process the requested data:

using System;
using Foundation;
using WatchKit;

namespace MonkeySoccer.MonkeySoccerExtension
{
  public class BackgroundSessionDelegate : NSUrlSessionDownloadDelegate
  {
    #region Computed Properties
    public ExtensionDelegate WatchExtensionDelegate { get; set; }

    public WKRefreshBackgroundTask Task { get; set; }
    #endregion

    #region Constructors
    public BackgroundSessionDelegate (ExtensionDelegate extensionDelegate, WKRefreshBackgroundTask task)
    {
      // Initialize
      this.WatchExtensionDelegate = extensionDelegate;
      this.Task = task;
    }
    #endregion

    #region Override Methods
    public override void DidFinishDownloading (NSUrlSession session, NSUrlSessionDownloadTask downloadTask, NSUrl location)
    {
      // Handle the downloaded data
      ...

      // Mark the task completed
      WatchExtensionDelegate.CompleteTask (Task);

    }
    #endregion
  }
}

초기화 되 면 ExtensionDelegate 및이를 생성 한 WKRefreshBackgroundTask에 대 한 핸들을 유지 합니다.When initialized, it keeps a handle to both the ExtensionDelegate and the WKRefreshBackgroundTask that spawned it. DidFinishDownloading 메서드를 재정의 하 여 다운로드 완료를 처리 합니다.It overrides the DidFinishDownloading method to handle the download completing. 그런 다음는 ExtensionDelegateCompleteTask 메서드를 사용 하 여 작업을 완료 했음을 알리고 보류 중인 작업의 컬렉션에서 제거 합니다.Then uses the CompleteTask method of the ExtensionDelegate to inform the Task that it has completed and remove it from the collection of pending tasks. 위의 백그라운드 작업 처리 를 참조 하세요.See Handling Background Tasks above.

스냅숏 업데이트 예약Scheduling a Snapshot Update

다음 코드를 사용 하 여 스냅숏 작업에서 최신 점수를 사용 하 여 UI를 업데이트할 수 있도록 예약할 수 있습니다.The following code can be used to schedule a Snapshot Task to update the UI with the latest scores:

private void ScheduleSnapshotUpdate ()
{
  // Create a fire date of now
  var fireDate = NSDate.FromTimeIntervalSinceNow (0);

  // Create user info dictionary
  var userInfo = new NSMutableDictionary ();
  userInfo.Add (new NSString ("lastActiveDate"), NSDate.FromTimeIntervalSinceNow (0));
  userInfo.Add (new NSString ("reason"), new NSString ("UpdateScore"));

  // Schedule for update
  WKExtension.SharedExtension.ScheduleSnapshotRefresh (fireDate, userInfo, (error) => {
    // Was the Task successfully scheduled?
    if (error == null) {
      // Yes, handle if needed
    } else {
      // No, report error
    }
  });
}

위의 ScheduleURLUpdateSession 메서드와 마찬가지로 앱이 awoken 되는 경우에 대 한 새 NSDate을 만들고 요청 된 작업의 세부 정보를 저장 하는 NSMutableDictionary을 만듭니다.Just like ScheduleURLUpdateSession method above, it creates a new NSDate for when the app wants to be awoken and creates a NSMutableDictionary to hold the details of the requested Task. SharedExtensionScheduleSnapshotRefresh 메서드를 사용 하 여 예약 된 작업을 요청 합니다.The ScheduleSnapshotRefresh method of the SharedExtension is used to request the task be scheduled.

요청 된 작업을 예약할 수 없는 경우 시스템에서 NSError 반환 됩니다.The system will return a NSError if it was unable to schedule the requested Task.

스냅숏 업데이트 처리Handling a Snapshot Update

스냅숏 작업을 처리 하기 위해 HandleBackgroundTasks 메서드 (위의 백그라운드 작업 처리 참조)는 다음과 같이 수정 됩니다.To handle the Snapshot Task, the HandleBackgroundTasks method (see Handling Background Tasks above) is modified to look like the following:

public override void HandleBackgroundTasks (NSSet<WKRefreshBackgroundTask> backgroundTasks)
{
  // Handle background request
  foreach (WKRefreshBackgroundTask task in backgroundTasks) {
    // Take action based on task type
    if (task is WKUrlSessionRefreshBackgroundTask) {
      var urlTask = task as WKUrlSessionRefreshBackgroundTask;

      // Create new configuration
      var configuration = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration (urlTask.SessionIdentifier);

      // Create new session
      var backgroundSession = NSUrlSession.FromConfiguration (configuration, new BackgroundSessionDelegate (this, task), null);

      // Keep track of all pending tasks
      PendingTasks.Add (task);
    } else if (task is WKSnapshotRefreshBackgroundTask) {
      var snapshotTask = task as WKSnapshotRefreshBackgroundTask;

      // Update UI
      ...

      // Create a expiration date 30 minutes into the future
      var expirationDate = NSDate.FromTimeIntervalSinceNow (30 * 60);

      // Create user info dictionary
      var userInfo = new NSMutableDictionary ();
      userInfo.Add (new NSString ("lastActiveDate"), NSDate.FromTimeIntervalSinceNow (0));
      userInfo.Add (new NSString ("reason"), new NSString ("UpdateScore"));

      // Mark task complete
      snapshotTask.SetTaskCompleted (false, expirationDate, userInfo);
    } else {
      // Ensure that all tasks are completed
      task.SetTaskCompleted ();
    }
  }
}

메서드는 처리 중인 작업의 형식을 테스트 합니다.The method tests for the type of Task being processed. WKSnapshotRefreshBackgroundTask 경우에는 태스크에 대 한 액세스 권한을 얻게 됩니다.If it is a WKSnapshotRefreshBackgroundTask it gains access to the task:

var snapshotTask = task as WKSnapshotRefreshBackgroundTask;

메서드는 사용자 인터페이스를 업데이트 한 후 스냅숏이 유효 하지 않을 때 시스템에 알리기 위해 NSDate를 만듭니다.The method updates the User Interface then creates a NSDate to tell the system when the Snapshot will be stale. 사용자 정보를 사용 하 여 새 스냅숏을 설명 하 고 스냅숏 태스크가 완료 된 정보를이 정보로 표시 하 NSMutableDictionary를 만듭니다.It creates a NSMutableDictionary with user info to describe the new Snapshot and marks the Snapshot Task completed with this information:

// Mark task complete
snapshotTask.SetTaskCompleted (false, expirationDate, userInfo);

또한 앱이 기본 상태 (첫 번째 매개 변수)로 반환 되지 않는다는 것을 스냅숏 작업에 지시 합니다.Additionally, it also tells the Snapshot Task that the app is not returning to the Default State (in the first parameter). 기본 상태에 대 한 개념이 없는 앱은 항상이 속성을 true설정 해야 합니다.Apps that have no concept of a Default State should always set this property to true.

효율적으로 작업Working Efficiently

WatchOS 3 백그라운드 작업을 효율적으로 사용 하 고 사용 하 여 MonkeySoccer 앱이 점수를 업데이트 하는 데 걸린 5 분 창의 위 예제와 같이 앱은 총 15 초 동안만 활성화 되었습니다.As seen in the above example of the five minute window that the MonkeySoccer app took to update its scores, by working efficiently and using the new watchOS 3 background Tasks, the app was only active for a total of 15 seconds:

이렇게 하면 앱이 사용 가능한 Apple Watch 리소스 및 배터리 수명 모두에 미치는 영향을 줄일 수 있으며,이를 통해 앱이 시청에서 실행 되는 다른 앱과 더 원활 하 게 작동할 수 있습니다.This lowers the impact that the app will have on both available Apple Watch resources and battery life and also allows the app to work better with other apps running on the watch.

예약 작동 방법How Scheduling Works

WatchOS 3 앱은 포그라운드로 실행 되는 동안 항상 실행 되도록 예약 되며, 데이터 업데이트 또는 UI 다시 그리기와 같은 필요한 모든 종류의 처리 작업을 수행할 수 있습니다.While a watchOS 3 app is in the foreground, it is always scheduled to run and can do any type of processing required such as update data or redraw its UI. 앱이 백그라운드로 이동 하면 일반적으로 시스템에서 일시 중단 되 고 모든 런타임 작업이 중단 됩니다.When the app moves into the background, it is usually suspended by the system and all runtime operations are halted.

앱은 백그라운드에 있지만 특정 작업을 신속 하 게 실행 하기 위해 시스템에서 대상으로 지정할 수 있습니다.While the app is in the background, it may be targeted by the system to quickly run a specific task. 따라서 watchOS 2에서 시스템은 백그라운드 앱을 일시적으로 절전 모드에서 해제 하 여 긴 모양 알림 처리 또는 앱의 복잡 한 업데이트 등의 작업을 수행할 수 있습니다.So, in watchOS 2, the system might temporarily wake a background app to do things like handling a long look notification or to update the app's Complication. WatchOS 3에는 앱을 백그라운드에서 실행할 수 있는 몇 가지 새로운 방법이 있습니다.In watchOS 3, there are several new ways that an app can be run in the background.

앱이 백그라운드에 있는 동안 시스템은 몇 가지 제한 사항을 적용 합니다.While an app is in the background, the system imposes several limits on it:

  • 지정 된 작업을 완료 하는 데 몇 초 밖에 안 걸립니다.It is only given a few seconds to complete any given task. 시스템은 전달 된 시간 뿐만 아니라 앱이이 제한을 파생 시키는 데 소비 하는 CPU의 양을 고려 합니다.The system takes into consideration not only the amount of time passed but also how much CPU power the app is consuming to derive this limit.
  • 제한을 초과 하는 앱은 다음 오류 코드와 함께 중단 됩니다.Any app that exceeds its limits will be killed with the following error codes:
    • CPU -0xc51bad01CPU - 0xc51bad01
    • 시간 -0xc51bad02Time - 0xc51bad02
  • 시스템은 앱에서 수행 하도록 요청 하는 백그라운드 작업의 유형에 따라 다른 한도를 적용 합니다.The system will impose different limits based on the type of Background Task it has asked the app to perform. 예를 들어 WKApplicationRefreshBackgroundTaskWKURLSessionRefreshBackgroundTask 작업에는 다른 유형의 백그라운드 작업에 대해 약간 더 긴 런타임이 제공 됩니다.For example, WKApplicationRefreshBackgroundTask and WKURLSessionRefreshBackgroundTask Tasks are given slightly longer runtimes over other types of Background Tasks.

복잡 한 앱 업데이트Complications and App Updates

Apple에서 watchOS 3에 추가 된 새로운 백그라운드 작업 외에도, watchOS 앱의 경우 앱이 백그라운드 업데이트를 받는 방법과 시기에 영향을 줄 수 있습니다.In addition to the new Background Tasks that Apple has added to watchOS 3, a watchOS app's Complications can have an affect on how and when the app receives background updates.

유용한 정보를 한 눈에 파악할 수 있는 작은 시각적 요소는 복잡 합니다.Complications are small visual elements that provide useful information at a glance. 선택 된 조사식에 따라 사용자가 watchOS 3의 watch 앱에서 제공 하는 하나 이상의 복잡 한 조사식을 사용자 지정할 수 있습니다.Depending on the watch face selected, the user has the ability to customize a watch face with one or more Complication that can be supplied by a watch app in watchOS 3.

사용자가 응용 프로그램의 감시에 대 한 복잡 한 문제 중 하나를 포함 하는 경우 앱은 다음과 같은 업데이트 된 이점을 제공 합니다.If the user includes one of the app's Complications on their watch face, it gives the app the following updated benefits:

  • 이를 통해 시스템은 백그라운드에서 앱을 시작 하 고, 메모리에 보관 하 고, 업데이트 하는 데 추가 시간을 제공 하는 즉시 시작 상태로 응용 프로그램을 유지할 수 있습니다.It causes the system to keep the app in a ready-to-launch state, where it attempts to launch the app in the background, keeps it in memory and gives it extra time to update.
  • 매우 복잡 한 일은 하루에 최소 50의 푸시 업데이트를 보장 합니다.Complications are guaranteed at least 50 push updates per day.

개발자는 사용자가 위에 나열 된 이유 때문에 사용자가 감시에 추가 하는 것을 유도 하기 위해 앱에 대 한 매우 복잡 한 상황을 만들기 위해 노력 해야 합니다.The developer should always strive to create compelling Complications for their apps to entice the user into adding them to their watch face for the reasons listed above.

WatchOS 2에서는 응용 프로그램이 백그라운드에서 런타임을 수신 하는 기본 방법입니다.In watchOS 2, Complications were the primary way that an app received runtime while in the background. WatchOS 3에서는 복잡 한 앱이 시간당 여러 업데이트를 받도록 보장 되지만, WKExtensions를 사용 하 여 더 많은 런타임을 요청 하 여 복잡 한 문제를 업데이트할 수 있습니다.In watchOS 3, a Complication app will still be ensured to receive multiple updates per hour, however, it can use WKExtensions to request more runtime to update its complications.

연결 된 iPhone 앱에서 복잡 한 사항을 업데이트 하는 데 사용 되는 다음 코드를 살펴보세요.Take a look at the following code used to update the Complication from the connected iPhone app:

using System;
using WatchConnectivity;
using UIKit;
using Foundation;
using System.Collections.Generic;
using System.Linq;
...

private void UpdateComplication ()
{

  // Get session and the number of remaining transfers
  var session = WCSession.DefaultSession;
  var transfers = session.RemainingComplicationUserInfoTransfers;

  // Create user info dictionary
  var iconattrs = new Dictionary<NSString, NSObject>
    {
      {new NSString ("lastActiveDate"), NSDate.FromTimeIntervalSinceNow (0)},
      {new NSString ("reason"), new NSString ("UpdateScore")}
    };

  var userInfo = NSDictionary<NSString, NSObject>.FromObjectsAndKeys (iconattrs.Values.ToArray (), iconattrs.Keys.ToArray ());

  // Take action based on the number of transfers left
  if (transfers < 1) {
    // No transfers left, either attempt to send or inform
    // user of situation.
    ...
  } else if (transfers < 11) {
    // Running low on transfers, only send on important updates
    // else conserve for a significant change.
    ...
  } else {
    // Send data
    session.TransferCurrentComplicationUserInfo (userInfo);
  }
}

WCSessionRemainingComplicationUserInfoTransfers 속성을 사용 하 여 앱이 하루 동안 남은 우선 순위 전송 수를 확인 한 다음 해당 숫자를 기반으로 하 여 조치를 취합니다.It uses the RemainingComplicationUserInfoTransfers property of the WCSession to see how many high priority transfers the app has left for the day and then takes action based on that number. 앱이 낮은 전송 실행을 시작 하면 사소한 업데이트를 보낼 때 보류 하 고 중요 한 변경 내용이 있는 경우에만 정보를 보낼 수 있습니다.If the app begins to run low on transfers, it can hold off on sending minor updates and only send information when there is a significant change.

예약 및 도크Scheduling and the Dock

WatchOS 3에서 Apple은 사용자가 즐겨 찾는 앱을 고정 하 고 신속 하 게 액세스할 수 있는 도크를 추가 했습니다.In watchOS 3, Apple has added the Dock where users can pin their favorite apps and quickly access them. 사용자가 Apple Watch의 측면 단추를 누르면 고정 된 앱 스냅숏의 갤러리가 표시 됩니다.When the user presses the Side Button on the Apple Watch, a gallery of pinned app snapshots will be displayed. 사용자는 왼쪽 또는 오른쪽으로 살짝 밀어 원하는 앱을 찾은 다음 앱을 탭 하 여 실행 중인 앱의 인터페이스로 스냅숏을 바꿀 수 있습니다.The user can swipe left or right to find the desired app, then tap the app to launch it replacing the snapshot with the running app's interface.

시스템은 정기적으로 앱 UI의 스냅숏을 사용 하 고 이러한 스냅숏을 사용 하 여 문서를 채웁니다. watchOS를 사용 하면이 스냅숏이 만들어지기 전에 앱에서 콘텐츠 및 UI를 업데이트할 수 있습니다.The system periodically takes snapshots of the app's UI and uses those snapshots to populate the Docs. watchOS gives the app the opportunity to update its content and UI before this snapshot is taken.

도킹에 고정 된 앱은 다음을 예측할 수 있습니다.Apps that have been pinned to the dock can expect the following:

  • 시간당 업데이트를 하나 이상 받게 됩니다.They will receive a minimum of one updated per hour. 여기에는 응용 프로그램 새로 고침 작업과 스냅숏 태스크가 모두 포함 됩니다.This includes both an App Refresh Task and a Snapshot Task.
  • 업데이트 예산이 도크의 모든 앱 간에 배포 됩니다.The update budget is distributed between all of the apps in the Dock. 따라서 사용자가 고정 한 앱의 수를 줄이면 각 앱에서 받게 될 가능성이 더 높은 업데이트가 제공 됩니다.So the fewer apps the user has pinned, the more potential updates each app will receive.
  • 앱이 도킹에서 선택 될 때 앱이 신속 하 게 다시 시작 되도록 메모리에 보관 됩니다.The app will be kept in memory so the app will resume quickly when selected from the Dock.

사용자가 실행 한 마지막 앱은 가장 최근에 사용 된 앱으로 간주 되며 도크에서 마지막 슬롯을 차지 하 게 됩니다.The last app the user ran will be considered the Most Recently Used app and will occupy the last slot in the Dock. 여기에서 사용자는 항구에 영구적으로 고정 하도록 선택할 수 있습니다.From there, there user can choose to pin it permanently to the Dock. 가장 최근에 사용한 것은 사용자가 도킹에 이미 고정 한 다른 즐겨 찾는 앱 처럼 처리 됩니다.The Most Recently Used will be treated like any other favorite app the user has already pinned to the Dock.

중요

홈 화면에만 추가 된 앱에는 정기적인 일정이 제공 되지 않습니다.Apps that have only been added to the Home Screen will not be given any regular scheduling. 정기적인 일정 예약 및 백그라운드 업데이트를 받으려면 앱을 도크에 추가 해야 합니다 .To receive regular scheduling and background updates, an app must be added to the Dock.

이 문서 앞부분에서 설명한 것 처럼 스냅숏은 앱에 대 한 미리 보기 및 시작 이미지 모두로 작동 하므로 watchOS 3에서 매우 중요 합니다.As stated earlier in this document, Snapshots are very important in watchOS 3 since they function as both the preview and launch images for the app. 사용자가 도크에서 앱에 대 한 작업을 하는 경우, 전체 화면으로 확장 되 고, 포그라운드를 입력 하 고 실행을 시작 하므로 스냅숏이 최신 상태를 유지 해야 합니다.If the user settles on an app in the Dock, it will expand to full screen, enter the foreground and start running, so it is imperative that the Snapshot be up-to-date.

시스템이 응용 프로그램의 UI에 대 한 새 스냅숏이 필요한 것으로 결정 하는 경우가 있을 수 있습니다.There might be times when the system decides it needs a fresh Snapshot of the app's UI. 이 경우 스냅숏 요청은 앱의 런타임 예산에 대해 계산 되지 않습니다.In this situations, the Snapshot request will not count against the app's runtime budget. 다음은 시스템 스냅숏 요청을 트리거합니다.The following will trigger a system Snapshot request:

  • 복잡 한 타임 라인 업데이트.A Complication timeline update.
  • 앱의 알림과의 사용자 상호 작용User interaction with an app's notification.
  • 포그라운드에서 백그라운드 상태로 전환Switching from the Foreground to the Background state.
  • 1 시간이 백그라운드 상태가 된 후에 앱이 기본 상태로 돌아갈 수 있습니다.After one hour of being in the Background state, so the app can return to the Default State.
  • WatchOS 처음 부팅 될 때.When watchOS first boots.

모범 사례Best Practices

Apple에서는 백그라운드 작업을 수행할 때 다음과 같은 모범 사례를 제안 합니다.Apple suggests the following best practices when working with Background Tasks:

  • 앱을 업데이트 해야 하는 빈도를 예약 합니다.Schedule as often as the app needs to be updated. 앱이 실행 될 때마다 미래의 요구를 재평가 하 고 필요에 따라이 일정을 조정 해야 합니다.Every time the app runs it should re-evaluate its future needs and adjust this schedule as required.
  • 시스템이 백그라운드 새로 고침 작업을 보내고 앱에 업데이트가 필요 하지 않은 경우 업데이트가 실제로 필요할 때까지 작업을 연기 합니다.If the system sends a Background Refresh Task and the app doesn't require an update, defer the work until an update is actually required.
  • 앱에서 사용할 수 있는 모든 런타임 기회를 고려 합니다.Consider all runtime opportunities available to an app:
    • 도킹 및 포그라운드 활성화.Dock and Foreground activation.
    • 알림을.Notifications.
    • 복잡 한 업데이트.Complication updates.
    • 백그라운드 새로 고침Background refreshes.
  • 다음과 같은 범용 백그라운드 런타임에 ScheduleBackgroundRefresh를 사용 합니다.Use ScheduleBackgroundRefresh for general-purpose background runtime such as:
    • 정보에 대 한 시스템 폴링.Polling the system for information.
    • 배경 데이터를 요청 하는 미래 NSURLSessions 예약 합니다.Schedule future NSURLSessions to request background data.
    • 알려진 시간 전환.Known time transitions.
    • 복잡 한 업데이트를 트리거합니다.Triggering Complication updates.

스냅숏 모범 사례Snapshot Best Practices

스냅숏 업데이트를 사용 하는 경우 Apple은 다음과 같은 제안 사항을 만듭니다.When working with Snapshot updates, Apple makes the following suggestions:

  • 필요한 경우에만 스냅숏을 무효화 합니다. 예를 들어 중요 한 내용이 변경 된 경우에 해당 합니다.Invalidate Snapshots only when required, for example, when there is a significant content change.
  • 빈도가 높은 스냅숏 무효화를 방지 합니다.Avoid high-frequency Snapshot invalidation. 예를 들어 타이머 앱은 초 마다 스냅숏을 업데이트 해서는 안 됩니다. 타이머가 종료 된 경우에만 수행 해야 합니다.For example, a timer app shouldn't update the Snapshot every second, it should only be done when the timer has ended.

앱 데이터 흐름App Data Flow

Apple 데이터 흐름을 사용 하려면 다음을 제안 합니다.Apple suggest the following for working with data flow:

외부 이벤트 (예: 연결 감시)는 앱을 절전 모드에서 해제 합니다.An external event (such as Watch Connectivity) wakes the app. 이렇게 하면 앱이 해당 데이터 모델 (앱 현재 상태를 나타냄)을 강제로 업데이트 합니다.This forces the app to update its Data Model (that represents the apps current state). 데이터 모델 변경의 결과로 앱은 해당 문제를 업데이트 하 고, 새 스냅숏을 요청 하 고, 더 많은 데이터를 가져와 추가 백그라운드 새로 고침을 예약 하는 백그라운드 NSURLSession 시작 해야 할 수 있습니다.As a result of the Data Model change the app will need to update its Complications, request a new Snapshot, possibly start a background NSURLSession to pull more data and schedule further background refreshes.

앱 수명 주기The App Lifecycle

도킹 및 즐겨 사용 하는 앱을 고정 하는 기능 때문에 Apple은 사용자가 훨씬 더 많은 앱 간을 자주 이동 하는 것으로 간주 합니다. watchOS 2를 사용 하는 것으로 간주 됩니다.Because of the Dock and the ability to pin favorite apps to it, Apple thinks that users will be moving between far more apps, far more often, then they did with watchOS 2. 따라서 앱은 이러한 변경을 처리할 준비가 되어 있고 포그라운드 및 배경 상태 사이를 빠르게 이동할 수 있어야 합니다.As a result, the app should be ready to handle this change and move between the foreground and background states quickly.

Apple의 제안 사항은 다음과 같습니다.Apple has the following suggestions:

  • 포그라운드 활성화를 시작할 때 앱에서 가능한 한 빨리 백그라운드 작업을 완료 하도록 합니다.Ensure that the app finishes any background task as soon as possible upon entering foreground activation.
  • NSProcessInfo.PerformExpiringActivity를 호출 하 여 배경을 시작 하기 전에 모든 포그라운드 작업을 완료 해야 합니다.Ensure to finish all foreground work before entering the background by calling NSProcessInfo.PerformExpiringActivity.
  • WatchOS 시뮬레이터에서 앱을 테스트 하는 경우 응용 프로그램이 기능을 제대로 테스트 하는 데 필요한 만큼 새로 고칠 수 있도록 작업 예산이 적용 되지 않습니다.When testing an app in the watchOS Simulator, none of the Task budgets will be enforced so an app can refresh as much as needed to properly test a feature.
  • ITunes Connect에 게시 하기 전에 항상 실제 Apple Watch 하드웨어에서 테스트 하 여 앱이 예산을 지난 후에 실행 되지 않도록 합니다.Always test on real Apple Watch hardware to ensure that the app isn't running past its budgets before publishing to iTunes Connect.
  • Apple은 테스트 및 디버깅 중에 Apple Watch를 충전기에 유지 하는 것을 제안 합니다.Apple suggests keeping the Apple Watch on the charger while testing and debugging.
  • 콜드 시작 및 앱 다시 시작이 모두 철저 하 게 테스트 되었는지 확인 합니다.Ensure that both cold launching and resuming an app are thoroughly tested.
  • 모든 앱 태스크가 완료 되는지 확인 합니다.Verify that all app Tasks are being completed.
  • 최적/최악의 시나리오를 모두 테스트 하기 위해 도크에 고정 된 앱의 수를 변경 합니다.Vary the number of apps that are pinned in the Dock to test both the best and worst case scenarios.

요약Summary

이 문서에서는 watchOS의 향상 된 기능 및이를 사용 하 여 시청 앱을 최신 상태로 유지 하는 방법에 대해 설명 했습니다.This article has covered the enhancements Apple has made to watchOS and how they can be used to keep a watch app up-to-date. 먼저 watchOS 3에 추가 된 Apple의 모든 새 백그라운드 작업에 대해 설명 했습니다.First, it covered all of the new Background Task Apple has added in watchOS 3. 그런 다음 백그라운드 API 수명 주기와 Xamarin watchOS 앱에서 백그라운드 작업을 구현 하는 방법을 살펴보았습니다.Then, it covered the Background API Lifecycle and how to implement Background Tasks in a Xamarin watchOS app. 마지막으로, 예약의 작동 방식에 대해 설명 하 고 몇 가지 모범 사례를 제공 했습니다.Finally, it covered how scheduling works and gave some best practices.