Est-il possible d'afficher l'historique des notifications du navigateur Chrome?

57

Je reçois des notifications Chrome de plusieurs sites Web. Elles fonctionnent même si aucun onglet n’est ouvert pour ces sites.

Mais parfois, je reçois ces notifications Chrome lorsque je ne suis pas à mon bureau ou que je regarde mon ordinateur portable.

Certaines de ces notifications m’étant utiles, j’aimerais pouvoir accéder à celles que j’ai manquées.

Existe-t-il un moyen d'afficher l'historique des notifications?

paradroque
la source
1
Ça ne semble pas comme ça. En examinant cet article ( theverge.com/2015/2015/14/9531133/… ), ils ont réorganisé leur stratégie de notification et l'a supprimée du bureau pour la placer sur des pages Web individuelles. La seule chose à faire pour accéder aux nouvelles notifications est de cliquer sur la cloche sur une page Google.
Terry
1
Cela ressemble à nope : productforums.google.com/forum/#!msg/chrome/xs9PflHTfho/… - très malheureux.
LB--
Le seul endroit où j'ai trouvé des notifications sous forme de liste est si le site Web qui les déclenche les a via son site Web. Chrome ne semble pas les rassembler dans quelque chose comme chrome://notificationset ils ne parviennent pas à l'OS.
Jason Lydon
Accepter la réponse valide @paradroid
Satheesh

Réponses:

31

Si vous avez un Mac, il y a un moyen! 😄

Voici à quoi ressemblerait la liste des notifications:

Voici à quoi ressemblerait la liste des notifications.

Tout ce que vous avez à faire est:

1. En chrome, allez à:

chrome://flags/

2. Recherchez:

Enable native notifications. Mac

3. Activez-le, redémarrez chrome, vous avez terminé. Prendre plaisir!

MODIFIER:

  • Vous pourriez ne plus avoir besoin de faire ce qui précède.

À partir de Chrome 59, les notifications envoyées via l'API Notifications ou l'API d'extensions chrome.notifications sont affichées directement par le système de notification natif macOS, au lieu du système propre de Chrome. [ source ]

Esdras Lopez
la source
2
Cela ne répond pas à la question de voir l'historique des notifications, mais seulement de voir les notifications.
Bjorn
6
@BjornTipling Il y répond. Il demande s'il peut voir les notifications qu'il a manquées pendant son absence et ma méthode fait exactement cela.
Esdras Lopez
1
Si vous mettez les liens en tant que commentaires, je les ajouterai à votre message, @EsdrasLopez
user418150 le
1
@ user418150 J'apprécie cela, mais j'ai maintenant la réputation. :) Vérifiez les modifications.
Esdras Lopez
2
Le principal problème ici est qu’il ne stocke la notification que si vous ne cliquez pas dessus. Plusieurs fois, j'ai cliqué sur un titre d'article intéressant, mais son chargement a échoué. Il a toutefois été supprimé de la liste des notifications. Habituellement, les articles sont trop récents pour être sur Google et souvent, le titre de la notification ne correspond pas au titre de l'article, de sorte qu'il se perd dans les entrailles du Web.
iBorg
13

Sur MacOSX, le répertoire Chrome sera situé dans Library / Application Support. Ouvrez l'application Terminal et exécutez les commandes suivantes:

cd ~/Library/Application\ Support/Google/Chrome/Default/Platform\ Notifications/
ls -la

Maintenant, vous verrez des fichiers comme celui-ci:

drwx------@  7 visi  staff   224 Jul 13 18:16 .
drwx------  75 visi  staff  2400 Jul 15 11:05 ..
-rw-------@  1 visi  staff   759 Jul 15 10:57 000003.log
-rw-------@  1 visi  staff    16 Jul 13 18:16 CURRENT
-rw-------@  1 visi  staff     0 Jul 13 18:16 LOCK
-rw-------@  1 visi  staff   147 Jul 13 18:16 LOG
-rw-------@  1 visi  staff    41 Jul 13 18:16 MANIFEST-000001

Vous pouvez voir que le plus récent est 000003.log, vérifiez-le avec la commande suivante:

tail -n 100 000003.log

Et vous verrez les 100 derniers éléments de ce journal. Ensuite, vous pouvez ouvrir les paramètres de chrome et désactiver cette notification.

Notez que si vous avez plusieurs profils en chrome, votre chemin peut être différent, comme ceci (Profile1 au lieu de Default):

cd ~/Library/Application\ Support/Google/Chrome/Profile\ 1/Platform\ Notifications/
Andrey Bezpalenko
la source
3
Cela devrait être la réponse acceptée. :)
Cody A. Ray Le
1
Je travaille toujours en 2019 (bien que le journal nécessite un peu d'interprétation). Grande réponse merci
Carpii
12

Si vous allez à %LocalAppData%\Google\Chrome\User Data\Default\Platform Notifications, il y a un fichier journal des notifications passées.

Corey
la source
4
Bien, mais envisagez de spécifier le chemin comme "% LocalAppData% \ Google \ Chrome \ Données utilisateur \ Default \ Platform Notifications" au lieu de code fixe. Cela fonctionne parfaitement sur n'importe quel PC.
Dmitry Gusarov
Dans le dossier UserData /, vous devrez peut-être d'abord localiser votre dossier de profil, par exemple, "C: \ Utilisateurs \ nom d'utilisateur \ AppData \ Local \ Google \ Chrome \ UserData \ Profil 1 \ Notifications de plate-forme"
Maffelu
1
Ces données sont binaires. Comment le lire?
Gaia
Sur Chrome 71, et le fichier journal est vide. Cela at-il été désactivé à un moment donné?
James
3
@ Gaia Je me demandais la même chose et je venais de fouiller du code Java pourri qui fait un travail acceptable pour déchiffrer la majeure partie de celui-ci. Je l'ai posté ci-dessous: superuser.com/a/1410742/778383
Dreamspace President
3

Comme il me semble impossible d’obtenir directement un enregistrement des notifications, si j’avais le même problème, je tricherais en utilisant un émulateur de téléphone Android, ou un téléphone, comme l’utilisateur qui a recommandé Pushbullet. Mais il n’ya pas que Pushbullet, il existe de nombreuses autres applications, nous pourrions discuter des astuces Android pour écouter et enregistrer les notifications, dans un fil séparé.

Si vous êtes programmeur, vous pourriez peut-être résoudre votre problème avec une extension faite maison:

https://stackoverflow.com/questions/15949606/how-can-i-listen-to-notifications

"Vous pouvez accrocher la fonction webkitNotifications.createNotification afin que, chaque fois qu'une notification est créée, vous exécutiez un code particulier."

Quidam
la source
2

Toucher quelque chose qui a été mentionné un peu plus haut mais avec une torsion qui assure que vous ne manquez pas la notification sur OSX:

  1. Sur le côté droit de la barre supérieure principale, cliquez sur l'icône de notification.

  2. Cliquez sur la roue dentée (en bas à droite de l'écran de notification).

  3. Sélectionnez Chrome pour définir le mode d'affichage des notifications.

  4. Par défaut, les "bannières" sont sélectionnées et peuvent disparaître automatiquement. Au lieu de cela, sélectionnez le type "Alert" et ils y resteront tant que vous ne les reconnaîtrez pas!

Je vous en prie :)

Patrick St-Onge
la source
2

Vous pouvez voir l'historique des notifications push. En bas à droite de l'écran de votre ordinateur, dans la barre des tâches, se trouve une bulle de dialogue. Si vous la survolez, vous verrez qu'elle s'appelle "notifications". Si vous cliquez sur cette bulle, vos courriels non lus / nouveaux et toutes les notifications push que vous n'avez pas rejetées s'afficheront. Je suis venu ici à la recherche de cette réponse et je ne l'ai pas trouvée mais j'ai ensuite réussi à trouver une solution. J'utilise Windows 10.

Shea Bethell
la source
Oui, c'est une chose récente sur Win10, mais c'est la réponse éventuelle pour Windows.
paradro
-1

On dirait que Pushbullet peut résoudre votre problème. Ils affirment que vous pouvez voir vos notifications manquées à l'aide de leur extension Chrome.

https://blog.pushbullet.com/2014/10/23/easily-access-your-recent-notifications-in-chrome/

Socialorganix Contentbrandmgmt
la source
Veuillez lire Comment recommander un logiciel pour obtenir les informations minimales requises et des suggestions sur la façon de recommander un logiciel sur Super User. Pour que votre réponse reste utile, même si le ou les liens fournis sont rompus, ces détails doivent être modifiés dans votre réponse.
Je dis: réintégrez Monica le
Hé bien. Je vais essayer ça. En fait, j'utilise déjà Pushbullet, mais je ne connaissais pas cette extension Chrome.
Paradroid
Impossible de trouver cette fonctionnalité. Une notification est apparue et il n'y a aucune trace de celle-ci dans l'historique de la notification.
madprops
J'ai repensé la question et le problème est le suivant. Si votre téléphone reçoit une notification, pushbullet l'enverra sur votre bureau et vous indiquera que vous avez éventuellement des notifications non lues (vous l'avez peut-être déjà vue sur votre téléphone ou ailleurs). Pour quels sites recevez-vous des notifications Chrome? S'il existe une application, vous pouvez toujours l'installer et vous recevrez alors les notifications de pushbullet sur votre ordinateur de bureau / ordinateur portable / ce que vous voulez.
Socialorganix Contentbrandmgmt
1
La fonctionnalité "Notifications" de Pushbullet sert uniquement à afficher les notifications de votre téléphone Android sur le bureau, et la même chose avec iPhone si vous avez un bureau Mac. Cela n'a rien à voir avec les notifications Chrome.
Boaz
-1

Grâce à la réponse de Corey ci-dessus et à un samedi paresseux avec trop de temps, je peux maintenant voir une liste des dernières notifications Chrome dans la console de mon IDE, où je peux même cliquer sur les URL.

Le code est merdique et utilise des méthodes heuristiques brutes car je n'ai aucune idée de la manière correcte d'interpréter les données binaires.

Mais c'est une tonne mieux que rien. Exemple de sortie (extrait):

https://www.finanzen.net/nachricht/aktien/kw-9-tops-und-flops-der-tecdax-aktien-in-der-vergangenen-woche-7195100
https://images.finanzen.net/mediacenter/unsortiert/TecDAX_boerse_frankfurt0016_kl.jpg
So bewegten sich die Einzelwerte des TecDAX in der zurückliegenden Handelswoche.*
KW 9: Tops und Flops der TecDAX-Aktien in der vergangenen Woche
So bewegten sich die Einzelwerte des TecDAX in der zurückliegenden Handelswoche.
HideOnTheseRoutes
Home/Index;Article/News/Index
tag-7195100
NotificationIdentifier
1061622960{


https://www.youtube.com/watch?v=W-mlD_bYKdU&feature=push-u-sub&attr_tag=0SL8UpnrTOnTECxr%3A6
https://lh5.googleusercontent.com/-raJM5SITO34/AAAAAAAAAAI/AAAAAAAAAAA/UtLljlL4Wpc/s96-c-mo/photo.jpg
New from Market Moves
Trade Recap: $1,500 in PROFITS*˜
COuAyJGY4uACEAY=
attributionTag
0SL8UpnrTOnTECxr:6{
 from Market MovesTrade Recap: $1,500 in PROFITS

Code Java digne de la crucifixion:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;




/**
 * v[1, 2019-03-02 13:00 UTC]
 *
 * by dreamspace-president.com
 */
final public class CrappyChromeNotificationHistoryReader {


    public static void main(final String[] args) {

        final File file = new File(
                "C:\\Users\\[YOUR_NAME_HERE]\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Platform Notifications\\000003.log");

        final List<ChromeNotificationStuff> notifications = obtainChromeNotificationStuff(file);
        for (ChromeNotificationStuff notification : notifications) {
            System.err.println();
            System.err.println(notification);
        }
        System.exit(0);
    }


    public static List<ChromeNotificationStuff> obtainChromeNotificationStuff(final File file) {

        final List<ChromeNotificationStuff> ret = new ArrayList<>();

        final List<DumbTokenList> listOfDumbTokenLists = doTheInsaneParsingThing(file);
        int instanceCounter = 0;
        for (DumbTokenList dtl : listOfDumbTokenLists) {

            final List<String> urls = new ArrayList<>();
            final List<String> texts = new ArrayList<>();

            for (String token : dtl.tokens) {
                if (token.startsWith("https://") || token.startsWith("http://")) {
                    urls.add(token);
                } else {
                    texts.add(token);
                }
            }


            // Remove unimportant URLs.
            for (int i = urls.size() - 1; i > 0; i--) {
                final String urlThis = urls.get(i);
                final int lenThis = urlThis.length();
                for (int ii = i - 1; ii >= 0; ii--) {
                    final String urlThat = urls.get(ii);
                    final int lenThat = urlThat.length();

                    if (lenThis > lenThat) {
                        if (urlThis.startsWith(urlThat)) {
                            final String removed = urls.remove(ii);
                            //                            System.err.println("\nREMOVED: " + removed + "\nKEPT   : " + urlThis); // because was better or equal
                            break;
                        }
                    } else {
                        if (urlThat.startsWith(urlThis)) {
                            final String removed = urls.remove(i);
                            //                            System.err.println("\nREMOVED: " + removed + "\nKEPT   : " + urlThat); // because was better or equal
                            break;
                        }
                    }

                }
            }

            ret.add(new ChromeNotificationStuff(instanceCounter, urls, texts));
            instanceCounter++;
        }

        ret.sort(null);

        return ret;
    }


    final public static class ChromeNotificationStuff implements Comparable<ChromeNotificationStuff> {


        private final int instanceCounter;
        final public List<String> urls;
        final public List<String> texts;


        private ChromeNotificationStuff(final int instanceCounter,
                                        final List<String> urls,
                                        final List<String> texts) {

            this.instanceCounter = instanceCounter;

            this.urls = Collections.unmodifiableList(urls);
            this.texts = Collections.unmodifiableList(texts);
        }


        public String toString() {

            final StringBuilder sb = new StringBuilder();
            for (String url : urls) {
                sb.append(url).append('\n');
            }
            for (String text : texts) {
                sb.append(text).append('\n');
            }
            return sb.toString();
        }


        @Override
        public int compareTo(final ChromeNotificationStuff o) { // Newest (= last) notifications first, please.

            return Integer.compare(o.instanceCounter, instanceCounter);
        }
    }




    final private static double MIN_LENGTH_DIFFERENCE_RATIO = 0.7;//0.9;
    final private static double MIN_REMAININGLINES_PERCENTAGEOF_ALLLINES = 0.2;




    final private static class DumbTokenList {


        final private static int MIN_LENGTH = 10; //6;
        final private static String[] EXTENSIONS = new String[] { ".jpg", ".jpeg", ".png", ".gif", ".html", ".htm", ".php" };
        final private static int MAX_EXTRA_CRAP_AFTER_EXTENSIONS = 3;
        final private static String SAFE_URL_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;="; // https://stackoverflow.com/a/1547940/3500521

        final private String originalText;
        final private List<String> tokens;


        private DumbTokenList(final String textWithBinaryCrap) {

            originalText = textWithBinaryCrap;

            final List<String> tokens = new ArrayList<>();

            final Consumer<String> addTokenButTryToDecrappifyExtensionsFirstAnTing = token -> {


                if (token.startsWith("ttps://") || token.startsWith("ttp://")) {
                    token = "h" + token;
                }


                final List<String> newTokens = new ArrayList<>();

                if (token.startsWith("http")) {
                    final int tokenLength = token.length();
                    boolean found = false;
                    for (int i = 0; i < tokenLength; i++) {
                        final char c = token.charAt(i);
                        if (SAFE_URL_CHARACTERS.indexOf(c) < 0) {
                            newTokens.add(token.substring(0, i));
                            newTokens.add(token.substring(i));
                            found = true;
                            break;
                        }
                    }
                    if (!found) {
                        newTokens.add(token);
                    }
                } else {
                    newTokens.add(token);
                }

                for (String newToken : newTokens) {


                    String foundExt = null;
                    int foundExtLen = 0;
                    int foundExtAt = -1;
                    for (String extension : EXTENSIONS) {
                        final int idx = newToken.indexOf(extension);
                        if (idx >= 0) {
                            final int extLen = extension.length();
                            if (idx > foundExtAt || (idx == foundExtAt && extLen > foundExtLen)) {
                                foundExt = extension;
                                foundExtLen = extLen;
                                foundExtAt = idx;
                            }
                        }
                    }
                    if (foundExt != null) {
                        final int amountOfCharactersAfterThisFind = newToken.length() - foundExtAt - foundExtLen;
                        if (amountOfCharactersAfterThisFind <= MAX_EXTRA_CRAP_AFTER_EXTENSIONS) {
                            // OK. Shorten this bitch.
                            newToken = newToken.substring(0, foundExtAt + foundExtLen);
                        }
                    }


                    if (newToken.startsWith("http")) {
                        if (!newToken.startsWith("http://") && !newToken.startsWith("https://")) {
                            continue;
                        }
                    }


                    if (newToken.startsWith("/watch?v=")) {
                        newToken = "https://www.youtube.com" + newToken;
                    }


                    if (newToken.length() >= MIN_LENGTH) {
                        tokens.add(newToken);
                    }


                }

            };

            final StringBuilder sb = new StringBuilder();

            final int len = textWithBinaryCrap.length();
            for (int i = 0; i <= len + 1; i++) {

                final char c = i < len ? textWithBinaryCrap.charAt(i) : 0;

                if (c < ' ' || c == '"') {

                    String potentialText = sb.toString();
                    while (true) {
                        final int httpIDX = potentialText.indexOf("http", 1);
                        if (httpIDX < 0) {
                            addTokenButTryToDecrappifyExtensionsFirstAnTing.accept(potentialText);
                            break;
                        } else {
                            final String snippet = potentialText.substring(0, httpIDX);
                            potentialText = potentialText.substring(httpIDX);
                            addTokenButTryToDecrappifyExtensionsFirstAnTing.accept(snippet);
                        }
                    }

                    sb.setLength(0);

                    if (c == '"') {
                        // Skip this and the next. (thus "i < len +1")
                        i++;
                    }
                } else {
                    sb.append(c);
                }
            }


            // Remove quasi-duplicates. Sue me.
            //            System.err.println("\n*** STARTING DEDUPLICATION ***");
            final int lSize = tokens.size();
            for (int i = lSize - 1; i > 0; i--) { // (not 0 itself, wouldn't make sense)

                if (i < tokens.size()) {

                    final String entry = tokens.get(i);

                    for (int ii = i - 1; ii >= 0; ii--) { // (incl. 0)

                        final String otherEntry = tokens.get(ii);

                        final Boolean removeNoneOrFirstOrSecond = areLinesTooSimilar(entry, otherEntry);
                        if (removeNoneOrFirstOrSecond != null) {

                            if (!removeNoneOrFirstOrSecond) {
                                final String removed = tokens.remove(i);
                                //                                System.err.println("\nREMOVED: " + removed + "\nKEPT   : " + otherEntry); // because was better or equal
                            } else {
                                final String removed = tokens.remove(ii);
                                //                                System.err.println("\nREMOVED: " + removed + "\nKEPT   : " + entry); // because was better or equal
                            }
                            break; // IMPORTANT!
                        }

                    }
                }
            }


            this.tokens = Collections.unmodifiableList(tokens);

        }


        public String toString() {

            final StringBuilder sb = new StringBuilder();
            for (String token : tokens) {
                sb.append(token).append('\n');
            }
            return sb.toString();
        }


    }


    /**
     * Do NOT call with NULL/EMPTY arguments.
     *
     * @return NULL if not too similar. False if the FIRST seems superfluous. True if the SECOND seems superfluous.
     */
    private static Boolean areLinesTooSimilar(final String line1,
                                              final String line2) {

        final int l1 = line1.length();
        final int l2 = line2.length();

        final double lenDiffRatio = Math.min(l1, l2) / (double) Math.max(l1, l2); // Results in 1 or less.

        if (lenDiffRatio >= MIN_LENGTH_DIFFERENCE_RATIO) {

            if (l2 < l1) {
                // Compare the other way round.
                if (line1.contains(line2)) {
                    return false;
                }
            } else {
                if (line2.contains(line1)) {
                    return true;
                }
            }

        }

        return null;
    }


    private static List<DumbTokenList> doTheInsaneParsingThing(final File file) {

        final List<DumbTokenList> ret = new ArrayList<>();

        final StringBuilder sb = new StringBuilder();
        try (final InputStream is = new BufferedInputStream(new FileInputStream(file))) {

            final int bufMinus1 = 4;
            final Charset charset = Charset.forName("Cp1252"); // =ansi

            final int[] buf = new int[bufMinus1 + 1]; // "DATA"
            //            while ((buf[buf.length - 1] = is.read()) >= 0) {
            while (true) {

                buf[bufMinus1] = is.read();

                if (buf[bufMinus1] < 0 || (
                        buf[0] == 'D' &&
                                buf[1] == 'A' &&
                                buf[2] == 'T' &&
                                buf[3] == 'A' &&
                                buf[4] == ':')) {

                    if (sb.length() > 0) {
                        ret.add(new DumbTokenList(sb.toString()));
                        sb.setLength(0);
                    }

                    if (buf[bufMinus1] < 0) {
                        break;
                    }

                } else {

                    sb.append(new String(new byte[] { (byte) buf[bufMinus1] }, charset));
                    //                    sb.append((char) buf[bufMinus1]);
                }


                // Shift minibuffer to front.
                for (int i = 0; i < bufMinus1; i++) {
                    buf[i] = buf[i + 1];
                }
            }


        } catch (IOException e) {
            e.printStackTrace();
        }


        // DEDUPLICATE DTLs
        for (int i = ret.size() - 1; i > 0; i--) {

            if (i < ret.size()) {
                final DumbTokenList dtlThis = ret.get(i);
                final int dtlThisTokenCount = dtlThis.tokens.size();

                for (int ii = i - 1; ii >= 0; ii--) {
                    final DumbTokenList dtlThat = ret.get(ii);
                    final int dtlThatTokenCount = dtlThat.tokens.size();


                    int scoreViaRemainingLines_this = dtlThisTokenCount;
                    int scoreViaRemainingLines_that = dtlThatTokenCount;


                    for (int o = 0; o < dtlThisTokenCount; o++) {
                        final String tokenThis = dtlThis.tokens.get(o);
                        for (int oo = 0; oo < dtlThatTokenCount; oo++) {
                            final String tokenThat = dtlThat.tokens.get(oo);

                            final Boolean tooSimilar = areLinesTooSimilar(tokenThis, tokenThat);
                            if (tooSimilar != null) {
                                scoreViaRemainingLines_this--;
                                scoreViaRemainingLines_that--;
                                break;
                            }

                        }
                    }

                    if (scoreViaRemainingLines_this < 0 || scoreViaRemainingLines_that < 0) {
                        throw new Error();
                    }

                    final double scoreActual_this = scoreViaRemainingLines_this / (double) dtlThisTokenCount;
                    final double scoreActual_that = scoreViaRemainingLines_that / (double) dtlThatTokenCount;


                    if (scoreViaRemainingLines_this < scoreViaRemainingLines_that) {
                        if (scoreActual_this < MIN_REMAININGLINES_PERCENTAGEOF_ALLLINES) {
                            final DumbTokenList removed = ret.remove(i);
                            //                            System.err.println("\nREMOVED:\n" + removed + "\nKEPT   :\n" + dtlThat);
                            break; // IMPORTANT.
                        }
                    } else {
                        if (scoreActual_that < MIN_REMAININGLINES_PERCENTAGEOF_ALLLINES) {
                            final DumbTokenList removed = ret.remove(ii);
                            //                            System.err.println("\nREMOVED:\n" + removed + "\nKEPT   :\n" + dtlThis);
                            break; // IMPORTANT.
                        }
                    }


                }

            }
        }

        return ret;
    }


}
Président Dreamspace
la source
1
Pour que cela fonctionne, j'ai utilisé les commandes suivantes, javac "C:\Users\MLM\Downloads\CrappyChromeNotificationHistoryReader.java"(pour compiler), java -cp C:\Users\MLM\Downloads CrappyChromeNotificationHistoryReader(pour s'exécuter) Le script échouant sur if (scoreViaRemainingLines_this < 0 || scoreViaRemainingLines_that < 0) {, j'ai commenté toute l'analyse doTheInsaneParsingThinget juste imprimé tout System.out.println(sb.toString());lorsque le jeton est ajouté à la liste. Il semble que "Notifications de plate-forme" ne gère que les notifications push du serveur.
MLM
@MLM: Merci pour l'info javac. En ce qui concerne le problème: fonctionne pour moi si je colle le code source dans un projet Java 8 IntelliJ ouvert, saisissez mon nom d’utilisateur (variable "fichier"), puis lancez le code.
Dreamspace President