Récupération automatique de données API REST (push ?)

 

Bonjour,


 


Débutant en Swift 3, je suis en ce moment entrain de développer une application (et pour iOS, et pour macOS). Je n'ai pas de problème particulier. 


 


Mes applications font appels aux API REST de Synology, le constructeur de NAS.


 


J'ai déjà  écris le code faisant l'interface entre l'API et mon app, je souhaiterais cependant ajouter la possibilité "d'écouter" l'API. Désolé, je suis un autodidacte, et je parle avec mes propres termes. 


 


Exemple :


 


- Quand un fichier est créé, je souhaite avoir la possibilité de le savoir via mon code, ou quand un fichier est modifié, supprimé, etc.. afin par exemple de mettre à  jour une UITableView en "temps réel".


Ou encore, la progression en pourcentage du téléchargement d'un fichier sur le NAS, etc...


 


J'ai déjà  écris le code qui me permet d'avoir ces données (en récupérant la liste des fichiers, ou le details de ces fichiers, etc...) mais ce que je veux, c'est de pouvoir "automatiser" ou rendre autonome cette récupération de données... une sorte de push ?


 


J'espère me faire comprendre, et si ce n'est pas le cas, j'en suis désolé d'avance.


 


Pouvez-vous me diriger vers les bonnes méthodes ?


 


Merci.


«1

Réponses

  • JérémyJérémy Membre
    novembre 2016 modifié #2

    Salut !  :)


     


    Pourquoi ne pas simplement rafraichir la liste quand l'utilisateur lance l'application, où lorsqu'elle redevient active ? Dans la méthode viewWillAppear, tu lances ta requête pour récupérer l'ensemble des datas. Puis, tu peux rajouter un bouton de rafraichissement pour récupérer les datas (pour les fichiers qui sont arrivés après le lancement de ton app).


     


    Je ne vois pas trop l'intérêt d'actualiser le contenu de ta liste même quand l'application n'est pas lancée... Tu pourrais envoyer une notification pour signaler qu'un nouveau fichier est dispo. Mais là  encore l'intérêt est limité...  :)


  • iosciosc Membre
    novembre 2016 modifié #3

    Salut Jérémy,


    Merci pour ta réponse.


     


    En fait, je savais que je m'expliquais mal, désolé pour cela.


    Ce que je suis entrain de faire plus particulièrement c'est d'écrire une "librairie" swift pour les API Synology, ce qui va évidemment me servir pour mon app iOS et mon app macOS.


     


    Je vais donner un exemple plus concret :


    Une des API Synology permet de gérer le package Download Station du NAS - qui permet de mettre en téléchargement des fichiers directement depuis/sur le NAS. Quand tu ajoute une tache de téléchargement, la tache passe du statut "waiting" à  "downloading" puis "finishing" et enfin "finished". Ce statut est récupérable via une requête GET qui récupère les détails au format JSON de la tâche en question.


     


    Typiquement, ici, je souhaite avoir le moyen de récupérer / d'écouter le changement de statut.


     


    De même, comment "écouter" la vitesse de téléchargement de ce fichier, ou le pourcentage accompli (données également présentes dans la réponse JSON)


     


    Je me demande quelle est la méthode à  adopter dans ce genre de cas. Faut il exécuter des requête selon un Timer ? J'ai un peu peur qu'une telle méthode ne soit pas très ergonomique ?


     


    Est-ce que j'ai été plus clair?


    Merci encore.


  • Bonjour,

    Deux solutions s'offrent à  toi;

    1 - écrire un plugin pour le nas qui te permet d'ouvrir une connexion avec ton programme et échanger des informations via cette connexion (connexion qui reste active)

    2 - rafraà®chir à  intervalle régulier avec un timer ou sur demande comme le suggère Jérémy.
  • CéroceCéroce Membre, Modérateur
    Pour résumer, ta communication étant basée sur HTTP, qui est un protocole client-serveur, c'est forcément l'appli iOS qui va s'enquérir auprès du NAS. Le "push" même à  la sauce Apple est une illusion: c'est bien le terminal iOS qui demande s'il y a quelque chose de neuf.
  • Merci à  vous deux.


    C'est bien ce que je pensais. 


     


    L'idée de créer un plugin pour le NAS est moyennement interessante étant donné que l'utilisateur utilisant l'app devrait à  son tour installer ce plugin - ce qui est à  mon sens peut être ennuyant pour l'utilisateur.


     


    Il semble donc que la seule solution est d'utiliser un timer qui vient, à  intervalle régulière, effectuer une requête serveur. 


    Qu'en est-il de l'impact sur les performances de l'app ensuite (particulièrement sur iOS)? 


    Et surtout, dans le cas de récupérer en temps réel la vitesse de téléchargement et/ou la progression de la tâche de téléchargement, la requête devrait être quasi permanente ? 


     


    Il y a des applications officielles et officieuses existantes déjà  pour les Synology, et ces applications embarquent déjà  tout cela, elles affichent la vitesse, la progression, affichent le statut des tâches de téléchargement, etc... : J'ai du mal à  imaginer qu'elles effectuent des requêtes toutes les 2 secondes ? Qu'en pensez-vous?


     


    Tout à  l'heure, je réfléchissais à  un exemple existant : Twitter par exemple, affiche une petite bannière dans le feed lors de nouveaux tweets? Une app telle que twitter utilise t-elle le même principe? une requête encapsulée dans un timer ?


  • JérémyJérémy Membre
    novembre 2016 modifié #7


    L'idée de créer un plugin pour le NAS est moyennement interessante étant donné que l'utilisateur utilisant l'app devrait à  son tour installer ce plugin - ce qui est à  mon sens peut être ennuyant pour l'utilisateur.




     


    +1 


     




    Il semble donc que la seule solution est d'utiliser un timer qui vient, à  intervalle régulière, effectuer une requête serveur. 


    Qu'en est-il de l'impact sur les performances de l'app ensuite (particulièrement sur iOS)? 


    Et surtout, dans le cas de récupérer en temps réel la vitesse de téléchargement et/ou la progression de la tâche de téléchargement, la requête devrait être quasi permanente ? 


     


    Il y a des applications officielles et officieuses existantes déjà  pour les Synology, et ces applications embarquent déjà  tout cela, elles affichent la vitesse, la progression, affichent le statut des tâches de téléchargement, etc... : J'ai du mal à  imaginer qu'elles effectuent des requêtes toutes les 2 secondes ? Qu'en pensez-vous?




     


    Les vitesses de téléchargement sont instantanées (comme nous pourrions le voir dans Safari lorsque tu télécharges un fichier) ?


     




    Tout à  l'heure, je réfléchissais à  un exemple existant : Twitter par exemple, affiche une petite bannière dans le feed lors de nouveaux tweets? Une app telle que twitter utilise t-elle le même principe? une requête encapsulée dans un timer ?




     


    Exactement (enfin j'imagine). Lorsque tu suis un "fil de discussion" (via un hashtag), tu remarqueras que l'iPhone envoie une requête à  intervalle régulier. Tu peux voir la petite roue qui indique une activité sur le réseau.


  • Intéressant pour twitter, je viens effectivement de remarquer la roue à  intervalle plus ou moins régulière (je n'ai pas chronométré).


    Et au niveau des performances donc, agir ainsi ne pose pas de problème ? Un NSURLSession dans un Timer, tout simplement ?


     


    Pour ce qui est de ta question pour la vitesse, j'aimerai effectivement récupéré la vitesse comme on peut le voir sous Safari.



  • Pour ce qui est de ta question pour la vitesse, j'aimerai effectivement récupéré la vitesse comme on peut le voir sous Safari.




     


    Ce que je voulais savoir (désolé, j'ai mal formulé ma question) c'est si les autres apps affichent les datas en temps réel ou l'état tel qu'il était il y a X seconde(s) des téléchargements en cours ?

  • Oups désolé. 


     


    Pour l'app officielle par exemple, cela donne l'apparence que c'est en temps réel.


    Maintenant que tu m'as pointé du doigt l'exemple twitter, je viens de remarquer que la roue de chargement s'affiche à  intervalle régulière, du genre toutes les 2/3 secondes, mettant à  jour le débit et la progression du téléchargement.


     


    A voir avec les autres apps (que je n'ai plus).



  • Maintenant que tu m'as pointé du doigt l'exemple twitter, je viens de remarquer que la roue de chargement s'affiche à  intervalle régulière, du genre toutes les 2/3 secondes, mettant à  jour le débit et la progression du téléchargement.




     


    Voilà  tu as ta réponse. 


     


    Ceci dit, d'un point de vue performance, ça ne doit pas être dramatique si tu es sur le même réseau local que ton NAS. En revanche, si tu dois y accéder depuis le réseau cellulaire (à  distance en somme), cette problématique doit être toute autre. Après il faut relativiser, je ne pense pas qu'il y ait grand intérêt de rester scotché sur l'app pour voir le download d'un fichier.   ^_^

  • Je pense que tu as raison, en effet. 


    Je vais structurer ça maintenant :)


     


    Merci à  toi!


  • Désolé c'est encore moi :)


     


    Je viens de regarder par contre pour le changement de statut d'une tâche. 


    Par exemple, si depuis le NAS ou depuis l'extension safari développée par un tiers, je mets mon téléchargement en Pause : sur l'app iOS, le changement de statut est immédiat. Et inversement, si je met en pause depuis l'app iOS, le changement est immédiat sur les autres apps/extensions.


     


    Là , il ne semble d'avoir de requêtes toutes les 3 secondes, mais bel et bien une autre méthode...


  • JérémyJérémy Membre
    novembre 2016 modifié #14


    Le "push" même à  la sauce Apple est une illusion: c'est bien le terminal iOS qui demande s'il y a quelque chose de neuf.




     


    Je ne remets pas en cause ce que tu dis mais comment font ils pour que sur ton adresse mail iCloud (via l'app mail) tu sois averti en temps réel lorsque tu as reçu un nouveau message ? C'est limite de l'instantané ?  ???


     




    si depuis le NAS ou depuis l'extension safari développée par un tiers, je mets mon téléchargement en Pause : sur l'app iOS, le changement de statut est immédiat. Et inversement, si je met en pause depuis l'app iOS, le changement est immédiat sur les autres apps/extensions.




     


    Perso je ne connais pas l'API présente dans les NAS de Synology, donc excuse mes questions bêtes. Tu disais que les apps tiers envoyaient des requêtes régulières pour avoir en temps réel la vitesse de téléchargement. A combien tu évalues l'intervalle de rafraà®chissement ? Si ce dernier est faible, il est normal que tu aies l'impression que l'action se répercute sur les devices de façon instantanée.


  • Pour l'app officielle iOS, c'est toutes les 4/5 secondes - donc c'est pas une impression pour l'actualisation du statut, qui elle se fait de façon instantané, vraiment (à  peine executé sur un device que les autres update immédiatement)


  • A voir avec ce qu'en pensent les autres mais je trouve bizarre que d'un coté l'app ait une connexion permanente (active) avec le NAS pour checker les statuts et que d'un autre elle envoie des requêtes régulières pour connaitre les vitesses de téléchargement...  :)


  •  

    Oui je suis un peu perdu, et surtout je n'arrive pas à  trouver de ressources sur le sujet sur le reste du web...


  • Pour commencer, tu peux encapsuler les appels vers le NAS dans un timer. Comme je te le disais ce n'est pas une solution déconnante, surtout si tu es sur le même réseau local que ton nas (les appels seront vraiment rapides).  ;)


     


    Après nous verrons en fonction des réponses des autres membres du forum.  :)


  •  

    C'est ce que j'ai fait pour le moment, mais j'ai cette impression étrange que je fais du "bricolage"...

  • Espionne le trafic sur ton réseau local.
  •  

    Bonjour FKDEV,


    Merci pour ta réponse, mais je dois te dire : pourquoi ? comment ?


    Un peu plus de précisions serait bienvenu.


  • CéroceCéroce Membre, Modérateur

    pourquoi ?

    Parce que tu verras les requêtes passer et idéalement tu sauras ce qu'elles contiennent.

    comment ?

    Par exemple avec Charles: https://www.charlesproxy.com
    J'avoue n'avoir aucune expérience sur le sujet.
  •  

    Donc c'est plus par rapport à  savoir ce qui se passe avec les app tierces, c'est ça ?


    Par contre, je ne pense pas que cela soit possible d'écouter les requêtes sur le NAS ? Charles semble écouter le réseau local, enfin, ce qui se passe depuis ton mac ? J'entends par là , cela ne me servirait pas à  écouter les requêtes reçues sur le NAS depuis les apps iOS?


  • De mémoire et de ce que j'ai compris qu'a fait un collègue une fois avec Charles.
    Une fois configuré, tes connexions (dont celles des apps iOS) passeront automatiquement par Charles qui se chargera de les renvoyer comme de rien était. C'est juste un relais. Donc tu verras ce qui se passe.
  • LexxisLexxis Membre
    novembre 2016 modifié #25

    Charles te permet de créer un proxy, il faut ensuite paramétrer l'iPhone pour qu'il utilise ce proxy. Ainsi toutes les requêtes qui transiteront entre l'iPhone et le NAS seront visible par Charles.


     


    Grilled par Larme.


  • Tu peux utiliser un appareil ou même le simulateur. Il suffit d'installer un certificat dessus et tu pourras voir les requêtes passer. 


  • Merci à  vous, je vais voir ça si j'ai un moment.


    Pour le moment, j'utilise une requête encapsulé dans un Timer, ça fait l'affaire - en espérant que cela ne nuise pas à  l'expérience utilisateur et/ou aux performances.


     


    Surtout, si d'autre on des idées différentes, n'hésitez pas.


  • zoczoc Membre
    novembre 2016 modifié #28

    La réponse à  la question est dans la documentation de l'API de Synology:


     


    - Soit ils ont prévu et documenté un système de notifications par Push


    - Soit il faudra faire du polling régulier


     


    Tu ne pourras pas faire de push si l'API n'a pas été faite pour ça.


  • Pour le moment, j'utilise une requête encapsulé dans un Timer, ça fait l'affaire - en espérant que cela ne nuise pas à  l'expérience utilisateur et/ou aux performances.

    Et à  la batterie...
  • Et à  la batterie...


    Ah, donc tu sous entends que le choix d'une requête encapsulée dans un Timer peut-être un problème - particulièrement au niveau de la batterie?
  • C'est une question à  se poser, je ne suis pas bien sûr de la réponse.
    Je ne sais pas si l'influence d'une requête toutes les 3 secondes est significative sur la batterie, en 3G/4G surement plus qu'en wifi.
Connectez-vous ou Inscrivez-vous pour répondre.