2017-06-08 5 views
9

situation telle qu'elle devrait être

Proper situationiOS - Extension Aujourd'hui, un widget dégagé au fil du temps

Nous avons un widget qui affiche aujourd'hui un maximum de 6 boutons en fonction des données définies dans l'application correspondante. Ces données sont partagées à l'aide de groupes d'applications. Si au moins un bouton est configuré, il apparaîtra comme indiqué sur l'image ci-dessus. Si l'utilisateur n'est pas connecté ou si aucun bouton n'est configuré, il affichera un message comme indiqué dans l'image ci-dessous.

No buttons configured

Problème

Après plusieurs heures (quelque part entre 4 et 7) de ne pas avoir ouvert l'application, le widget revient au « Pas de boutons configurés » vue.

analyse jusqu'à présent

La façon dont les données sont chargées de l'application-groupe est effectuée en utilisant le code comme indiqué ci-dessous. (gist for full code) De la façon dont je l'avais écrit, la seule façon d'afficher la vue 'Aucun bouton configuré' est si le tableau buttons existe réellement mais a une longueur de zéro.

Je me attendais quelque chose comme une compensation de cache ou d'un arrêt de service d'arrière-plan, mais pour autant que je peux voir, les exceptions doivent être pris plus tôt:

  • Si aucune connexion n'a pu être apportée aux données du groupe d'applications, userDefaults devrait être nul, il devrait donc afficher la vue 'Non connecté'.
  • Dans le cas où les boutons ont jamais été définis, buttons devrait être nul et donc à nouveau, il doit montrer le « Non connecté View »

Compte tenu de l'application ne fait rien en arrière-plan, l'application elle-même ne pouvait pas être en train de changer les boutons.

J'ai essayé de reproduire ceci tout en ayant le débogueur connecté, mais le problème ne se reproduira pas.

Est-ce que quelqu'un a même la moindre idée sur la façon de résoudre ce problème ou comment débuter le débogage?

fichiers pertinents:

Code pertinent:

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

Est-ce dans Swift 2 ??? – Coder256

+0

Oui, malheureusement en raison de dépendances sur les plugins tiers, nous sommes toujours liés à Swift 2.3 –

+0

Quels plugins? Aussi, pourriez-vous s'il vous plaît fournir les fonctions pour 'drawButton' et' colorFromName'? – Coder256

Répondre

1

Today Extension Controller est un UIViewController et suit donc le même cycle de vie que celui d'un UIViewController. Ainsi, la méthode du cycle de vie viewDidLoad() est appelée à chaque fois que le widget est chargé.

En outre, widgetPerformUpdateWithCompletionHandler est appelé:

  1. lorsque widget est mis à jour en arrière-plan
  2. avant snapshot widget est prise

Ainsi, au lieu d'appeler loadData() dans widgetPerformUpdateWithCompletionHandler, appelez aussi de viewDidLoad().

Où avez-vous écrit le code pour ajouter/supprimer UIButtons de superview et afficher "No buttons configured" dans votre code?

+0

J'ai ajouté ceci ainsi qu'un certain nombre de logs pour un débogage plus complet. Je vais le faire fonctionner au fil du temps avec un certain nombre d'utilisateurs. Si ça arrange, je reviendrai à vous! –