locked
WinJS.xhr ne fonctionne pas dans tâche en arrière-plan RRS feed

  • Question

  • Bonjour à tous,

    J'ai un problème dans ma tâche en arrière-plan. Voici le code :

    (function () {
        "use strict";
        self.importScripts("//Microsoft.WinJS.2.0/js/base.js");
        self.importScripts("default.js");
    
        // A JavaScript background task is specified in a .js file. The name of the file is used to launch the background task.
        var cancel = false;
    
        // This var is used to get information about the current instance of the background task.
        var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current;
    
        // Associate a cancellation handler with the background task.
        function onCanceled(cancelSender, cancelReason) {
            cancel = true;
        }
        backgroundTaskInstance.addEventListener("canceled", onCanceled);
        
        // This function will do the work of your background task.
        function doWork() {
            var key = null,
            settings = Windows.Storage.ApplicationData.current.localSettings;
            // Write your JavaScript code here to do work in the background.
            // If you write a loop or callback, remember  have it check for canceled==false.
            notification("test", "", "", "", "test");
            // Vérification des mails
            WinJS.xhr({ url: 'monurl', responseType: 'text' }).then(
                function complete(resultat) {
                    notification("fait", "", "", "", "fait");
                    testermails(resultat);
                    // Record information in LocalSettings to communicate with the app.
                    key = backgroundTaskInstance.task.taskId.toString();
                    settings.values[key] = "Succeeded";
                },
                function error(erreur) {
                    notification("erreur", erreur, "", "", "test3");
                    console.log(erreur);
                }
            ).done(
                function () {
                    close();
                }
            );
        }
    
        if (!cancel) {
            doWork();
        } else {
            // Record information in LocalSettings to communicate with the app.
            key = backgroundTaskInstance.task.taskId.toString();
            settings.values[key] = "Canceled";
            close();
        }
    
    })();

    Les fonctions notification et testermails sont définies dans default.js.

    Ma notification "test" fonctionne, toutes les 15 minutes (j'ai enregistré ma tâche arrière-plan avec un minuteur). En revanche mes notification "fait" et "erreur" n'apparaissent jamais. Et donc ma fonction testermails n'est jamais exécutée :(

    Quel est le problème ?

    Merci d'avance de votre aide ;)

    lundi 4 avril 2016 18:09

Réponses

  • Bonjour, 

    Il y a en effet des limitation (notamment de durée d'exécution des tâches en background). 

    Les voici : 

    - Si votre application n'est pas enregistrée dans l'écran de verrouillage : 

    • 1 seconde d'exécution
    • minimum 2 heures entre chaque exécution

    - Si votre application est enregistrée dans l'écran de verrouillage : 

    • 2 secondes d'exécution
    • minimum 15 minutes entre chaque exécution 

    Ces limitation existent pour garantir à l'utilisateur que les applications qu'il installe ne vont pas consommer de façon massive la batterie de leur téléphone.

    Si votre tâche mets plus de temps qu'imparti, alors elle sera terminée. 

    Il n'y a rien à faire pour augmenter ce temps. Je vous conseil plutôt de voir pour réduire le temps d'exécution côté service.

    Cordialement, 



    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.


    lundi 11 avril 2016 09:13
  • Bonjour, 

    Votre application est donc bien inscrite sur l'écran de verrouillage et dispose de 2 secondes. 

    Cordialement, 


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    • Marqué comme réponse yoanpg mardi 12 avril 2016 11:22
    mardi 12 avril 2016 06:15

Toutes les réponses

  • Bonjour, yoanpg,

    Pouvez-vous faire un test - exécuter la tâche désirée sans utiliser WinJs.xhr ?
    Je vous remercie par avance de votre retour.

    Cordialement,
    Teodora


    Votez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 5 avril 2016 14:38
    Modérateur
  • Si je supprime le WinJs.xhr, la tâche testermails() est correctement exécutée.

    En faisant plusieurs tests, il est apparue que la fonction testermails() a fonctionné quelques fois, même en étant à l'intérieur de du WinJs.xhr. Mais je n'arrive pas à trouver un comportement reproductible. Je n'arrive pas à comprendre pourquoi ça marche quelque fois, mais ça ne marche pas la majorité du temps ...

    mercredi 6 avril 2016 17:29
  • Bon en fait j'ai l'impression que le problème vient du fait que la page internet que je charge avec le WinJs.xhr est un peu longue à chargée.

    Du coup, peut-être que la tâche en arrière-plan est stoppée avant que ma fonction est été exécutée. Y a-t-il moyen d'augmenter le temps impartie pour la tâche en arrière-plan ?

    dimanche 10 avril 2016 09:07
  • Bonjour, 

    Il y a en effet des limitation (notamment de durée d'exécution des tâches en background). 

    Les voici : 

    - Si votre application n'est pas enregistrée dans l'écran de verrouillage : 

    • 1 seconde d'exécution
    • minimum 2 heures entre chaque exécution

    - Si votre application est enregistrée dans l'écran de verrouillage : 

    • 2 secondes d'exécution
    • minimum 15 minutes entre chaque exécution 

    Ces limitation existent pour garantir à l'utilisateur que les applications qu'il installe ne vont pas consommer de façon massive la batterie de leur téléphone.

    Si votre tâche mets plus de temps qu'imparti, alors elle sera terminée. 

    Il n'y a rien à faire pour augmenter ce temps. Je vous conseil plutôt de voir pour réduire le temps d'exécution côté service.

    Cordialement, 



    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.


    lundi 11 avril 2016 09:13
  • En effet 2 secondes ça fait court pour sniffer une page internet :s

    Lorsque je vais dans Démarrer\Paramètres\Personnalisation\Ecran de verrouillage, mon app figure dans la liste des "applications dont vous souhaitez afficher l'état rapide". Est-ce que ça suffit pour m'assurer que mon app est enregistrée sur l'écran de verrouillage et dispose de 2 secondes ?

    Si tel est le cas, je vais devoir revoir mon code pour faire quelque chose de plus rapide ...

    Merci

    lundi 11 avril 2016 16:34
  • Bonjour, 

    Votre application est donc bien inscrite sur l'écran de verrouillage et dispose de 2 secondes. 

    Cordialement, 


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    • Marqué comme réponse yoanpg mardi 12 avril 2016 11:22
    mardi 12 avril 2016 06:15