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

Watchos 3 가지는 watch 앱 수 해당 정보가 최신 상태로 유지 하는 세 가지 방법으로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.
  • (업데이트 하는 추가 시간 제공)에 해당 복잡성 중 하나 필요 합니다.Having one of its Complications on the watch face (giving it extra time to update).
  • 새 도킹을 앱에 사용자 pin 필요 (여기서는 메모리에 유지 되 고 자주 업데이트) 합니다.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. 커피숍에서 나가기 전에 신속 하 게 체크 인할는 복잡 한 해당 watch 화면에서를 사용 하 여 날씨 합니다.Before leaving the coffee shop, they quickly check the weather with a Complication on their watch face.
  3. 점심을 하기 전에 사용 하 여 맵 앱 iPhone의 주변 식당을 찾고 주소록에 클라이언트를 충족 하는 예약.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의 트래픽 홈 구동 하기 전에 확인.In the evening, they use the Maps app on the iPhone to check traffic before driving home.
  6. 방식에 일부 우유 선택 하도록 요청 하는 Apple Watch iMessage 알림의 받을 때 집 하 고 "확인" 응답을 보낼 빠른 응답 기능을 사용 합니다.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".

"눈" 때문에 (3 초 미만) 하는 방법을 사용자가 있습니다 일반적으로, Apple Watch 앱을 사용 하려는 특성 충분치 않은 응용 프로그램에서 원하는 정보를 가져오고 사용자에 게 표시 하기 전에 해당 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.

새 Apple Api가 포함 3 watchOS 앱에 대 한 예약 수를 백그라운드 새로 고침 원하는 정보가 준비 있어야 사용자가 요청할 및.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. 위에서 설명한 날씨 Complication의 예제를 수행 합니다.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. 사용자 앱의 Complication에서 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.

시스템이 제공 하는 이러한 작업은 새 호출 하 여 HandleBackgroundTasks 메서드는 WKExtensionDelegate 위임 합니다.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.
  • 조사식 연결 백그라운드 - WKWatchConnectivityRefreshBackgroundTask 쌍을 이루는 iPhone에서 백그라운드 데이터를 받을 때 앱에 대 한 작업을 시작 합니다.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:

앱 작업의 런타임 내에서 모든 종류의 업데이트와 같은 로컬 처리 Complication 타임 라인을 수행 하거나 사용 하 여 필요한 일부 데이터를 인출 된 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.

시스템에 앱 UI의 스냅숏을 정기적으로 사용 (전송 하 여를 WKSnapshotRefreshBackgroundTask) 및 해당 스냅숏을 사용 하 여 도킹을 채웁니다.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. 사용자 Dock의 앱에 도달, 하는 경우 전체 화면으로 확장 하 고, 전경을 입력 하 고 스냅숏이 최신 상태로 유지할 수는 반드시 실행 시작: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:

시스템 다시 발급할는 WKSnapshotRefreshBackgroundTask 스냅숏을 생성 하는 앱을 준비할 수 있습니다 (데이터 및 UI 업데이트) 하기 전에: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 watch 연결와 통합 백그라운드 새로 고침 API를 통해 새 WKWatchConnectivityRefreshBackgroundTask합니다.In watchOS 3, Apple has integrated watch connectivity with the Background Refresh API via the new WKWatchConnectivityRefreshBackgroundTask. 이 새로운 기능을 사용 하 여 iPhone 앱 새 데이터를 제공할 수 watch 앱 상응 watchOS 앱은 백그라운드에서 실행 되는 동안: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:

푸시 Complication를 시작할 앱 컨텍스트를 파일로 보내거나 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.

Watch 앱을 통해 경우 절전 모드는 WKWatchConnectivityRefreshBackgroundTask 표준 API 메서드를 사용 하 여 iPhone 앱에서 데이터를 수신 하도록 해야 합니다.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. 모든 데이터를 처리 완료 될 때까지 이전에 앱 작업에 hold 해야 합니다.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 시에 watchOS 앱을 시작 합니다.The user launches a watchOS app at 1:00 PM.
  2. 앱 절전 오후 2 시에 1 시간에 새 콘텐츠를 다운로드 하는 작업을 예약 합니다.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 분 후에 다시 작업 wake 앱 대신, 앱에는 나중에 오후 2 시 50 분에서 1 시간 동안 실행 되도록 작업을 다시 예약 해야 합니다.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:

사용자의 즐겨찾기 축구 팀에서 앱 사용자가 점수를 정기적으로 확인 되어야 하 고 30 분에 대 한 업데이트 간격으로 결정 오후 7 시에서 오후 9 시에 일치 하는 큰 항목을 재생 합니다.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. 개발자가 다른 백그라운드 작업을 예약 하거나 앱 됩니다 하지 수 다시 이더라도 추가 업데이트를 가져오려고 하는 것입니다.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
        }
    });
}

새로 만듭니다 NSDate 30 분 이후 when 앱 이더라도 수 하려는 만들고를 NSMutableDictionary 요청된 작업의 세부 정보를 포함 하 합니다.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. 합니다 ScheduleBackgroundRefresh 메서드는 SharedExtension 태스크 예약을 요청 하는 데 사용 됩니다.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 PM에 앱을 시스템에 의해 활성화 하 고 업데이트 백그라운드 작업을 지정 합니다.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

재정의 하 여 합니다 HandleBackgroundTasks 메서드는 WKExtensionDelegate, 앱이 들어오는 백그라운드 작업을 처리할 수: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 시스템 앱을 전송한는 모든 작업을 통해 메서드 주기 (에서 backgroundTasks)에 대 한 검색을 WKUrlSessionRefreshBackgroundTask.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
    }
}

초기화 될 때 둘 다에 대 한 핸들을 유지 합니다 ExtensionDelegateWKRefreshBackgroundTask 는 생성 된 것입니다.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. 사용 하 여는 CompleteTask 메서드는 ExtensionDelegate 작업이 완료 되었음을 알리고 보류 중인 작업의 컬렉션에서 제거 합니다.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 만드는 새 메서드 위의 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. 합니다 ScheduleSnapshotRefresh 메서드는 SharedExtension 태스크 예약을 요청 하는 데 사용 됩니다.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

볼 수 있듯이 MonkeySoccer 앱을 효율적으로 작동 하 고 새 watchOS를 사용 하 여 해당 점수를 업데이트 하는 5 분 창 위의 예에서 3 백그라운드 작업을 앱을 총 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 시스템 길게 표시 알림 처리와 같은 작업을 수행 하거나 앱의 Complication 업데이트할 백그라운드 앱을 일시적으로 절전 수 있습니다.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

WatchOS 앱의 복잡성은 Apple watchOS 3에 추가 하는 새 백그라운드 작업을 하는 것 외에도 앱 백그라운드 업데이트를 받는 방법 및 시기에 영향을 줄을 가질 수 있습니다.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.

복잡성은 한 눈에 유용한 정보를 제공 하는 작은 visual 요소입니다.Complications are small visual elements that provide useful information at a glance. 선택한 watch 화면에 따라 사용자는 시계 모드에서 watchOS 3에서에서 watch 앱을 제공할 수 있는 하나 이상의 Complication 사용 하 여 사용자 지정할 수 있습니다.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.

사용자가 watch 화면에 앱의 복잡성 중 하나를 포함 하는 경우 또한 앱 업데이트 다음 혜택: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.

개발자는 항상 사용자 위에 나열 된 이유로 해당 watch 화면에 추가 하도록 유인 하는 앱에 대 한 매력적인 복잡성을 만들려면 위해 노력 합니다.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 시간 당 여러 업데이트를 받는 Complication 앱 확인 여전히 됩니다, 사용할 수 있지만 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 앱에서 Complication를 업데이트 하는 데 다음 코드를 살펴보십시오.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);
    }
}

사용 하 여는 RemainingComplicationUserInfoTransfers 의 속성을 WCSession 얼마나 많은 우선 순위가 높은 앱 전송 보려는 떠난 일 한 다음 해당 번호를 기준으로 한 작업을 수행 합니다.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:

  • 최소 1 시간 마다 업데이트를 받게 됩니다.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. 사용자 Dock의 앱에 도달, 하는 경우 전체 화면으로 확장 하 고, 전경을 입력 하 고 스냅숏을 최신 상태로 유지할 수는 명령적 이므로 실행을 시작 합니다.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:

  • Complication 타임 라인 업데이트 합니다.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 업데이트 합니다.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.
    • 트리거 Complication 업데이트 합니다.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. 예를 들어 타이머 앱 스냅숏을 1 초 마다 업데이트 해서는 안 됩니다, 그리고 타이머를 종료 하는 경우에 수행 해야 합니다.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.
  • 최고 및 최악의 테스트할 Dock에 고정 되는 앱 수가 달라 지도록 사례 시나리오입니다.Vary the number of apps that are pinned in the Dock to test both the best and worst case scenarios.

요약Summary

이 문서에서는 향상 된 Apple에는 사용할 수 있는 방법을 watch 앱을 최신 상태로 유지 하 고 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. 먼저 설명 새 모든 백그라운드 작업 Apple이 watchOS 3에에서 추가 합니다.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.