2017-06-08 4 views
9

Situation geklärt, wie es

Proper situationiOS - Heute Erweiterung Widget über die Zeit

sollten wir heute eine Widget haben, die ein Maximum von 6 Tasten auf Daten abhängig zeigt in der entsprechenden App eingestellt. Diese Daten werden mit App-Gruppen geteilt. Wenn mindestens eine Schaltfläche konfiguriert ist, wird sie wie in der Abbildung oben angezeigt. Wenn der Benutzer nicht angemeldet ist oder keine Tasten konfiguriert sind, wird eine Nachricht angezeigt, wie im Bild unten gezeigt.

No buttons configured

Problem

Nach mehreren Stunden (irgendwo zwischen 4 und 7) nicht die Anwendung geöffnet hat, das Widget kehrt zu der Ansicht 'Keine Tasten konfiguriert'.

Analyse bisher

Die Art und Weise die Daten aus dem App-Gruppe geladen ist, wird der Code erfolgt wie unten gezeigt. (gist for full code) In der Art, wie ich es geschrieben hatte, ist die Ansicht "Keine Schaltflächen konfiguriert" nur dann sichtbar, wenn das Array buttons tatsächlich existiert, aber eine Länge von Null hat.

ich erwartet hatte so etwas wie eine Cache-Bereinigung oder Hintergrunddienst Anhalten, aber soweit ich sehen kann, sollten Ausnahmen früher gefangen werden:

  • keine Verbindung zu den App-Gruppendaten vorgenommen werden, könnte Wenn userDefaults sollte null sein, also sollte es die 'Nicht eingeloggte Ansicht' anzeigen.
  • Falls die Tasten nie definiert wurden, buttons sollte Null sein und so wieder soll es die ‚Nicht angemeldet Ansicht‘

Betrachtet man die App tut nichts im Hintergrund zeigen, die App selbst nicht zu ändern könnte die Knöpfe.

Ich habe versucht, dies zu reproduzieren, während der Debugger angeschlossen ist, aber das Problem wird nicht reproduzieren.

Hat jemand überhaupt die geringste Idee, wie Sie dieses Problem beheben können oder wie Sie mit dem Debuggen beginnen?

Relevante Dateien:

Relevante Code:

private struct sharedData { 
     static var baseUrl: String? 
     static var token: String? 
     static var phoneDeviceId: String? 
     static var buttons: Array<Button>? 
    } 

func loadData() { 
     let groupIdentifier = "group." + NSBundle.mainBundle().bundleIdentifier! 
     var groupIdArray = groupIdentifier.componentsSeparatedByString(".") 
     groupIdArray.removeAtIndex(groupIdArray.count - 1) 
     let appGroupIdentifier = groupIdArray.joinWithSeparator("."); 

     let userDefaults = NSUserDefaults.init(suiteName: appGroupIdentifier) 
     if (userDefaults == nil) { 
      print("Error in user defaults") 
      setButtonTitle("Not logged in. Open Triggi to continue.") 
      return false 
     } 
     sharedData.baseUrl = userDefaults?.valueForKey("baseUrl") as? String 
     sharedData.token = userDefaults?.valueForKey("token") as? String 
     sharedData.phoneDeviceId = userDefaults?.valueForKey("phoneDeviceId") as? String 
     let buttons = userDefaults?.valueForKey("buttons") as? NSArray 

     if (sharedData.baseUrl == nil || sharedData.token == nil || sharedData.phoneDeviceId == nil || buttons == nil) { 
      print("Missing data") 
      setButtonTitle("Not logged in. Open Triggi to continue.") 
      return false 
     } 

     if (buttons?.count == 0) { 
      print("No buttons configured") 
      setButtonTitle("No buttons configured. Open Triggi to continue.") 
      return false; 
     } 

    // More things are done with the data here 
} 
+0

Ist dies in Swift 2 ??? – Coder256

+0

Ja, leider aufgrund von Abhängigkeiten von Drittanbieter-Plugins, wir sind immer noch an Swift gebunden 2.3 –

+0

Welche Plugins? Könnten Sie bitte auch die Funktionen 'drawButton' und' colorFromName' angeben? – Coder256

Antwort

1

Today Extension Controller ist ein UIViewController und folgt somit dem gleichen Lebenszyklus wie der eines UIViewController. So wird die Lifecycle-Methode viewDidLoad() jedes Mal aufgerufen, wenn die widget geladen ist.

Auch wird widgetPerformUpdateWithCompletionHandler genannt:

  1. wenn Widget wird im Hintergrund aktualisiert
  2. vor Widget Snapshot
  3. genommen wird

Also, statt nur loadData() in widgetPerformUpdateWithCompletionHandler anrufen, wählen Sie auch aus viewDidLoad().

Außerdem, wo haben Sie den Code zum Hinzufügen/Entfernen UIButtons von Superview geschrieben und "No buttons configured" in Ihrem Code angezeigt?

+0

Ich habe dies sowie eine Reihe von Protokollen für ein umfassenderes Debug hinzugefügt. Ich werde es im Laufe der Zeit mit einer Reihe von Benutzern laufen lassen. Wenn es behoben wird, melde ich mich bei Ihnen! –

Verwandte Themen