배경에서 Xamarin.ios 앱 업데이트Updating a Xamarin.iOS App in the Background

백그라운드 새로 고침은 일시 중단 되었거나 실행 되지 않는 응용 프로그램의 절전 모드를 해제 하 고 새 콘텐츠를 사용 하 여 업데이트 하는 프로세스입니다.Background refresh is the process of waking an application that is suspended or not running, and updating it with new content. iOS는 배경에서 콘텐츠를 새로 고치는 세 가지 옵션을 제공 합니다.iOS provides three options for refreshing content in the background:

  1. 지역 모니터링중요 한 위치 변경 서비스 -위치 인식 api는 사용자 위치의 변경 내용을 기반으로 백그라운드 업데이트를 트리거합니다.Region Monitoring and Significant Location Changes Service - Location-aware APIs trigger background updates based on changes in the user's location. 이러한 Api는 다른 옵션을 사용할 수 없는 위치 기반이 아닌 iOS 6 응용 프로그램에서 콘텐츠를 새로 고치는 데 신중 하 게 사용할 수 있습니다.These APIs can be used with discretion to refresh content in non-location-based iOS 6 applications, where other options are not available.
  2. 백그라운드 페치 (iOS 7 이상) - 자주 업데이트 되는 중요 하지 않은 콘텐츠를 새로 고치는 임시 방법입니다.Background Fetch (iOS 7+) - A temporal approach to refreshing non-critical content that updates frequently .
  3. 원격 알림 (iOS 7 이상) -푸시 알림을 받는 응용 프로그램은 알림을 사용 하 여 백그라운드 콘텐츠 새로 고침을 트리거할 수 있습니다.Remote Notifications (iOS 7+) - Applications that receive push notifications can use the notifications to trigger background content refreshes. 이 메서드를 사용 하 여 산발적 으로 업데이트 되는 중요 하 고 시간이 중요 한 콘텐츠를 업데이트할 수 있습니다.This method can be used to update with important, time-sensitive content that updates sporadically .

다음 섹션에서는 이러한 옵션의 기본 사항을 다룹니다.The following sections cover the basics of these options.

영역 모니터링 및 중요 한 위치 변경Region Monitoring and Significant Location Changes

iOS는 backgrounding 기능을 제공 하는 두 개의 위치 인식 Api를 제공 합니다.iOS provides two location-aware APIs with backgrounding capabilities:

  1. 지역 모니터링 은 경계를 사용 하 여 영역을 설정 하 고 사용자가 지역을 들어가거나 지역을 종료할 때 장치를 절전 모드에서 해제 하는 프로세스입니다.Region Monitoring is the process of setting up regions with boundaries, and waking the device when the user enters or exits a region. 지역은 원형 이며 다양 한 크기를 가질 수 있습니다.Regions are circular and can be of varying size. 사용자가 지역 경계를 교차할 때 장치는 일반적으로 알림을 발생 하거나 작업을 시작 하 여 이벤트를 처리 하기 위해 절전 모드를 해제 합니다.When the user crosses a region boundary, the device will wake up to handle the event, usually by firing a notification or kicking off a task. 영역 모니터링에는 GPS가 필요 하며 배터리 및 데이터 사용량이 늘어납니다.Region Monitoring requires GPS, and increases battery and data usage.
  2. 중요 한 위치 변경 서비스 는 셀룰러 라디오를 사용 하는 장치에 사용할 수 있는 보다 간단한 전원 절약 옵션입니다.The Significant Location Changes Service is a simpler, power-conserving option available for devices with cellular radios. 장치가 셀 타워로 전환 되 면 중요 한 위치 변경을 수신 대기 하는 응용 프로그램에 알림이 표시 됩니다.An application listening for significant location changes will be notified when the device switches cell towers. 이 서비스는 일시 중단 또는 종료 된 응용 프로그램의 절전 모드를 해제 하는 데 사용할 수 있으며 백그라운드에서 새 콘텐츠를 확인할 수 있는 기회를 제공 합니다.This service can be used to wake a suspended or terminated application, and provides an opportunity to check for new content in the background. 백그라운드 작업 을 사용 하는 경우를 제외 하 고 백그라운드 작업은 약 10 초로 제한 됩니다.Background activity is limited to about 10 seconds, unless paired with a Background Task .

응용 프로그램에는 이러한 위치 인식 Api를 사용 하 UIBackgroundMode 위치가 필요 하지 않습니다.An application does not need the location UIBackgroundMode to use these location-aware APIs. IOS는 사용자 위치의 변경으로 장치를 해제 때 실행할 수 있는 작업 유형을 추적 하지 않으므로 iOS 6의 백그라운드에서 콘텐츠를 업데이트 하는 데 대 한 해결 방법을 제공 합니다.Because iOS doesn't track the types of tasks that can run when the device is woken by changes in the user's location, these APIs provide a work-around for updating content in the background on iOS 6. 위치 기반 api를 사용 하 여 백그라운드 업데이트를 트리거하는 것은 장치 리소스에 표시 되며, 응용 프로그램에서 해당 위치에 액세스 해야 하는 이유를 모르는 사용자를 혼동할 수 있습니다.Keep in mind that triggering background updates with location-based APIs will draw on device resources, and may confuse users who don't understand why an application requires access to their location. 위치 Api를 아직 사용 하지 않는 응용 프로그램에서 백그라운드 처리에 대 한 지역 모니터링 또는 중요 한 위치 변경 사항을 구현할 때는 신중 하 게 사용 합니다.Use discretion when implementing Region Monitoring or Significant Location Changes for background processing in applications that aren't already using the location APIs.

백그라운드 처리에 대 한 위치 모니터링을 사용 하는 앱은 iOS 6의 결함을 노출 합니다. 응용 프로그램의 요구 사항이 백그라운드에 필요한 범주에 맞지 않는 경우 backgrounding 옵션은 제한적입니다.Apps using location monitoring for background processing expose a flaw in iOS 6: if an application's needs don't fit into a background-necessary category, it has limited backgrounding options. 두 개의 새로운 Api 인 백그라운드 페치원격 알림과iOS 7 (이상)이 도입 되면서 더 많은 응용 프로그램에 backgrounding 기회를 제공 합니다.With the introduction of two new APIs, Background Fetch and Remote Notifications, iOS 7 (and greater) provides backgrounding opportunities to more applications. 다음 두 섹션에서는 이러한 새 Api를 소개 합니다.The next two sections introduce these new APIs.

백그라운드 인출 (iOS 7 이상)Background Fetch (iOS 7 and Greater)

IOS 6에서 새로운 콘텐츠를 로드 하는 데 필요한 포그라운드를 입력 하는 응용 프로그램은 사용자가 이미 알고 있는 콘텐츠를 간단 하 게 표시 합니다.In iOS 6, an application entering the foreground needed time to load new content, briefly presenting users with content they've already seen. 백그라운드 페치를 사용 하면 사용자가 응용 프로그램을 시작 하기 전에 응용 프로그램에서 새 데이터를 로드 하 고 최신 콘텐츠를 사용자에 게 제공할 수 있습니다.Background fetch allows applications to load new data before a user launches the application, and provide the user with the most up-to-date content.

백그라운드 페치를 구현 하려면 info.plist 를 편집 하 고 백그라운드 모드백그라운드 페치 사용 확인란을 선택 합니다.To implement background fetch, edit Info.plist and check the Enable Background Modes and Background Fetch check boxes:

그런 다음 AppDelegate에서 FinishedLaunching 메서드를 재정의 하 여 최소 인출 간격을 설정 합니다.Next, in the AppDelegate, override the FinishedLaunching method to set the minimum fetch interval. 이 예제에서는 OS가 새 콘텐츠를 가져오는 빈도를 결정 합니다.In this example, we let the OS decide how often to fetch new content:

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
  UIApplication.SharedApplication.SetMinimumBackgroundFetchInterval (UIApplication.BackgroundFetchIntervalMinimum);
  return true;
}

마지막으로 AppDelegate에서 PerformFetch 메서드를 재정의 하 고 완료 처리기를 전달 하 여 페치를 수행 합니다.Finally, perform the fetch by overriding the PerformFetch method in the AppDelegate, and passing in a completion handler. 완료 처리기는 UIBackgroundFetchResult를 사용 하는 대리자입니다.The completion handler is a delegate that takes a UIBackgroundFetchResult:

public override void PerformFetch (UIApplication application, Action<UIBackgroundFetchResult> completionHandler)
{
  // Check for new data, and display it
  ...
  
  // Inform system of fetch results
  completionHandler (UIBackgroundFetchResult.NewData);
}

콘텐츠 업데이트가 완료 되 면 적절 한 상태를 사용 하 여 완료 처리기를 호출 하 여 OS를 알 수 있습니다.When we're done updating content, we let the OS know by calling the completion handler with the appropriate status. iOS는 완료 처리기 상태를 위한 세 가지 옵션을 제공 합니다.iOS offers three options for completion handler status:

  1. UIBackgroundFetchResult.NewData-새 콘텐츠를 인출 하 고 응용 프로그램이 업데이트 된 경우에 호출 됩니다.UIBackgroundFetchResult.NewData - Called when new content has been fetched, and the application has been updated.
  2. UIBackgroundFetchResult.NoData-새 콘텐츠에 대 한 페치를 통과 했지만 사용 가능한 콘텐츠가 없는 경우 호출 됩니다.UIBackgroundFetchResult.NoData - Called when the fetch for new content went through, but no content is available.
  3. UIBackgroundFetchResult.Failed-오류 처리에 유용 합니다 .이는 반입이 통과할 수 없을 때 호출 됩니다.UIBackgroundFetchResult.Failed - Useful for error handling, this is called when the fetch was unable to go through.

백그라운드 페치를 사용 하는 응용 프로그램은를 호출 하 여 백그라운드에서 UI를 업데이트할 수 있습니다.Applications using Background Fetch can make calls to update the UI from the background. 사용자가 앱을 열면 UI가 최신 상태가 되 고 새 콘텐츠가 표시 됩니다.When the user opens the app, the UI will be up to date and displaying new content. 응용 프로그램의 응용 프로그램에 새 콘텐츠가 있는 경우 사용자가 볼 수 있도록 응용 프로그램의 앱 전환기 스냅숏이 업데이트 됩니다.This will also update the application's App Switcher snapshot, so the user can see when the application has new content.

중요

PerformFetch가 호출 되 면 응용 프로그램은 약 30 초 동안 새 콘텐츠 다운로드를 시작 하 고 완료 처리기 블록을 호출 합니다.Once PerformFetch is called, the application has approximately 30 seconds to kick off download of new content, and call the completion handler block. 시간이 너무 오래 걸리면 앱이 종료 됩니다.If this takes too long, the app will be terminated. 미디어 나 기타 많은 파일을 다운로드 하는 경우 백그라운드 전송 서비스 에서 백그라운드 페치를 사용 하는 것이 좋습니다.Consider using Background Fetch with the Background Transfer Service when downloading media or other large files.

BackgroundFetchIntervalBackgroundFetchInterval

위의 샘플 코드에서 OS는 최소 인출 간격을 BackgroundFetchIntervalMinimum으로 설정 하 여 새 콘텐츠를 가져오는 빈도를 결정할 수 있습니다.In the sample code above, we let the OS decide how often to fetch new content by setting the minimum fetch interval to BackgroundFetchIntervalMinimum. iOS는 fetch 간격에 대 한 세 가지 옵션을 제공 합니다.iOS offers three options for the fetch interval:

  1. BackgroundFetchIntervalNever-새 콘텐츠를 가져오지 않도록 시스템에 지시 합니다.BackgroundFetchIntervalNever - Tell the system to never fetch new content. 사용자가 로그인 하지 않은 경우와 같은 특정 상황에서 페치를 해제 하려면이 옵션을 사용 합니다.Use this to turn off fetching in certain situations, such as when the user is not signed in. 이 값은 인출 간격의 기본값입니다.This is the default value for the fetch interval.
  2. BackgroundFetchIntervalMinimum-시스템에서 사용자 패턴, 배터리 수명, 데이터 사용량 및 다른 응용 프로그램의 요구 사항에 따라 페치할 빈도를 결정할 수 있습니다.BackgroundFetchIntervalMinimum - Let the system decide how often to fetch based on user patterns, battery life, data usage, and the needs of other applications.
  3. BackgroundFetchIntervalCustom-응용 프로그램의 콘텐츠를 업데이트 하는 빈도를 알고 있는 경우 반입할 때마다 "절전" 간격을 지정할 수 있습니다 .이 기간 동안에는 응용 프로그램에서 새 콘텐츠를 가져올 수 없습니다.BackgroundFetchIntervalCustom - If you know how often an application's content gets updated, you can specify a "sleep" interval after every fetch, during which the application will be prevented from fetching new content. 해당 간격이 경과 되 면 시스템은 콘텐츠를 가져올 시기를 결정 합니다.Once that interval is up, the system will determine when to fetch content.

BackgroundFetchIntervalMinimumBackgroundFetchIntervalCustom는 모두 시스템을 사용 하 여 페치를 예약 합니다.Both BackgroundFetchIntervalMinimum and BackgroundFetchIntervalCustom rely on the system to schedule fetches. 이 간격은 개별 사용자의 습관 뿐만 아니라 장치의 요구에 맞게 동적으로 조정 됩니다.This interval is dynamic, adapting to the device's needs as well as the individual user's habits. 예를 들어 한 사용자가 매일 아침에 응용 프로그램을 확인 하 고 다른 사용자가 매시간 확인 하는 경우 iOS는 응용 프로그램을 열 때마다 두 사용자 모두에 대해 콘텐츠가 최신 상태로 유지 되도록 합니다.For example, if one user checks an application every morning, and another checks every hour, iOS will ensure the content is up to date for both users every time they open the application.

중요 하지 않은 콘텐츠를 자주 업데이트 하는 응용 프로그램에는 백그라운드 페치를 사용 해야 합니다.Background Fetch should be used for applications that update frequently with non-critical content. 중요 업데이트를 사용 하는 응용 프로그램의 경우 원격 알림을 사용 해야 합니다.For applications with critical updates, Remote Notifications should be used. 원격 알림은 백그라운드 페치를 기반으로 하며 동일한 완료 처리기를 공유 합니다.Remote Notifications are based on Background Fetch, and share the same completion handler. 다음으로 원격 알림을 살펴보겠습니다.We'll dive into Remote Notifications next.

원격 알림 (iOS 7 이상)Remote Notifications (iOS 7 and Greater)

푸시 알림은 APNs (Apple Push Notification service) 를 통해 공급자 로부터 장치로 전송 되는 JSON 메시지입니다.Push notifications are JSON messages sent from a provider to a device by way of the Apple Push Notification service (APNs).

IOS 6에서 들어오는 푸시 알림은 응용 프로그램에서 흥미로운 작업을 사용자에 게 알리는 경고를 시스템에 알려 줍니다.In iOS 6, an incoming push notifications tells the system to alert the user that something interesting has happened in an application. 알림을 클릭 하면 응용 프로그램이 일시 중단 또는 종료 된 상태에서 끌어오고 앱이 콘텐츠 업데이트를 시작 합니다.Clicking on the notification pulls the application out of the suspended or terminated state, and the app would begin updating content. iOS 7 (이상)은 사용자에 게 알리기 전에 응용 프로그램에 백그라운드에서 콘텐츠를 업데이트할 수 있는 기회를 제공 하 여 사용자가 응용 프로그램을 열고 새 콘텐츠를 즉시 제공할 수 있도록 하 여 일반 푸시 알림을 확장 합니다.iOS 7 (and greater) extends ordinary push notifications by giving applications a chance to update content in the background before notifying the user, so that the user can open the application and be presented with new content immediately.

원격 알림을 구현 하려면 info.plist 를 편집 하 고 백그라운드 모드원격 알림 사용 확인란을 선택 합니다.To implement remote notifications, edit Info.plist and check the Enable Background Modes and Remote notifications check boxes:

다음으로 푸시 알림에 대 한 content-available 플래그를 1로 설정 합니다.Next, set the content-available flag on the push notification itself to 1. 이렇게 하면 경고를 표시 하기 전에 응용 프로그램이 새 콘텐츠를 인출 하는 것을 알 수 있습니다.This lets the application know to fetch new content before displaying the alert:

'aps' {
  'content-available': 1,
  'alert': 'Something new has happened in your app!''
}

AppDelegate에서 DidReceiveRemoteNotification 메서드를 재정의 하 여 사용 가능한 콘텐츠의 알림 페이로드를 확인 하 고 적절 한 완료 처리기 블록을 호출 합니다.In the AppDelegate, override the DidReceiveRemoteNotification method to check the notification payload for available content, and call the appropriate completion handler block:

public override void DidReceiveRemoteNotification (UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
  if([content-available]) {
    // fetch content
    completionHandler (UIBackgroundFetchResult.NewData);
  }
}

응용 프로그램의 기능에 중요 한 콘텐츠를 사용 하는 경우에는 자주 발생 하지 않는 업데이트에 원격 알림을 사용 해야 합니다.Remote notifications should be used for infrequent updates with content that is crucial to the application's functionality. 원격 알림에 대 한 자세한 내용은 iOS의 Xamarin 푸시 알림 가이드를 참조 하세요.For more information on remote notifications, see the Xamarin Push Notifications in iOS guide.

중요

원격 알림의 업데이트 메커니즘은 백그라운드 페치를 기반으로 하기 때문에 응용 프로그램에서 새 콘텐츠 다운로드를 시작 하 고, 알림을 받은 30 초 이내에 완료 처리기 블록을 호출 해야 합니다. 그렇지 않으면 iOS에서 응용 프로그램이 종료 됩니다.Because the update mechanism in Remote Notifications is based on Background Fetch, the application must kick off download of new content and call the completion handler block within 30 seconds of receiving the notification, or iOS will terminate the application. 백그라운드에서 미디어 또는 기타 많은 파일을 다운로드 하는 경우 백그라운드 전송 서비스 와 원격 알림을 연결 하는 것이 좋습니다.Consider pairing Remote Notifications with Background Transfer Service when downloading media or other large files in the background.

자동 원격 알림Silent Remote Notifications

원격 알림은 응용 프로그램에 업데이트를 알리는 간단한 방법 이며, 새 콘텐츠를 인출 하는 것은 아니지만 사용자에 게 변경 내용이 있음을 알릴 필요가 없는 경우가 있습니다.Remote Notifications are a simple way to notify applications of updates and kick off fetching new content, but there are cases where we don't need to notify the user that something has changed. 예를 들어 사용자가 동기화를 위해 파일에 플래그를 표시 하는 경우 파일이 업데이트 될 때마다 알림을 받을 필요가 없습니다.For example, if a user flags a file for synching, we don't need to notify them every time the file updates. 파일 동기화는 놀라운 이벤트가 아니며 사용자의 즉각적인 주의가 필요 하지 않습니다.File synching is not a surprising event, nor does it require the user's immediate attention. 사용자는 파일을 열 때 파일을 최신 상태로 유지 하는 것으로 간주 합니다.Users just expect the file to be up-to-date when they open it.

위의 경우와 같은 경우에는 iOS에서 푸시 알림을 자동으로 전송할 수 있습니다. 즉, 경고가 발생 하지 않습니다.For cases like the one above, iOS allows push notifications to be sent silently - that is, without an alert. 정기 알림을 자동으로 전환 하려면 알림 페이로드에서 경고를 제거 하면 됩니다.To turn a regular notification into a silent one, simply remove the alert from the notification payload:

'aps' {
  'content-available': 1
}

속도 제한Rate Limits

개발자 관점에서 일반적인 알림과 자동 알림의 가장 큰 차이점은 자동 푸시의 비율이 제한 된다는 것입니다.The biggest difference between normal and silent notifications from a developer perspective is that silent pushes are rate limited. APNs는 푸시 비율이 너무 높으면 장치에 자동 푸시 배달이 지연 됩니다.APNs will delay the delivery of silent pushes to the device if the push rate gets too high. 이는 응용 프로그램이 자동 알림이 너무 많은 장치 리소스를 소모 하지 않도록 하기 위한 것입니다.This is to ensure that applications don't drain device resources with too many silent notifications.

그러나 APNs는 정상적인 원격 알림 또는 연결 유지 응답과 함께 자동 알림을 "긍정" 할 수 있습니다.However, APNs will let silent notifications "piggyback" alongside a normal Remote Notification or keep-alive response. 정기 알림은 속도 제한 되지 않으므로 다음 다이어그램과 같이 APNs에서 장치에 저장 된 자동 알림을 푸시하는 데 사용할 수 있습니다.Because regular notifications are not rate limited, they can be used to push stored up silent notifications from the APNs to the device, as illustrated by the following diagram:

중요

Apple에서는 개발자가 응용 프로그램에 필요할 때마다 자동 푸시 알림을 보내고 APNs에서 배달을 예약할 수 있습니다.Apple encourages developers to send silent push notifications whenever the application requires, and let the APNs schedule their delivery.

이 섹션에서는 백그라운드에서 필요한 범주에 맞지 않는 작업을 실행 하기 위해 백그라운드에서 콘텐츠를 새로 고치는 다양 한 옵션을 설명 했습니다.In this section, we've covered the various options for refreshing content in the background to run tasks that don't fit into a background-necessary category. 이제 이러한 Api 중 일부를 수행 하는 것을 살펴보겠습니다.Now, let's see some of these APIs in action.

다음: 4 부-iOS Backgrounding 연습Next: Part 4 - iOS Backgrounding Walkthroughs