Не удается обновить усложнение Apple Watch в WatchOS 3

Я не могу обновить/обновить Apple Watch Complication в WatchOS 3. Я использую следующий код в своем файле ComplicationController.swift.

func getSupportedTimeTravelDirections(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimeTravelDirections) -> Void) {
    handler([.forward])
}

func getTimelineStartDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) {
    handler(Date())
}

func getTimelineEndDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) {
    handler(Date(timeIntervalSinceNow: 60 * 30))
}

Я также пытался запланировать обновление с помощью метода обработки фоновой задачи в ExtensionDelegate.swift, но, похоже, это тоже не сработало.

func scheduleNextRefresh() {
    let fireDate = Date(timeIntervalSinceNow: 30 * 60)
    let userInfo = ["lastActiveDate" : Date(),
                    "reason" : "updateWeekNumber"] as Dictionary

    WKExtension.shared().scheduleBackgroundRefresh(withPreferredDate: fireDate, userInfo: userInfo as NSSecureCoding) { (error) in
        if error == nil {
            print("Succesfully updated week number")
        }
    }
}

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
    for task: WKRefreshBackgroundTask in backgroundTasks {
        if WKExtension.shared().applicationState == .background {
            if task is WKApplicationRefreshBackgroundTask {
                print("Task received")
                scheduleNextRefresh()
            }
        }
        task.setTaskCompleted()
    }
}

person user8175227    schedule 19.06.2017    source источник


Ответы (1)


WKRefreshBackgroundTask сам по себе ничего не обновляет, он просто позволяет вашему приложению перейти в активное состояние и запустить код (размещенный где-то в строке print("Task received")), который обновит ваше усложнение. Помните, что количество WKRefreshBackgroundTasks ограничено.

Усложнение можно обновить таким образом:

let server = CLKComplicationServer.sharedInstance()

// if you want to add new entries to the end of timeline
server.activeComplications?.forEach(server.extendTimeline)

// if you want to reload all the timeline, which according to snippets looks like your case
server.activeComplications?.forEach(server.reloadTimeline)

Это заставит систему вызывать getCurrentTimelineEntry(for:withHandler:) методы вашего CLKComplicationDataSource, где вы сможете подготовить и вернуть обновленные записи.

Подробнее об обновлении осложнений в документации. Подробнее о фоновых задачах на сеансе WWDC16.

person abjurato    schedule 26.06.2017
comment
Спасибо! Где лучше всего вызывать метод scheduleNextRefresh()? Я сделал это в контроллере интерфейса для приложения часов в бодрствующем методе. - person user8175227; 27.06.2017
comment
как правило, вы хотите обновлять сложность при поступлении новых данных, поэтому это место является хорошим кандидатом для вызова фоновой задачи расписания. Но обратите внимание, что обработчик завершения scheduleBackgroundRefresh вызывается, когда фоновое обновление запланировано, а не выполняется, документация по адресу developer.apple.com/documentation/watchkit/wkextension/ имеет ошибку. См. здесь: stackoverflow .com/questions/41238434/ - person abjurato; 27.06.2017
comment
У меня это не работает - ничего не меняется и getCurrentTimelineEntry(for:withHandler:) не вызывается - person Mofawaw; 21.09.2020