Apple Watch Complication не обновляется в фоновом режиме

У меня возникли сложности с Apple Watch, которые правильно инициализируются и показывают ожидаемые данные. Однако, когда NSDate, возвращенный в моем методе getNextRequestedUpdateDateWithHandler, запускает обновление, единственный метод в моем делегате, который вызывается снова, - это метод getNextRequestedUpdateDateWithHandler (я устанавливаю точки останова в каждом методе, чтобы определить это). Я ожидал, что requestUpdateDidBegin будет вызван, когда наступит запрошенная дата обновления, но, похоже, это не так. Кто-нибудь знает, что может быть причиной этого? Вот мой код:

class ComplicationController: NSObject, CLKComplicationDataSource {

/// Provide the time travel directions your complication supports (forward, backward, both, or none).
func getSupportedTimeTravelDirectionsForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimeTravelDirections) -> Void) {
    handler(.Backward)
}

/// Depending on which time travel directions you support, you will be asked for the start/end dates of your timeline (or both, or neither).
/// The start/end dates will determine at what point during time travel we dim out your data to indicate that the timeline does not continue in this direction.
/// Timeline entries after the timeline end date or before the timeline start date will not be displayed.
func getTimelineStartDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) {
    let calendar = NSCalendar.currentCalendar()
    let now = NSDate()
    var startDate: NSDate? = nil
    var interval: NSTimeInterval = 0

    calendar.rangeOfUnit(NSCalendarUnit.WeekOfMonth, startDate: &startDate, interval: &interval, forDate: now)
    handler(startDate)
}

func getTimelineEndDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) {
    handler(NSDate())
}

/// Indicate whether your complication's data should be hidden when the watch is locked.
func getPrivacyBehaviorForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationPrivacyBehavior) -> Void) {
    // Since this is showing health data, we want to secure this when the device is locked.
    handler(.HideOnLockScreen)
}

/// Indicate your complication's animation behavior when transitioning between timeline entries.
func getTimelineAnimationBehaviorForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimelineAnimationBehavior) -> Void) {
    handler(.Always)
}

/// Provide the entry that should currently be displayed.
/// If you pass back nil, we will conclude you have no content loaded and will stop talking to you until you next call -reloadTimelineForComplication:.
func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimelineEntry?) -> Void) {
    // ... custom entry code
    handler(currentTemplate)
}

/// The owning complication will use these methods to extend its timeline backwards or forwards.
/// @param date The date of the first/last entry we already have. Return the batch of entries before/after this date.
/// @param limit Maximum number of entries to return.
func getTimelineEntriesForComplication(complication: CLKComplication, beforeDate date: NSDate, limit: Int, withHandler handler: ([CLKComplicationTimelineEntry]?) -> Void) {

    //... custom entry code
    handler(templates)
}

func getTimelineEntriesForComplication(complication: CLKComplication, afterDate date: NSDate, limit: Int, withHandler handler: ([CLKComplicationTimelineEntry]?) -> Void) {

    handler([CLKComplicationTimelineEntry]())
}

/// Return the date when you would next like to be given the opportunity to update your complication content.
/// We will make an effort to launch you at or around that date, subject to power and budget limitations.
func getNextRequestedUpdateDateWithHandler(handler: (NSDate?) -> Void) {
    // Refresh in 30 minutes
    let refreshDate = NSDate().dateByAddingTimeInterval(60*30)
    handler(refreshDate)
}

/// This method will be called when you are woken due to a requested update. If your complication data has changed you can
/// then call -reloadTimelineForComplication: or -extendTimelineForComplication: to trigger an update.
func requestedUpdateDidBegin() {
    let complicationServer = CLKComplicationServer.sharedInstance()
    for complication in complicationServer.activeComplications {
        complicationServer.reloadTimelineForComplication(complication)
    }
}

/// This method will be called when we would normally wake you for a requested update but you are out of budget. You can can
/// trigger one more update at this point (by calling -reloadTimelineForComplication: or -extendTimelineForComplication:) but
/// this will be the last time you will be woken until your budget is replenished.
func requestedUpdateBudgetExhausted() {
    let complicationServer = CLKComplicationServer.sharedInstance()
    for complication in complicationServer.activeComplications {
        complicationServer.reloadTimelineForComplication(complication)
    }
}

/// When your extension is installed, this method will be called once per supported complication, and the results will be cached.
/// If you pass back nil, we will use the default placeholder template (which is a combination of your icon and app name).
func getPlaceholderTemplateForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTemplate?) -> Void) {
    //... custom template code

    handler(template)
}
}

1 ответ

Решение

endDate это последняя дата, за которую ваш источник данных о сложности готов предоставить данные. Если ваша дата окончания прошла, это подразумевает две вещи:

  • Последняя запись временной шкалы будет затемнена, поскольку достигнут конец временной шкалы.

  • Сервер усложнения поймет, что было бы бессмысленно запрашивать записи после вашей конечной даты, поскольку в будущем записи не могли существовать. В этом случае сервер осложнений будет запрашивать только новую дату обновления, как вы заметили.

Сервер усложнения использует 72-часовое скользящее окно, чтобы обеспечить 24-часовое перемещение во времени в любом направлении.

Даже если вы не поддерживаете путешествия во времени вперед, вы должны обеспечить будущее endDate по нескольким причинам.

  • Если вы никогда не хотите, чтобы ваша текущая запись была затемнена, дата окончания не должна быть достигнута до перезагрузки временной шкалы.

  • Сервер усложнения должен знать, что ваш источник данных может запрашивать дополнительные записи, поскольку ваша временная шкала все еще актуальна.

Каждый раз, когда временная шкала перезагружается, она запрашивает новую дату начала и окончания. Ваша конечная дата никогда не должна быть в далеком будущем, так как в лучшем случае она будет обновляться каждые 30 минут, но это все равно должен быть день в будущем, если ваш ежедневный бюджет исчерпан из-за частых обновлений.

Кроме того, сервер усложнения учитывает даты границ путешествия во времени, чтобы определить, должна ли запись быть добавлена ​​к временной шкале.

earliestTimeTravelDate

При построении вашей временной шкалы не создавайте никаких записей до этой даты. Это пустая трата времени, потому что эти записи никогда не будут отображаться.

Если вы предоставляете записи, относящиеся к началу недели, вы можете не создавать записи за пределами границ путешествия во времени, чтобы не исчерпать свой бюджет.

Другие вопросы по тегам