ioswatchkitapple-watch-complicationwatchos-2clockkit

Where and When to get data for Watch Complication


After working with complications for a few days, I feel confident saying the following about the update process for updates that happen at a prescribed interval:

Apple's documentation is quite clear that you should not ask for updates too often, or conduct too much processing in the complication code or you will exhaust your time budget and your complication will stop updating. So, my question is: where and when do you do the update?

For context, my scenario is a URL with return data that changes up to two times per hour.

The most obvious place in which to put the URL fetch code is func requestedUpdateDidBegin() Fetch the data, store it, and if there's no change, just return. If there was a change then extend or reload the timeline.

However, a URL fetch can be costly. Alternatives:

Is there anywhere else? Can I have a periodic function in the watch app that isn't part of the complication? Where is the right place to fetch the data for a complication update?


Solution

  • For watchOS 3, Apple recommends that you switch from using the complication datasource getNextRequestedUpdateDate scheduled update to update your complication.

    The old way for watchOS 2

    requestedUpdateDidBegin() is really only designed to update the complication. Keeping your complication (and watch app) up to date usually involves far more than reloading the timeline (and asynchronously retrieving data never fit in well with the old approach).

    The new way for watchOS 3

    The new and better approach is to use background refresh app tasks. You can use a series of background tasks to schedule and handle your app extension being woken in the background to:

    Call each tasks’s setTaskCompleted method as soon as the task is complete.

    Other benefits of using app tasks

    One of the key features about this design is that the watch extension can now handle a variety of foreground and background scenarios which cover:

    Apple recommends that you use each opportunity you are given regardless of whether your app is in the foreground or background to keep your complication, app, and dock snapshot up to date.

    Are there any limitations?

    The number of total available tasks per day is divided among the number of apps in the dock. The fewer apps in the dock, the more tasks your app could utilize. The more apps in the dock, the fewer you can utilize.

    Since your app is now running in the background, you're expected to efficiently and quickly complete your background tasks.

    Background tasks are limited by the amount of CPU time and CPU usage allowed them. If you exceed the CPU time (or use more than 10% of the CPU while in the background), the system will terminate your app (resulting in a crash).

    For more information