Запланированное обновление WatchOS 2 Complication в фоновом режиме

Итак, после ооочень большого количества тестов и онлайн-исследований, я должен сдаться и попросить о помощи. Осложнения WatchOS 2.

Поэтому я пытаюсь создать базовое усложнение, которое показывает время во время обновления.

Я знаю, что обновление в фоновом режиме заложено в бюджет, поэтому я пытаюсь обновлять время каждые 10 минут. Надеюсь, что, поскольку сбор NSDate прост, это не заставит меня выйти за рамки бюджета, что бы это ни значило.

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

func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimelineEntry?) -> Void) {

У меня тогда это:

func getNextRequestedUpdateDateWithHandler(handler: (NSDate?) -> Void){
    handler(NSDate(timeIntervalSinceNow: 60*10));
}

И это:

func requestedUpdateDidBegin(){
    NSLog("requestedUpdateDidBegin")
    let complicationServer = CLKComplicationServer.sharedInstance()
    for complication in complicationServer.activeComplications {
        complicationServer.reloadTimelineForComplication(complication)
    }
}

Однако обновление никогда не происходит. Только запустив расширение и выполнив тот же код, что и 4 строки выше, я могу получить усложнение для обновления. Судя по журналам, все, что происходит после принудительного обновления, это то, что вызывается метод getNextRequestedUpdateDateWithHandler, но больше ничего.

Любые предложения или что-то, что мне явно не хватает? Большое спасибо за чтение.


person Simon    schedule 29.09.2015    source источник
comment
У меня точно такая же проблема. Я пытался использовать NSTimer в качестве альтернативы, но это приводит только к ошибке чтения памяти.   -  person gallileo    schedule 08.10.2015


Ответы (1)


Я думаю, вам нужно реализовать:

func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: ((CLKComplicationTimelineEntry?) -> Void))

Реализованный вами метод getTimelineEntriesForComplication(complication: CLKComplication, beforeDate... вызывается только тогда, когда сервер усложнений собирает записи временной шкалы для путешествия во времени вперед.

Учитывая сценарий, который вы описываете, я настоятельно рекомендую поддерживать путешествие во времени вперед, реализуя:

func getSupportedTimeTravelDirectionsForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimeTravelDirections) -> Void) {
    handler([.Forward])
}

И

func getTimelineEndDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) {
    let date: NSDate = // Your date
    handler(date)
}
person blackp    schedule 05.10.2015
comment
К сожалению, это мне не поможет, потому что данные, которые я хочу собрать, доступны только в настоящее время и в прошлом. нет будущих данных. Планируется использовать аптечку для сбора данных шагомера. - person Simon; 06.10.2015
comment
Что ж, не говоря о том, что ваш вариант использования не поддерживает путешествия во времени вперед, вы пробовали реализовать метод, который я предложил сначала getCurrentTimelineEntryForComplication? - person blackp; 07.10.2015
comment
В исходном вопросе я сказал, что я не путешествую во времени и что я уже пытался реализовать getCurrentTimelineEntryForComplication, getNextRequestedUpdateDateWithHandler и requiredUpdateDidBegin. - person Simon; 08.10.2015
comment
Должно быть, я неправильно понял. Я не вижу в вашем вопросе ссылки на getCurrentTimelineEntryForComplication. Осложнения сработали, как задокументировано для меня, но, не видя вашего источника, я не знаю, что еще предложить. - person blackp; 08.10.2015
comment
Извините, вы правы, ошибся в вопросе, исправил. Как часто вы обнаруживаете, что можете вызвать обновление? Из того, что я читал, 30 минут - это максимум, даже если обновление происходит мгновенно. - person Simon; 08.10.2015
comment
Я не пробовал ничего чаще, чем каждые тридцать минут. Другой вариант — transferCurrentComplicationUserInfo:, но он зависит от того, активно ли ваше телефонное приложение, а также от бюджета. - person blackp; 11.10.2015
comment
Да, к сожалению, поскольку я пытаюсь выполнить запрос на аптечку, я могу запустить ее на iPhone в фоновом режиме :( ну ладно - person Simon; 16.10.2015
comment
* не могу запустить его в фоновом режиме, и я не могу вызвать HKSampleQuery в getCurrentTimelineEntryForComplication или requestUpdateDidBegin - person Simon; 19.10.2015