Was ist der Ablauf für die Aktualisierung von Komplikationsdaten für die Apple Watch?

Ich habe viele Tutorials im Internet verfolgt, um zu lernen, wie man die Komplikation einrichtet. Ich habe kein Problem damit, die Komplikation wie erwartet einzurichten.

Bis die ersten Zeitleisteneinträge verfallen. Nach 12 Stunden weiß ich nicht, wie ich es aktualisieren soll, um die Komplikation am Leben zu erhalten. Ich werde alles teilen, was ich unten habe, und hoffentlich kann mir jemand helfen, es mir zu sagen.

Hier erstelle ich die Variablen für meine Daten, die ich auf der Komplikation anzeigen möchte.

struct data = {
var name: String
var startString: String
var startDate: NSDate
}

Das folgende Array ist ein Container für diese Daten.

var dataArray = [data]

Dadurch kann die Komplikation angezeigt werden, wenn die Uhr gesperrt ist.

func getPrivacyBehaviorForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationPrivacyBehavior) -> Void) {
    handler(.ShowOnLockScreen)
}

Dies ermöglicht die Weiterleitung von Zeitreisen bei Komplikationen.

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

Hier stelle ich die Startzeit der Timeline gleich jetzt ein.

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

Hier habe ich die Endzeit der Timeline auf 12 Stunden eingestellt.

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

Hier erstelle ich die Vorlage der Komplikation. Dies dient zum Anzeigen von Beispieldaten für Benutzer, wenn sie meine Komplikationen sehen, während sie alle Komplikationen auf ihrer Uhr durchsuchen.

func getPlaceholderTemplateForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTemplate?) -> Void) {

    let headerTextProvider = CLKSimpleTextProvider(text: "Some Data")
    let body1TextProvider = CLKSimpleTextProvider(text: "Some Data Time")
    let template = CLKComplicationTemplateModularLargeStandardBody()
    template.headerTextProvider = headerTextProvider
    template.body1TextProvider = body1TextProvider

    handler(template)
}

Dies erstellt den allerersten Zeitleisteneintrag für die Komplikation. Sobald die Komplikation aktiviert ist, wird dieser Code ausgeführt und die Komplikation sofort entsprechend ausgefüllt.

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

    createData()

    if complication.family == .ModularLarge {

        if dataArray.count != 0 {

            let firstData = dataArray[0]
            let headerTextProvider = CLKSimpleTextProvider(text: firstData.name)
            let body1TextProvider = CLKSimpleTextProvider(text: firstData.startString)
            let template = CLKComplicationTemplateModularLargeStandardBody()
            template.headerTextProvider = headerTextProvider
            template.body1TextProvider = body1TextProvider
            let timelineEntry = CLKComplicationTimelineEntry(date: NSDate(), complicationTemplate: template)
            handler(timelineEntry)
        } else {
            let headerTextProvider = CLKSimpleTextProvider(text: "No Data")
            let body1TextProvider = CLKSimpleTextProvider(text: "Create some data")
            let template = CLKComplicationTemplateModularLargeStandardBody()
            template.headerTextProvider = headerTextProvider
            template.body1TextProvider = body1TextProvider

            let timelineEntry = CLKComplicationTimelineEntry(date: NSDate(), complicationTemplate: template)
            handler(timelineEntry)
        }

    } else {
        handler(nil)
    }

}

Hier erstelle ich Zeitleisteneinträge für alle Daten, über die ich derzeit verfüge.

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

    createData()

    var entries = [CLKComplicationTimelineEntry]()

    for dataObject in dataArray {

        if entries.count < limit && data.startDate.timeIntervalSinceDate(date) > 0 {

            let headerTextProvider = CLKSimpleTextProvider(text: dataObject.name)
            let body1TextProvider = CLKSimpleTextProvider(text: dataObject.startString)
            let template = CLKComplicationTemplateModularLargeStandardBody()
            template.headerTextProvider = headerTextProvider
            template.body1TextProvider = body1TextProvider
            let timelineEntry = CLKComplicationTimelineEntry(date: NSDate(timeInterval: (-10*60), sinceDate: data.startDate), complicationTemplate: template)
            entries.append(timelineEntry)

        }

    }

    handler(entries)

}

Dies teilt der Uhr mit, wann die Komplikationsdaten aktualisiert werden sollen.

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

Dies ist, wo ich auf Probleme stoße.

Wie erstelle ich meine neuen Daten und lade die Timeline neu? Wie ist der Fluss? Ich versuche nicht, die Timeline zu verlängern, sondern sie komplett zu ersetzen. Ich bin völlig ratlos. Apples Dokumente sind ziemlich vage, wenn es um diesen Punkt geht. Ich weiß, dass ich die folgenden Methoden implementieren muss, aber ich weiß nicht wie. Kann mir jemand helfen, diesen Code auszufüllen?

func requestedUpdateDidBegin() {
    createData() //I assume createData() goes here? If so, how do I populate the new timeline entries based on the results?
}

func requestedUpdateBudgetExhausted() {
    //This can't possibly be the case as I haven't gotten it to work once.
}

func reloadTimelineForComplication(complication: CLKComplication!) {
      //This method appears to do nothing.
}

Aktualisieren

Danke an El Tea, ich habe es zum Laufen gebracht. Ich muss requestedUpdateDidBegin eine Instanz von CLKComplicationServer hinzufügen und die reloadTimeline-Methode einfügen.

Hier ist der aktualisierte Code:

func requestedUpdateDidBegin() {
    print("Complication update is starting")

    createData()

    let server=CLKComplicationServer.sharedInstance()

    for comp in (server.activeComplications) {
        server.reloadTimelineForComplication(comp)
        print("Timeline has been reloaded!")
    }

}

func requestedUpdateBudgetExhausted() {
    print("Budget exhausted")
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage