none
Problème suite au passage de VS 2012 à 2015 RRS feed

  • Discussion générale

  • Bonjour à tous,

    Je suis passé de Windows 8 à Windows 10. J'en ai profité pour installé Visual Studio Express 2015 à la place de mon ancien Visual Studio 2012. J'ai voulu réouvrir un appli HTML/JS que j'ai dévelopée, j'avais une erreur me disant que VS n'était pas capable d'ouvrir le projet :/

    J'ai donc créé un nouveau projet, puis recopier les pages de code telles-quelles. J'ai également configurer à nouveau le manifest, notamment en créant une déclartion de Tâche en arrière-plan avec Evénement système et Minuteur, et comme point d'entrée "js\arriere-plan.js".

    Cependant, la fonction en arrière plan ne semble pas fonctionner. En lançant l'application, je n'ai pas de demande d'autorisation de fonction en arrière plan (est-ce Windows 10 ne le demande plus ?) et quand je déroule le menu Evénement de cycle de vie, ma fonction en arrière-plan n’apparaît pas :( )

    Pourtant j'ai déclaré ma fonction :

            function RegisterBackgroundTask(taskEntryPoint, taskName, trigger, condition) {
                // Check for existing registrations of this background task.
                var taskRegistered = false;
    
                var background = Windows.ApplicationModel.Background;
                var iter = background.BackgroundTaskRegistration.allTasks.first();
                var hascur = iter.hasCurrent;
    
                while (hascur) {
                    var cur = iter.current.value;
    
                    if (cur.name === taskName) {
                        taskRegistered = true;
                        break;
                    }
                    hascur = iter.moveNext();
                }
    
                // If the task is already registered, return the registration object.
                if (taskRegistered == true) {
                    return iter.current;
                }
    
                // Register the background task.
                var builder = new background.BackgroundTaskBuilder();
                builder.name = taskName;
                builder.taskEntryPoint = taskEntryPoint;
                builder.setTrigger(trigger);
    
                if (condition != null) {
                    builder.addCondition(condition);
                }
    
                var task = builder.register();
                return task;
            }
    
            //Enregistrement de la fonction en arrière-plan sur timer
            var hourlyTrigger = new Windows.ApplicationModel.Background.TimeTrigger(15, false);
            var userCondition = new Windows.ApplicationModel.Background.SystemCondition(Windows.ApplicationModel.Background.SystemConditionType.internetAvailable);
            Windows.ApplicationModel.Background.BackgroundExecutionManager.requestAccessAsync()
                                .then(function (accessStatus) {
                                    if (accessStatus == Windows.ApplicationModel.Background.BackgroundAccessStatus.denied
                                        || accessStatus == Windows.ApplicationModel.Background.BackgroundAccessStatus.unspecified)
                                        return;
    
                                    var entryPoint = "js\\arriere-plan.js";
                                    var taskName = "Vérification de mails";
                                    var task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
    
                                });
    
            //Enregistrement de la fonction en arrière-plan sur retour utilisateur
            var userTrigger = new Windows.ApplicationModel.Background.SystemTrigger(Windows.ApplicationModel.Background.SystemTriggerType.userPresent, false);
            var userCondition = new Windows.ApplicationModel.Background.SystemCondition(Windows.ApplicationModel.Background.SystemConditionType.internetAvailable);
            Windows.ApplicationModel.Background.BackgroundExecutionManager.requestAccessAsync()
                                .then(function (accessStatus) {
                                    if (accessStatus == Windows.ApplicationModel.Background.BackgroundAccessStatus.denied
                                        || accessStatus == Windows.ApplicationModel.Background.BackgroundAccessStatus.unspecified)
                                        return;
    
                                    var entryPoint = "js\\arriere-plan.js";
                                    var taskName = "Vérification de mails";
                                    var task = RegisterBackgroundTask(entryPoint, taskName, userTrigger, userCondition);
    
                                });

    Est-ce que j'ai oublié de faire quelque chose ? Ou est-ce que quelque chose a changé avec Windows 10 ?

    Merci d'avance de votre aide, j'en ai besoin :)

    jeudi 5 novembre 2015 18:39

Toutes les réponses

  • Merci de votre réponse

    Votre lien pointe vers un thread Visual Basic 2005, est-ce une erreur ? De plus je ne comprends pas bien votre réponse concernant une fonction qui renvoie  un int, alors que moi je veux définir une fonction en arrière-plan ...

    vendredi 6 novembre 2015 17:04
  • Bonjour, yoanpg,

    Votre lien pointe vers un thread Visual Basic 2005, est-ce une erreur ?

    Veuillez m’excuser. J’ai confondu quelque chose en répondant et je viens de supprimer cette réponse. En ce qui concerne votre problème, j’ai trouvé un exemple qui fait usage de BackgroundTaskDeferral: Windows phone 8.1 background tasks couldn't register the background task (la réponse du créateur de thread du 21 février 2015).

    J’espère qu’il vous sera utile.

    Cordialement,
    Dimitar

    vendredi 6 novembre 2015 18:29
    Modérateur
  • J'ai fait tout ce qui est dit sur cette page.

    J'ai fait quelques tests, et visiblement le script javascript inclus dans la page default.html n'est pas exécuté. C'est pour ça, on dirait, que ma tâche en arrière-plan n'est pas enregistrée.

    J'ai donc mi la déclaration de la tâche en arrière-plan dans le fichier default.js. Mais j'ai une erreur : "JavaScript runtime error: 'WinJS' is undefined". Est-ce qu'il faut importer un script (Microsoft.WinJS.2.0/js/base.js et/ou Microsoft.WinJS.2.0/js/ui.js) et si oui comment ?

    Cqr si j'importe avec self.importScripts("//Microsoft.WinJS.2.0/js/base.js") j'ai l'erreur JavaScript runtime error: Object doesn't support property or method 'importScripts'.

    Merci d'avance :)

    dimanche 8 novembre 2015 21:55
  • Bon j'ai trouvé mon problème de WinJS, mais je n'arrive toujours pas à re-faire fonctionner ma tâche en arrière plan.

    Dans default.js j'ai :

    (function () {
        "use strict";
    
        // Register a background task with the specified taskEntryPoint, name, trigger, and condition (optional).
        //
        // taskEntryPoint: Task entry point for the background task.
        // taskName: A name for the background task.
        // trigger: The trigger for the background task.
        // condition: Optional parameter. A conditional event that must be true for the task to fire.
        function RegisterBackgroundTask(taskEntryPoint, taskName, trigger, condition) {
            // Check for existing registrations of this background task.
            var taskRegistered = false;
    
            var background = Windows.ApplicationModel.Background;
            var iter = background.BackgroundTaskRegistration.allTasks.first();
            var hascur = iter.hasCurrent;
    
            while (hascur) {
                var cur = iter.current.value;
    
                if (cur.name === taskName) {
                    taskRegistered = true;
                    break;
                }
                hascur = iter.moveNext();
            }
    
            // If the task is already registered, return the registration object.
            if (taskRegistered == true) {
                return iter.current;
            }
    
            // Register the background task.
            var builder = new background.BackgroundTaskBuilder();
            builder.name = taskName;
            builder.taskEntryPoint = taskEntryPoint;
            builder.setTrigger(trigger);
    
            if (condition != null) {
                builder.addCondition(condition);
            }
    
            var task = builder.register();
            return task;
        }
    
        //Enregistrement de le fonction arrière-plan
        var hourlyTrigger = new Windows.ApplicationModel.Background.TimeTrigger(15, false);
        var userCondition = new Windows.ApplicationModel.Background.SystemCondition(Windows.ApplicationModel.Background.SystemConditionType.internetAvailable);
        Windows.ApplicationModel.Background.BackgroundExecutionManager.requestAccessAsync()
                            .then(function (accessStatus) {
                                if (accessStatus == Windows.ApplicationModel.Background.BackgroundAccessStatus.denied
                                    || accessStatus == Windows.ApplicationModel.Background.BackgroundAccessStatus.unspecified)
                                    return;
    
                                var entryPoint = "js\\script.js";
                                var taskName = "Test";
                                //var task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
    
                            });
    
    })();

    Dans script.js j'affiche une notification :

    (function () {
        "use strict";
    
        // 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.
            var notifications = Windows.UI.Notifications;
            var modele = notifications.ToastTemplateType.toastText04;
            var sourceXml = notifications.ToastNotificationManager.getTemplateContent(modele);
    
            var textes = sourceXml.getElementsByTagName("text");
            textes[0].appendChild(sourceXml.createTextNode("ligne1"));
            textes[1].appendChild(sourceXml.createTextNode("ligne2"));
            textes[2].appendChild(sourceXml.createTextNode("ligne3"));
    
            //var images = sourceXml.getElementsByTagName("image");
            //images[0].setAttribute("src", "ms-appx:///images/accueil50.scale-100.png");
    
            var toastXML = sourceXml.selectSingleNode("/toast");
            var audio = sourceXml.createElement("audio");
            audio.setAttribute("src", "ms-winsoundevent:Notification.Mail");
            toastXML.appendChild(audio);
    
            // Pour ajouter des paramètres lors du clic sur la notification
            //toastXML.setAttribute("launch", '{"type":"toast","parametre1":"blablabla","parametre2":"etc etc"}');
    
            var notification = new notifications.ToastNotification(sourceXml);
            notifications.ToastNotificationManager.createToastNotifier().show(notification);
        }
    
        if (!cancel) {
            doWork();
        } else {
            // Record information in LocalSettings to communicate with the app.
            key = backgroundTaskInstance.task.taskId.toString();
            settings.values[key] = "Canceled";
            close();
        }
    
    })();

    Et pour finir j'ai déclaré la capacité de tâche en arrière-plan dans le manifest. 

    Mais ça ne fonctionne pas, ma notification n'est jamais affichées :(

    J'ai utilisé l'observateur d'événement comme proposé ici et 5 minutes après le lancement de l'application j'ai l'enregistrement suivant :

    Une instance de la tâche en arrière-plan avec le point d’entrée js\script.js en cours d’exécution pour l’utilisateur ULTRABOOK\yoang dans la session 74529512 a retourné le code d’erreur 0x80270254.

    Quel est le problème ? J'espère vraiment que vous pourrez m'aider car je bloque :( Merci d'avance !

    mercredi 11 novembre 2015 21:47
  • Personne ne peut m'aider ?

    Quelqu'un a-t-il créé une tâche en arrière plan avec VS Express 2015 ??

    Merci

    dimanche 15 novembre 2015 15:27
  • Bonjour, yoanpg,

    J'espère que l'information dans le lien en bas vous sera utile :

    Can't register a Time triggered Background Task

    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.

    lundi 16 novembre 2015 15:23
    Modérateur
  • Je suis sous Windows 10, donc je n'ai plus de barre de charme. Par contre si je vais dans Démarrer/Paramètres/Confidentialité/Applications en arrière-plan, je retrouve mon application qui a l'autorisation

    De plus, le demande utilisateur je l'ai faite dans mon script.js :

    var hourlyTrigger = new Windows.ApplicationModel.Background.TimeTrigger(15, false);
        var userCondition = new Windows.ApplicationModel.Background.SystemCondition(Windows.ApplicationModel.Background.SystemConditionType.internetAvailable);
        Windows.ApplicationModel.Background.BackgroundExecutionManager.requestAccessAsync()
                            .then(function (accessStatus) {
                                if (accessStatus == Windows.ApplicationModel.Background.BackgroundAccessStatus.denied
                                    || accessStatus == Windows.ApplicationModel.Background.BackgroundAccessStatus.unspecified)
                                    return;
    
                                var entryPoint = "js\\script.js";
                                var taskName = "Test";
                                //var task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
    
                            });

    lundi 16 novembre 2015 19:09