2015-10-24 1 views
1

mon but est de mettre à jour une complication kit d'horloge par les étapes suivantes:réveil parent application IOS par sendMessage ne fonctionne pas

  1. complication déclenche ExtensionDelegate à sendMessage AppDelegate afin de se réveiller l'application IOS parent

  2. app iOS alors télécharger/données parse XML

  3. AppDelegate transfère les données via transferCurrentComplicationUserInfo à ExtensionDelegate

  4. ExtensionDelegate passe à Complication contrôleur

Tout cela fonctionne lorsque l'application iOS est en cours d'exécution/actif au premier plan. Cela ne fonctionne pas lorsque l'application n'est pas démarrée.

Y a-t-il un paramètre à définir? (déjà installé dans info.plist pour le téléchargement d'arrière-plan) S'il vous plaît dans Swift.

informations complémentaires Ajouté:

Dans le scénario ci-dessus (ComplicationControllor demande régulière/mise à jour prévue par ExtensionDelegate), réveillant l'application IOS via WCSession sendMessage ne fonctionne pas.

Je vois le même problème lorsque je démarre l'application sur Apple Watch (InterfaceController se déclenche dans ViewDidLoad le ExtensionDelegate) pour réveiller l'application parente. Dans les deux cas, le message est en cours d'envoi, mais aucune réaction de l'application IOS n'est affichée au premier plan. Dans les deux cas, le message est envoyé.

Avec le même code qu'au-dessus des scénarios de requêtes "automatisés", j'ai également implémenté un bouton (pour déclencher manuellement à des fins de test). Si le bouton est appuyé sur la montre, cela fonctionne parfois (ViewController par la même fonction dans ExtensionDelegate envoie un message à AppDelegate, celui-ci se réveille et répond). Je suis incapable de trouver un motif. Comme il utilise la même fonction ExtenstionDelegate, comme dans tous les scénarios, le message est envoyé, il est au-delà de ma compréhension pourquoi seulement lorsque déclenchée manuellement une réponse est reçue/réveil de l'application parente est réussie.

ici le code de l'ExtensionDelegate (qui est appelé par ComplicationController, InterfaceController-viewDidLoad ainsi que par le bouton mentionné:

func sendMessage(){ 
      let session = WCSession.defaultSession() 
      let applicationData = ["wake":"wakeUp"] 
      session.sendMessage(applicationData, replyHandler: {replyMessage in 
       }, errorHandler: {(error) -> Void in 
        print("no reply message from phone") 
      }) 
     } 

et AppDelegate:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { 
    let receivedMessage = message["wake"] as! String 
    if receivedMessage == "wakeUp" { 
     let applicationDict = ["wake": "nowAwake"] 
     replyHandler(applicationDict as [String : String]) 
    } 
    self.loadData() 
} 

func loadData(){ 

    ... code to load data 

    dispatch_async(dispatch_get_main_queue()) {() -> Void in 
     let dictionaryComplication = [...] 

     if WCSession.isSupported() { 

      let session = WCSession.defaultSession() 
      if session.watchAppInstalled { 
       do { 
        session.transferCurrentComplicationUserInfo(dictionaryComplication) 
        try session.updateApplicationContext(dictionaryContext) 


       } catch { 
        print("ERROR: \(error)") 
       } 
      } 

     } 
    } 
} 

Répondre

0

Assurez-vous activer le WCSession dans la méthode init de votre ExtensionDelegate et non dans applicationDidFinishLaunching:

class ExtensionDelegate: NSObject, WKExtensionDelegate { 

    override init() { 
     super.init() 
     if WCSession.isSupported() { 
      let session = WCSession.defaultSession() 
      session.delegate = self 
      session.activateSession() 
     } 
    } 
    ... 
} 

applicationDidFinishLaunching est appelée uniquement lorsque l'utilisateur démarre WatchApp, mais pas lorsqu'une complication demande de nouvelles données.

+1

merci pour votre réponse. Je lance déjà WCSession dans la fonction init (à la fois dans AppDelegate et ExtensionDelegate).Malheureusement, cela ne réveille pas l'application parent IOS lorsque l'appel provient de la complication (ajoutera plus de détails à la question). Merci pour votre réponse !! – TPeter

+0

Pourriez-vous s'il vous plaît ajouter les parties pertinentes de votre code à votre réponse? Sinon, c'est un peu difficile de trouver le problème. – joern