Développement d'applications mobiles sur Azure
Développement d'applications mobiles sur Azure
Y ARCHITECTURE
d ENTRAINEMENT
q VIDEO
e VUE D’ENSEMBLE
Créer un back-end d’application mobile serverless avec Azure Functions et d’autres services
f DÉMARRAGE RAPIDE
d ENTRAINEMENT
Consommer un service web RESTful avec Xamarin
e VUE D’ENSEMBLE
Travailler avec des données hors connexion en utilisant Azure Mobile Apps
Stockage cloud pour des applications hautement sécurisées, durables et scalables avec
Stockage Azure
f DÉMARRAGE RAPIDE
Créer une application [Link] avec le Kit de développement logiciel (SDK) .NET et
Azure Cosmos DB pour MongoDB
e VUE D’ENSEMBLE
Collaborer avec les utilisateurs de vos applications en envoyant des notifications Push
f DÉMARRAGE RAPIDE
g DIDACTICIEL
Envoyer des notifications Push à des applications [Link] avec [Link] Core et Azure
Notification Hubs
Ajouter une authentification et gérer les identités des utilisateurs dans vos applications
mobiles
g DIDACTICIEL
Connecter des utilisateurs et appeler Microsoft Graph à partir d’une application Android
Ajouter une application cliente native à votre locataire Azure Active Directory B2C
s SAMPLE
p CONCEPT
Automatisez le cycle de vie de vos application avec une compilation et une intégration
continues
e VUE D’ENSEMBLE
c GUIDE PRATIQUE
p CONCEPT
Superviser en temps réel les défaillances et les erreurs dans votre application mobile
e VUE D’ENSEMBLE
c GUIDE PRATIQUE
g DIDACTICIEL
a TÉLÉCHARGER
iOS
Android
.NET, Xamarin
Les développeurs peuvent utiliser des technologies côté client pour créer eux-mêmes
des applications mobiles en utilisant des infrastructures et des modèles spécifiques pour
une approche multiplateforme. En fonction de leurs facteurs de décision, les
développeurs peuvent créer :
Plateformes natives
La création d’une application native nécessite des langages de programmation
spécifiques à la plateforme, des kits de développement logiciel (SDK), des
environnements de développement et d’autres outils fournis par les fournisseurs de
systèmes d’exploitation.
iOS
Créé et développé par Apple, iOS est utilisé pour créer des applications sur des appareils
Apple, à savoir iPhone et iPad.
Android
Conçu par Google et par le système d’exploitation le plus populaire du monde, Android
permet de créer des applications pouvant s’exécuter sur un éventail de smartphones et
de tablettes.
Xamarin
Détenu par Microsoft, Xamarin est utilisé pour créer des applications mobiles
multiplateformes robustes en C#. Xamarin dispose d’une bibliothèque de classes et d’un
runtime qui fonctionne sur plusieurs plateformes, telles qu’iOS, Android et Windows. Il
compile également les applications natives (non interprétées) qui offrent des
performances élevées. Xamarin combine toutes les capacités des plateformes natives et
ajoute un certain nombre de ses fonctionnalités puissantes.
Langage de programmation : C#
IDE : Visual Studio sur Windows ou Mac
React Native
Publié par Facebook en 2015, React Native est une infrastructure open source
JavaScript permettant d’écrire des applications mobiles réelles de rendu en mode natif
pour iOS et Android. Il est basé sur REACT, la bibliothèque JavaScript de Facebook pour
la création d’interfaces utilisateur. Au lieu de cibler le navigateur, il cible les plateformes
mobiles. React Native utilise des composants natifs au lieu de composants web comme
blocs de construction.
Unity
Unity est un moteur optimisé pour la création de jeux. Vous pouvez l’utiliser pour
concevoir des applications 2D ou 3D de haute qualité en C# pour des plateformes telles
que Windows, iOS, Android et Xbox.
Cordova
Cordova vous permet de créer des applications hybrides à l’aide de Visual Studio Tools
pour Apache Cordova ou Visual Studio Code avec des extensions pour Cordova.
L’approche hybride vous permet de partager des composants avec des sites web et de
réutiliser des applications basées sur un serveur web avec des approches d’applications
web hébergées basées sur Cordova.
Avantages du multiplateforme
Facilité d’utilisation accrue du code grâce à la création d’un code base pour
plusieurs plateformes
Répondre aux besoins d’une audience plus vaste sur de nombreuses plateformes
Réduction spectaculaire de la durée de développement
Facile à lancer et à mettre à jour
Inconvénients du multiplateforme
Moins bonnes performances
Manque de flexibilité
Chaque plateforme possède un ensemble unique de composants et de
fonctionnalités pour rendre l’application native plus créative
Durée de conception de l’interface utilisateur accrue
Limitation en termes d’outils
Différentes phases du développement
d’applications mobiles
Article • 08/06/2023
La création d’une application mobile implique plusieurs étapes. Vous pouvez facilement
tirer parti des services, outils et technologies Microsoft pour créer des applications
mobiles de grande qualité.
Développement d’applications
Vous pouvez créer des applications clientes natives pour plateforme unique à l’aide de
langages tels qu’Objective-C et Java. Vous pouvez créer des applications
multiplateformes à l’aide de Xamarin, de React Native et de Unity. Vous pouvez
également créer des applications hybrides à l’aide de Cordova. Pour construire des
applications clientes, utilisez des IDE et des éditeurs de code, tels que Visual Studio,
Visual Studio pour Mac ou Visual Studio Code, sur des PC et Mac.
Services supplémentaires
De nombreux services Azure sont utilisables, en fonction du type et de la nature de
l’application en cours de génération :
Recherche cognitive Azure pour rechercher tous les types de données internes,
avec une interrogation rapide.
Azure Cognitive Services pour utiliser l’intelligence artificielle dans votre
application.
Azure SignalR pour activer la communication en temps réel dans votre application.
Ajouter une authentification et gérer les
identités des utilisateurs dans vos
applications mobiles
Article • 08/11/2023
Le fait de voir l’utilisateur et son comportement dans votre application permet aux
développeurs de fidéliser les utilisateurs en leur créant des expériences sur-mesure. Que
vous soyez un développeur d’applications créant une application de collaboration pour
des utilisateurs dans votre organisation ou que vous créiez la future plateforme de
réseaux sociaux, vous avez besoin d’un moyen d’authentifier les utilisateurs et de gérer
leurs identités. Le service de gestion des identités est l’une des fonctionnalités les plus
importantes d’un service back-end mobile.
Utilisez les services suivants pour activer l’authentification des utilisateurs dans vos
applications mobiles.
Microsoft Entra ID
Microsoft Entra ID est le service de gestion des identités et des accès cloud de
Microsoft, qui permet à vos employés de se connecter et d’accéder à :
Ressources externes telles que Microsoft 365, le portail Azure et des milliers
d’autres applications SaaS (Software as a service).
Ressources internes telles que les applications situées sur votre réseau d’entreprise
et intranet ainsi que les applications cloud développées par votre propre
organisation.
Azure Mobile Apps (également appelé Microsoft Data Sync Framework) offre aux
développeurs d’entreprise et aux intégrateurs système une plateforme de
développement d’applications mobiles hautement évolutive et mondialement
disponible. L’infrastructure fournit à votre application mobile les fonctionnalités
suivantes :
Authentification
Requête de données
Synchronisation des données hors connexion
Azure Mobile Apps est conçu pour fonctionner avec Azure App Service. Étant donné
qu’il est basé sur [Link] 6, il peut également être exécuté en tant que conteneur dans
Azure Container Apps ou Azure Kubernetes Service.
Accès aux données : Azure Mobile Apps fournit une source de données OData v4
conviviale qui est liée à une base de données compatible via Entity Framework
Core. Toute base de données compatible peut être utilisée, y compris Azure SQL,
Azure Cosmos DB ou microsoft SQL Server local.
Mise à l’échelle automatique : avec App Service, vous pouvez facilement effectuer
un scale-up ou un scale-out pour vous adapter à n’importe quelle charge cliente
entrante. Sélectionnez manuellement le nombre et la taille des machines virtuelles,
ou configurez la mise à l’échelle automatique pour dimensionner votre service en
fonction de la charge ou d’une planification.
Environnements intermédiaires : App Service peut exécuter plusieurs versions de
votre site. Vous pouvez effectuer des tests A/B et effectuer une mise en lots sur
place d’un nouveau service mobile.
Réseaux virtuels : App Service peut se connecter à des ressources locales à l’aide
de connexions de réseau virtuel, Azure ExpressRoute ou hybrides.
Étapes suivantes
Pour commencer à utiliser Azure Mobile Apps, suivez un tutoriel de démarrage. Ce
tutoriel décrit les principes fondamentaux de la production d’un service mobile et d’un
client de votre choix. Il couvre également l’intégration de l’authentification et de la
synchronisation hors connexion. Vous pouvez suivre le tutoriel plusieurs fois, une pour
chaque application cliente.
Quel que soit le type d'application que vous créez, vous êtes susceptible de générer et
de traiter des données. Les attentes des utilisateurs de votre application sont élevées. Ils
veulent que l'application fonctionne rapidement et avec fluidité, en toutes circonstances.
La plupart des applications fonctionnent également sur plusieurs appareils. Vous pouvez
accéder à votre application à partir d'un ordinateur de bureau ou d'un appareil mobile.
Plusieurs utilisateurs peuvent utiliser l'application en même temps et partager des
données en espérant disposer d'un accès immédiat et en temps réel aux données.
Microsoft propose un large éventail de services qui éliminent le besoin de faire tourner
des serveurs, de choisir votre base de données ou de vous soucier de la mise à l'échelle
ou de la sécurité pour offrir l'expérience la plus riche possible. Ces services vous offrent
une expérience de développement exceptionnelle qui vous permet de stocker les
données d'application dans le cloud en utilisant des API SQL ou NoSQL. Vous pouvez
également synchroniser les données sur tous les appareils et permettre aux applications
de fonctionner avec ou sans connexion réseau pour créer des applications évolutives et
robustes.
Utilisez les services suivants pour gérer et stocker les données d’application mobile dans
le cloud.
Azure Cosmos DB
Azure Cosmos DB est un service de base de données multimodèle distribué à l’échelle
mondiale. Vous pouvez l'utiliser pour générer des applications à l'échelle de la planète.
Azure Cosmos DB vous permet de faire évoluer en toute flexibilité et de façon
indépendante le débit et le stockage dans un nombre illimité de régions Azure à travers
le monde. Vous pouvez tirer parti d'un accès ultrarapide aux données en utilisant vos
surfaces d'API préférées. Ces surfaces incluent SQL, MongoDB, Cassandra, Tables ou
Gremlin. Azure Cosmos DB offre des garanties en termes de débit, de latence, de
disponibilité et de cohérence avec des contrats SLA complets.
Maintenance quasi nulle : le logiciel automatique fait partie du service. Les réplicas
système intégrés contribuent à assurer une protection des données inhérente, une
disponibilité de la base de données et la stabilité du système. Les réplicas système
sont automatiquement déplacés vers de nouveaux ordinateurs. Ils sont
approvisionnés à la volée, car les anciens ne fonctionnent pas.
Azure SQL Database est vérifié par les principaux auditeurs de cloud dans le cadre
des principales approbations et certifications de conformité Azure, comme HIPAA
BAA, ISO/IEC 27001:2005, FedRAMP et les clauses contractuelles types de l'UE.
Le service Stockage Azure est la solution de stockage cloud de Microsoft pour les
applications récentes qui offre un magasin d’objets hautement scalable pour des objets
de données, un service de système de fichiers pour le cloud, un magasin de messagerie
pour une messagerie fiable et un magasin NoSQL. Le Stockage Azure est :
Utilisez les services suivants pour activer le stockage cloud dans vos applications
mobiles.
Vous pouvez utiliser le stockage Table Azure pour stocker et interroger de grands
ensembles de données non relationnelles et structurées. Vos tableaux évoluent à mesure
que la demande augmente.
Informations de référence sur le stockage Table Azure
Azure portal
Documentation Stockage Table Azure
Exemples
Démarrages rapides
Azure Content Delivery Network offre aux développeurs une solution internationale
pour la distribution rapide de contenu haut débit comme des vidéos, images ou fichiers
statiques aux utilisateurs en mettant en cache leur contenu sur des centaines de points
de présence dans le Monde entier. Content Delivery Network peut également accélérer
le contenu dynamique, qui ne peut pas être mis en cache, pour réduire les temps de
chargement, économiser la bande passante et améliorer la réactivité. Vous bénéficiez de
ces avantages si vous développez ou gérez des sites web ou des applications Mobiles,
ou si vous encodez et distribuez média de diffusion en continu, des logiciels de jeu, des
mises à jour de microprogramme ou des points de terminaison IoT.
Chaque application mobile a besoin d’un back-end qui est responsable du stockage des
données, de la logique métier et de la sécurité. La gestion de l’infrastructure pour
héberger et exécuter du code back-end vous oblige à dimensionner, provisionner et
mettre à l’échelle plusieurs serveurs. Vous devez également gérer les mises à jour du
système d’exploitation et le matériel impliqué, ainsi qu’appliquer des correctifs de
sécurité. Vous devez ensuite surveiller les performances, la disponibilité et la tolérance
de panne de tous ces composants d’infrastructure.
L’architecture serverless est très utile pour ce type de scénario, car vous n’avez aucun
serveur à gérer ni aucune mise à jour logicielle ou matérielle associée à gérer.
L’architecture serverless permet aux développeurs d’économiser beaucoup de temps et
de frais, ce qui est synonyme de raccourcissement du Time-to-Market et d’un meilleur
ciblage des énergies envers la création d’applications.
Avantages du calcul
L’abstraction des serveurs signifie que vous n’avez plus à vous soucier de
l’hébergement, de la mise à jour corrective et de la sécurité. Vous pouvez ainsi
vous concentrer uniquement sur le code.
La mise à l’échelle instantanée et efficace garantit le provisionnement automatique
ou à la demande des ressources, quelle que soit l’échelle dont vous avez besoin.
Haute disponibilité et tolérance de panne.
Grâce à la micro-facturation, vous êtes certain d’être facturé uniquement quand
votre code est réellement en cours d’exécution.
Le code s’exécute dans le cloud écrit dans le langage de votre choix.
Utilisez les services suivants pour activer les fonctionnalités de calcul serverless dans vos
applications mobiles.
Azure Functions
Azure Functions est une expérience de calcul pilotée par événements, qui vous
permet d’exécuter du code écrit dans le langage de programmation de votre choix sans
vous soucier des serveurs. Vous n’avez pas besoin de gérer l’application ou
l’infrastructure sur laquelle l’exécuter. Les fonctions sont mises à l’échelle à la demande,
et vous payez uniquement en fonction du temps d’exécution de votre code. Azure
Functions est un excellent moyen d’implémenter une API pour une application mobile.
Les fonctions sont faciles à implémenter et à gérer et sont accessibles via HTTP.
Azure SignalR Service vous permet d'ajouter facilement des fonctionnalités en temps
réel aux applications. Cette fonctionnalité de temps réel permet au service de
transmettre des mises à jour de contenu aux applications mobiles connectées. Ainsi, les
applications sont mises à jour sans avoir à interroger le serveur ni à envoyer de
nouvelles requêtes HTTP de mise à jour.
Le code source hébergé dans le cloud est facilement accessible, quel que soit l’endroit
où vous êtes. Un référentiel central signifie que les membres de l’équipe de
développement peuvent interagir sur la même base de code en chargeant, en modifiant
et en gérant les fichiers de code. L’hébergement cloud nécessite moins de configuration
matérielle que les options locales, ce qui vous permet d’implémenter des solutions de
manière plus simple et plus agile.
Les avantages de l’hébergement du code source dans le cloud sont les suivants :
Stockage central pour afficher et gérer vos données à partir de n’importe où.
Meilleure collaboration pour le code propre er.
Contribuer plus facilement à encourager l’implication .
Versions plus rapides.
Réduction des coûts en ne conservant pas le matériel et l’infrastructure.
GitHub et Azure Repos sont deux options pour héberger le code source et les données
d’application mobile dans le cloud.
GitHub
GitHub est un service d’hébergement de référentiel open source pour les projets de
code dans de nombreux langages différents. GitHub effectue le suivi et aide à résoudre
les différentes modifications de chaque itération de code.
Passez en revue le code avec des outils de révision intégrés pour que le code passe en
revue une partie essentielle du processus de votre équipe.
Rôles d’utilisateur pour organiser les rôles d’équipe et les autorisations d’accès.
Outils de discussion pour assurer le suivi et l’équipe des conversations.
Recommandations de la communauté pour configurer rapidement de nouveaux
membres d’équipe avec des comptes.
Utilisez GitHub Actions pour connecter tous vos outils et automatiser chaque étape
de votre workflow de développement.
Azure Repos
Azure Repos est l’option de contrôle de code source distribuée pour Azure DevOps
Services . Azure Repos offre des référentiels privés ou publics gratuits illimités avec des
révisions de code collaboratives, une gestion avancée des fichiers, une recherche de
code et des stratégies de branche.
Azure Repos s’intègre à d’autres services tels qu’Azure Pipelines et Azure Boards pour
les service de projet de bout en bout. Azure Repos est idéal pour les petits projets ou
pour les grandes organisations qui ont besoin de la prise en charge native d’Azure
Active Directory (Azure AD) et de contrôles de stratégie avancés.
Vous pouvez également utiliser Team Foundation Version Control (TFVC) pour le
contrôle de code source centralisé avec révision de code.
Azure Repos prend en charge n’importe quel client Git via des webhooks et
l’intégration d’API Git.
Connecter à votre code à partir d’environnements de développement tels que
Xcode, Eclipse, IntelliJ, Android Studio, Visual Studio et Visual Studio Code.
Collaborez pour créer un meilleur code à l’aide de discussions threadées et
d’intégration continue (CI) pour chaque modification.
Utilisez Azure Pipelines ou d’autres outils pour lancer des builds à partir de
demandes de tirage. Configurez des pipelines d’intégration continue/livraison
continue (CI/CD) qui créent, testent et déploient automatiquement votre
application avec chaque demande de tirage terminée.
Utilisez une recherche de code sémantique puissante dans les demandes
d’extraction.
Simplifiez la gestion des accès avec l’intégration native d’Azure AD.
Assurez-vous que la qualité du code avec les stratégies de branche, telles que le
nombre minimal de réviseurs, les exigences relatives aux builds réussies et
l’application de la stratégie de fusion Git.
Intégrer à des outils de gestion de projet Azure Boards .
Étapes suivantes
Guides GitHub
Forum de la communauté GitHub
GitHub Marketplace
Bien démarrer avec Azure Repos
Documentation Azure Repos
Qu’est-ce que DevOps ?
Article • 23/10/2023
Importance de DevOps
Accélère la totalité du cycle de vie des logiciels, de la validation du code au
déploiement de production.
Permet aux organisations de fournir plus rapidement des mises à jour logicielles et
de sécurité en interne et aux clients.
Vise à réduire les conflits entre les équipes de développement et d’opérations. Les
développeurs se concentrent généralement sur la satisfaction des besoins de
l’entreprise pour ajouter des fonctionnalités et améliorer la facilité d’utilisation des
applications. Les équipes d’opérations se concentrent traditionnellement
davantage sur la stabilité et la sécurité des environnements informatiques.
Confère une plus grande agilité, améliore la réactivité des clients et réduit le délai
de commercialisation.
Accroît l’agilité en réunissant les personnes, le processus et les produits pour
apporter à vos utilisateurs une valeur ajoutée constante.
Entraîne une réduction des coûts lorsque les organisations suivent les pratiques
DevOps. Les organisations sont en mesure d’atteindre leurs objectifs, quelle que
soit leur mission.
Étapes suivantes
Apprenez-en davantage sur les rubriques associées à DevOps mobile :
En tant que développeurs, vous écrivez du code que vous archivez dans le référentiel de
code, mais il est possible que les validations qui y sont archivées ne soient pas toujours
cohérentes. Lorsque plusieurs développeurs travaillent sur le même projet, des
problèmes peuvent survenir avec l’intégration. Les équipes peuvent rencontrer des
situations où les choses ne fonctionnent pas, les bogues s’accumulent et le
développement du projet est retardé. Les développeurs doivent attendre que tout le
code logiciel soit créé et testé pour rechercher les erreurs, ce qui rend le processus lent
et moins itératif.
Principaux avantages
Automatisez vos builds, tests et déploiements pour les pipelines.
Détectez les bogues et résolvez les problèmes tôt pour garantir des taux de mise
en production plus élevés.
Validez le code plus fréquemment et compilez rapidement des applications.
Bénéficiez de plus de flexibilité pour modifier rapidement le code sans aucun
problème.
Atteignez un délai de commercialisation plus rapide pour que seul du code de
bonne qualité franchisse toutes les étapes du processus.
Apportez des modifications de code mineures plus efficacement, car les petits
morceaux de code sont intégrés en une fois.
Augmentez la transparence et la responsabilité de l’équipe pour obtenir des
commentaires en continu de vos clients ainsi que de votre équipe.
Utilisez les services suivants pour activer le pipeline d’intégration continue dans vos
applications mobiles.
Avec la puissance ajoutée des services Visual Studio App Center, vous pouvez continuer
à automatiser votre flux de travail. Vous pouvez publier automatiquement des builds
vers des testeurs et des magasins d’applications publics avec App Center Distribute.
Vous pouvez également exécuter des tests automatisés de l’interface utilisateur sur des
milliers de configurations d’appareil et de système d’exploitation réelles dans le cloud
avec App Center Test.
Pour vous aider à choisir le bon service pour les builds de votre application, consultez
l’article qui compare App Center Build et Azure Pipelines.
Effectuer des tests automatisés sur des
milliers d’appareils mobiles
simultanément
Article • 08/06/2023
Les tests peuvent s’avérer difficiles et de plus en plus complexes pour diverses raisons,
telles que la fragmentation des appareils, la complexité des applications, les cycles de
mise en production rapides, les sessions courtes et les attentes élevées des utilisateurs.
Vous devez régulièrement veiller à fournir des applications testées minutieusement qui
offrent une expérience client exceptionnelle. Le test n’est pas une tâche facile et il est
déconseillé de demander au développeur de passer du temps à tester manuellement
chaque version.
Les défis relatifs aux tests peuvent relevés traités efficacement. Vous pouvez tester des
applications mobiles sur un large éventail d’appareils à l’aide de tests automatisés. Vous
pouvez utiliser des services cloud pour accélérer la mise en production d’applications
mobiles et résoudre les problèmes de test qui ajoutent des goulots d’étranglement au
développement et au déploiement d’applications.
En tant que développeurs, vous écrivez du code que vous archivez dans le référentiel de
code, mais il est possible que les validations qui y sont archivées ne soient pas toujours
cohérentes. Lorsque plusieurs développeurs travaillent sur le même projet, des
problèmes peuvent survenir avec l’intégration. Les équipes peuvent rencontrer des
situations où les choses ne fonctionnent pas, les bogues s’accumulent et le
développement du projet est retardé. Les développeurs doivent attendre que tout le
code logiciel soit créé et testé pour rechercher les erreurs, ce qui rend le processus lent
et moins itératif.
Utilisez les services suivants pour activer un pipeline de livraison continue dans vos
applications mobiles.
Azure Pipelines
Azure Pipelines est un service complet d’intégration continue (CI) et de livraison
continue (CD) qui fonctionne avec votre fournisseur Git préféré. La solution Azure
Pipelines peut être déployée sur la plupart des services cloud de premier plan, tels que
les services Azure. Vous pouvez commencer avec votre code sur GitHub, GitHub
Enterprise Server, GitLab, Bitbucket Cloud ou Azure Repos. Vous pouvez ensuite
automatiser la génération, le test et le déploiement de votre code sur Microsoft Azure,
Google Cloud Platform, ou Amazon Web Services (AWS).
Google Play
Google Play est le magasin d’applications officiel pour le système d’exploitation
Android. Les utilisateurs peuvent le parcourir et télécharger des applications
développées pour les appareils Android, qui sont publiées via Google.
Intune
Microsoft Intune est un service cloud dans l’espace de gestion de la mobilité
d’entreprise, qui peut améliorer la productivité de vos employés, tout en protégeant les
données de votre entreprise. Avec Intune, vous pouvez effectuer les opérations
suivantes :
Gérer les appareils mobiles et PC que vos employés utilisent pour accéder aux
données d’entreprise.
Gérer les applications mobiles que vos employés utilisent.
Protéger les informations de votre entreprise grâce au contrôle de la manière dont
vos employés y accèdent et les partagent.
Vérifier que les appareils et applications sont conformes aux exigences de sécurité
de l’entreprise.
Déployer des mises à jour directement sur les
appareils des utilisateurs
CodePush
Le service CodePush dans App Center permet aux développeurs Apache Cordova et
React Native de déployer des mises à jour d’applications mobiles directement sur les
appareils de leurs utilisateurs. Il fait office de référentiel central sur lequel les
développeurs peuvent publier certaines mises à jour telles que JavaScript, HTML, CSS
ainsi que des modifications d’image. Les applications peuvent ensuite rechercher des
mises à jour dans le référentiel à l’aide de kits de développement logiciel (SDK) clients
fournis. De cette façon, vous pouvez avoir un modèle d’engagement plus déterministe
et direct avec vos utilisateurs, tandis que vous résolvez des bogues ou ajoutez des
fonctionnalités mineures. Vous n’êtes pas obligé de régénérer ou redistribuer un fichier
binaire via des magasins d’applications publics.
Plus vous explorerez les données, plus vous serez en mesure de trouver des moyens
d'améliorer votre application et de satisfaire vos utilisateurs. Il est important d'utiliser les
données pour trouver des insights exploitables et maintenir la satisfaction des
utilisateurs.
Importance de l'analyse
Étudiez vos utilisateurs, la façon dont ils interagissent avec votre application et ce
qui les attire, de manière à pouvoir affiner votre application et fournir de superbes
expériences pour développer votre activité.
Suivez vos métriques d'utilisation pour prendre des décisions avisées sur la façon
de commercialiser votre application et de mieux servir vos clients.
Mesurez les performances de votre application.
Découvrez quelles parties de votre application génèrent de la valeur et accroissent
les performances.
Bénéficiez d'insights axés sur les données sur les aspects liés à la conservation et à
l'attrition clients.
Utilisez les services suivants pour activer l’analyse des applications mobiles.
Azure Monitor
Azure Monitor inclut Application Insights, qui fournit des outils permettant de recueillir
et d'analyser des données de télémétrie afin d'optimiser les performances et de
superviser votre application mobile. Vous pouvez tirer parti d'Application Insights en
utilisant les données d'analyse de l'App Center pour configurer l'exportation vers
Application Insights. Application Insights peut interroger, segmenter, filtrer et analyser
les données de télémétrie des événements personnalisés à partir de vos applications,
au-delà des outils d'analyse fournis par App Center.
Azure PlayFab
Azure PlayFab offre une plateforme back-end complète avec des services de jeu, des
analyses en temps réel et les LiveOps dont vous avez besoin pour créer des jeux de
premier ordre connectés au cloud. Ces services réduisent les obstacles au lancement
pour les développeurs de jeux. Ils offrent aux grands comme aux petits studios des
solutions de développement rentables qui évoluent avec leurs jeux. Ces services peuvent
aider les studios à attirer des joueurs, à les fidéliser et à les faire payer. PlayFab permet
aux développeurs d'utiliser le cloud intelligent pour créer et exploiter des jeux, analyser
des données de jeu et améliorer l'expérience de jeu globale.
Une fois que votre application est utilisée par des milliers d’utilisateurs, elle peut
présenter des bogues. Vos utilisateurs peuvent se retrouver face à des défaillances
d’application inattendues. L’utilisateur, lui, ne veut qu’une chose : une application qui
fonctionne de manière fiable. Les applications sujettes aux bogues et aux défaillances
n’offrent pas une bonne expérience utilisateur. Les utilisateurs déçus désinstallent
l’application, font des commentaires peu élogieux ou critiquent et se plaignent de leur
expérience en public.
connaître les détails sur l’intégrité de votre application et la façon dont elle
fonctionne pour les utilisateurs ;
rechercher la cause racine et les raisons de la défaillance survenue sur l’appareil
d’un utilisateur ;
être proactif pour trier les problèmes et résoudre les défaillances afin de rendre
votre application stable ;
créer de meilleures applications et itérer plus rapidement pour offrir une
expérience utilisateur exceptionnelle afin que les utilisateurs continuent d’utiliser
votre application ;
tirer parti du service suivant pour superviser votre application en cas de défaillance,
diagnostiquer les problèmes et les résoudre rapidement pour offrir une expérience
d’application mobile stable et de haute qualité.
Visual Studio App Center
Le service App Center Diagnostics vous aide à superviser l’intégrité de votre application.
Il fournit des insights détaillés pour vous permettre de comprendre ce qui s’est passé et
la raison de l’échec de l’application. App Center Diagnostics vous aide également à
hiérarchiser et à gérer les rapports d’échec.
Que vous génériez des applications grand public ou professionnelles, vous souhaitez
que les utilisateurs puissent utiliser activement votre application. Il vous arrive souvent
de vouloir partager de nouvelles infos, des mises à jour de jeux, des offres intéressantes,
des mises à jour de produits ou toute autre information pertinente avec vos utilisateurs.
Pour améliorer la collaboration avec vos utilisateurs et qu’ils continuent d’utiliser votre
application, vous avez besoin d’un moyen de communiquer avec eux en temps réel.
Les notifications Push offrent un moyen rapide et efficace de communiquer avec les
utilisateurs de vos applications. Vous pouvez contacter les utilisateurs au bon moment et
leur faire parvenir les informations souhaitées, généralement dans une fenêtre
contextuelle ou une boîte de dialogue sur un appareil mobile, indépendamment de ce
qu’ils sont en train de faire.
Utilisez les services suivants pour activer les notifications Push dans vos applications
mobiles.
Télécharger l’exemple
Dans ce tutoriel, vous allez utiliser Azure Notification Hubs pour envoyer des
notifications Push à une application [Link] ciblant Android et iOS.
Une API web [Link] Core back-end est utilisée pour gérer l’inscription d’appareils
pour le client à l’aide de l’approche d’installation la plus récente et la plus appropriée. Le
service envoie également des notifications Push en mode multiplateforme.
Ces opérations sont gérées à l’aide du SDK Notification Hubs pour les opérations back-
end . Vous trouverez plus d’informations sur l’approche globale dans la documentation
sur l’inscription à partir de votre back-end d’application.
Prérequis
Pour suivre ce tutoriel, vous avez besoin des éléments suivants :
7 Notes
Vous pouvez effectuer les étapes de cet exemple sans expérience préalable. Toutefois,
une connaissance des éléments suivants vous sera utile :
) Important
Les étapes fournies sont propres à Visual Studio pour Mac . Il est possible de
suivre en utilisant Visual Studio 2019 mais il peut y avoir des différences. Par
exemple, les descriptions de l’interface utilisateur et des workflows, les noms de
modèles, la configuration de l’environnement, etc.
7 Notes
Un nom unique sera généré pour vous. Par défaut, il s’agit d’une variante en
minuscules du nom que vous avez fourni plus un nombre généré, séparés par
un tiret. Vous pouvez le changer si vous voulez, du moment qu’il reste unique
au niveau global.
2. Une fois le projet créé, sélectionnez Add Firebase to your Android app (Ajouter
Firebase à votre application Android).
3. Dans la page Add Firebase to your Android app (Ajouter Firebase à votre
application Android), effectuez les étapes suivantes :
a. Pour Android package name (Nom du package Android), entrez un nom pour
votre package. Par exemple : com.<organization_identifier>.<package_name> .
b. Sélectionnez Inscrire une application.
7 Notes
3. Mettez à jour les trois valeurs suivantes pour votre nouvelle application, puis
sélectionnez Continue :
L’ID de votre application est généré et vous êtes invité à confirmer les
informations. Sélectionnez Continue (Continuer), puis Register (Inscrire) pour
confirmer le nouvel ID d’application.
2. Création d’un certificat p8 qui peut être utilisé pour l’authentification basée sur un
jeton (l’approche la plus récente et recommandée)
OPTION 1 : Création d’un certificat Push p12 qui peut être chargé
directement sur le hub de notification
1. Sur votre Mac, exécutez l’outil Trousseaux d’accès. Vous pouvez l’ouvrir à partir du
dossier Utilitaires ou du dossier Autre sur Launchpad.
7 Notes
7 Notes
7 Notes
Par défaut, le certificat de développement téléchargé se nomme
aps_development.cer.
7 Notes
Bien que le nom de votre certificat puisse être différent, il portera le préfixe
Apple Development iOS Push Notification Services et se verra associer
l’identificateur de bundle approprié.
10. Dans Trousseau d’accès, utilisez Ctrl + clic sur le certificat push que vous avez créé
dans la catégorie Certificats. Sélectionnez Exporter, nommez le fichier,
sélectionnez le format p12, puis sélectionnez Enregistrer.
Vous pouvez choisir de protéger le certificat par un mot de passe, mais ce dernier
est facultatif. Cliquez sur OK si vous souhaitez ignorer l’étape de création du mot
de passe. Notez le nom du fichier et l’emplacement du certificat p12 exporté. Ces
informations sont nécessaires pour activer l’authentification avec APNs.
7 Notes
7 Notes
Si vous disposez déjà d’une clé configurée pour APNS, vous pouvez réutiliser
le certificat p8 que vous avez téléchargé juste après l’avoir créée. Dans ce cas,
vous pouvez ignorer les étapes 3 à 5.
3. Cliquez sur le bouton + (ou sur le bouton Créer une clé) pour créer une clé.
4. Fournissez une valeur appropriée pour Nom de clé, activez l’option Apple Push
Notification Service (APNS) , puis cliquez sur Continuer, puis sur Inscrire dans
l’écran suivant.
5. Cliquez sur Télécharger, puis déplacez le fichier p8 (préfixé avec AuthKey_ ) vers un
répertoire local sécurisé, puis cliquez sur Terminé.
7 Notes
6. Dans Clés, cliquez sur la clé que vous avez créée (ou une clé existante si vous avez
choisi de l’utiliser à la place).
8. Ouvrez votre certificat .p8 dans l’application appropriée de votre choix, par
exemple Visual Studio Code . Notez la valeur de la clé (comprise entre -----
BEGIN PRIVATE KEY----- et -----END PRIVATE KEY----- ).
7 Notes
À la fin de ces étapes, vous devez disposer des informations suivantes, dont vous vous
servirez dans Configurer votre hub de notification avec des informations APNS :
3. Ensuite, dans la liste déroulante App ID, sélectionnez l’ID d’application que vous
avez créé, puis sélectionnez Continue.
7 Notes
Ce certificat n’est pas le certificat Push que vous avez créé à l’étape
précédente. Il s’agit de votre certificat de développement. S’il n’en existe pas,
vous devez le créer, car il s’agit d’un prérequis pour ce tutoriel. Vous pouvez
créer des certificats de développeur dans le portail des développeurs
Apple , par le biais de Xcode ou dans Visual Studio.
8. Pour finir, choisissez un nom pour le profil dans Provisioning Profile Name (Nom
du profil de provisionnement), puis sélectionnez Generate (Générer).
1. Connectez-vous à Azure .
2. Cliquez sur Créer une ressource, recherchez et choisissez Hub de notification, puis
cliquez sur Créer.
7 Notes
7 Notes
4. Une fois que le hub de notifications a été provisionné, accédez à cette ressource.
7. Notez les valeurs de Nom de la stratégie ainsi que les valeurs de Chaîne de
connexion correspondantes.
7 Notes
Utilisez uniquement le mode Production ou Application si vous souhaitez envoyer
des notifications Push aux utilisateurs ayant acheté votre application dans le Store.
6. Sélectionnez Enregistrer.
ID de clé
ID de bundle
ID de l’équipe
Jeton
4. Sélectionnez Enregistrer.
3. Dans la boîte de dialogue Configurer votre nouvelle API web [Link] Core,
sélectionnez .NET Core 3.1 comme Framework cible.
7 Notes
a. Cliquez sur Oui pour accepter d’exécuter l’outil « dotnet dev-certs https »
afin de résoudre ce problème. L’outil « dotnet dev-certs https » vous invite
ensuite à entrer un mot de passe pour le certificat et le mot de passe pour
votre trousseau.
7. Supprimez [Link].
8. Configurez les valeurs de configuration locales à l’aide de l’outil Secret Manager.
Le découplage des secrets de la solution garantit qu’ils ne se trouvent pas dans le
contrôle de code source. Ouvrez Terminal, puis accédez au répertoire du fichier
projet et exécutez les commandes suivantes :
Bash
Remplacez les valeurs d’espace réservé par vos propres valeurs de nom de hub de
notification et de chaîne de connexion. Vous les avez notées dans la section Créer
un hub de notification. Sinon, vous pouvez les rechercher dans Azure .
NotificationHub:Name :
Consultez Nom dans le résumé Bases en haut de Vue d’ensemble.
NotificationHub:ConnectionString :
Consultez DefaultFullSharedAccessSignature dans Stratégies d’accès.
7 Notes
Pour les scénarios de production, vous pouvez envisager des options telles
qu’Azure KeyVault pour stocker la chaîne de connexion de manière
sécurisée. Par souci de simplicité, les secrets sont ajoutés aux paramètres
d’application d’Azure App Service .
Bash
7 Notes
Vous devez remplacer la valeur d’espace réservé par la vôtre et en prendre
note.
2. Utilisez Ctrl + clic sur le projet PushDemoApi, choisissez Nouveau dossier dans le
menu Ajouter, puis cliquez sur Ajouter en utilisant Authentication comme Nom de
dossier.
3. Utilisez Ctrl + clic sur le dossier Authentication, puis choisissez Nouveau fichier
dans le menu Ajouter.
C#
using [Link];
namespace [Link]
{
public class ApiKeyAuthOptions : AuthenticationSchemeOptions
{
public const string DefaultScheme = "ApiKey";
public string Scheme => DefaultScheme;
public string ApiKey { get; set; }
}
}
C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class ApiKeyAuthHandler :
AuthenticationHandler<ApiKeyAuthOptions>
{
const string ApiKeyIdentifier = "apikey";
public ApiKeyAuthHandler(
IOptionsMonitor<ApiKeyAuthOptions> options,
ILoggerFactory logger,
UrlEncoder encoder,
ISystemClock clock)
: base(options, logger, encoder, clock) {}
if ([Link][ApiKeyIdentifier].Any())
{
key =
[Link][ApiKeyIdentifier].FirstOrDefault();
}
else if ([Link](ApiKeyIdentifier))
{
if ([Link](ApiKeyIdentifier, out var
queryKey))
key = queryKey;
}
if ([Link](key))
return [Link]([Link]("No api
key provided"));
if ()
return [Link]([Link]("Invalid
api key."));
return [Link]([Link](ticket));
}
}
}
7 Notes
C#
using System;
using [Link];
namespace [Link]
{
public static class AuthenticationBuilderExtensions
{
public static AuthenticationBuilder AddApiKeyAuth(
this AuthenticationBuilder builder,
Action<ApiKeyAuthOptions> configureOptions)
{
return builder
.AddScheme<ApiKeyAuthOptions, ApiKeyAuthHandler>(
[Link],
configureOptions);
}
}
}
7 Notes
C#
using [Link];
using [Link];
using [Link];
[Link](options =>
{
[Link] =
[Link];
[Link] =
[Link];
}).AddApiKeyAuth([Link]("Authentication").Bind);
}
8. Toujours dans [Link], mettez à jour la méthode Configure pour appeler les
méthodes d’extension UseAuthentication et UseAuthorization sur
l’IApplicationBuilder de l’application. Assurez-vous que ces méthodes sont
appelées après UseRouting et avant [Link].
C#
[Link]();
[Link]();
[Link]();
[Link]();
[Link](endpoints =>
{
[Link]();
});
}
7 Notes
1. Utilisez Ctrl + clic sur le dossier Dependencies, puis choisissez Gérer les packages
NuGet... .
3. Cliquez sur Ajouter des packages, puis cliquez sur Accepter quand vous êtes invité
à accepter les termes du contrat de licence.
4. Utilisez Ctrl + clic sur le projet PushDemoApi, choisissez Nouveau dossier dans le
menu Ajouter, puis cliquez sur Ajouter en utilisant Models comme Nom de
dossier.
5. Utilisez Ctrl + clic sur le dossier Models, puis choisissez Nouveau fichier dans le
menu Ajouter.
C#
namespace [Link]
{
public class PushTemplates
{
public class Generic
{
public const string Android = "{ \"notification\": {
\"title\" : \"PushDemo\", \"body\" : \"$(alertMessage)\"}, \"data\" : {
\"action\" : \"$(alertAction)\" } }";
public const string iOS = "{ \"aps\" : {\"alert\" :
\"$(alertMessage)\"}, \"action\" : \"$(alertAction)\" }";
}
7 Notes
Cette classe contient les charges utiles de notification sous forme de jetons
pour les notifications génériques et silencieuses requises par ce scénario. Les
charges utiles sont définies en dehors de l’installation pour permettre
l’expérimentation sans avoir à mettre à jour les installations existantes via le
service. La gestion des modifications apportées aux installations de cette
façon n’entre pas dans le cadre de ce tutoriel. Pour la production, envisagez
des modèles personnalisés.
7. Ajoutez une autre Classe vide au dossier Models appelée [Link], puis
ajoutez l’implémentation suivante.
C#
using [Link];
using [Link];
namespace [Link]
{
public class DeviceInstallation
{
[Required]
public string InstallationId { get; set; }
[Required]
public string Platform { get; set; }
[Required]
public string PushChannel { get; set; }
C#
using System;
namespace [Link]
{
public class NotificationRequest
{
public string Text { get; set; }
public string Action { get; set; }
public string[] Tags { get; set; } = [Link]<string>();
public bool Silent { get; set; }
}
}
C#
using [Link];
namespace [Link]
{
public class NotificationHubOptions
{
[Required]
public string Name { get; set; }
[Required]
public string ConnectionString { get; set; }
}
}
11. Ajoutez une Interface vide au dossier Services appelée [Link], puis
ajoutez l’implémentation suivante.
C#
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public interface INotificationService
{
Task<bool> CreateOrUpdateInstallationAsync(DeviceInstallation
deviceInstallation, CancellationToken token);
Task<bool> DeleteInstallationByIdAsync(string installationId,
CancellationToken token);
Task<bool> RequestNotificationAsync(NotificationRequest
notificationRequest, CancellationToken token);
}
}
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class NotificationHubService : INotificationService
{
readonly NotificationHubClient _hub;
readonly Dictionary<string, NotificationPlatform>
_installationPlatform;
readonly ILogger<NotificationHubService> _logger;
public NotificationHubService(IOptions<NotificationHubOptions>
options, ILogger<NotificationHubService> logger)
{
_logger = logger;
_hub =
[Link](
[Link],
[Link]);
[Link](deviceInstallation?.PushChannel))
return false;
if
(_installationPlatform.TryGetValue([Link], out var
platform))
[Link] = platform;
else
return false;
try
{
await
_hub.CreateOrUpdateInstallationAsync(installation, token);
}
catch
{
return false;
}
return true;
}
try
{
await _hub.DeleteInstallationAsync(installationId,
token);
}
catch
{
return false;
}
return true;
}
try
{
if ([Link] == 0)
{
// This will broadcast to all users registered in
the notification hub
await
SendPlatformNotificationsAsync(androidPayload, iOSPayload, token);
}
else if ([Link] <= 20)
{
await
SendPlatformNotificationsAsync(androidPayload, iOSPayload,
[Link], token);
}
else
{
var notificationTasks = [Link]
.Select((value, index) => (value, index))
.GroupBy(g => [Link] / 20, i => [Link])
.Select(tags =>
SendPlatformNotificationsAsync(androidPayload, iOSPayload, tags,
token));
await [Link](notificationTasks);
}
return true;
}
catch (Exception e)
{
_logger.LogError(e, "Unexpected error sending
notification");
return false;
}
}
return [Link](sendTasks);
}
return [Link](sendTasks);
}
}
}
7 Notes
C#
using [Link];
using [Link];
[Link]<INotificationService, NotificationHubService>
();
[Link]<NotificationHubOptions>()
.Configure([Link]("NotificationHub").Bind)
.ValidateDataAnnotations();
}
7 Notes
C#
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
4. Mettez à jour le contrôleur basé sur un modèle pour le faire dériver de
ControllerBase et le décorer avec l’attribut ApiController.
C#
[ApiController]
[Route("api/[controller]")]
public class NotificationsController : ControllerBase
{
// Templated methods here
}
7 Notes
La classe de base Controller prend en charge les vues, mais cela n’est pas
nécessaire dans ce cas et controllerBase peut donc être utilisé à la place. Si
vous utilisez Visual Studio 2019 , vous pouvez ignorer cette étape.
5. Si vous avez choisi d’effectuer la section Authentifier les clients à l’aide d’une clé
API, vous devez décorer NotificationsController avec l’attribut Authorize
également.
C#
[Authorize]
C#
public NotificationsController(INotificationService
notificationService)
{
_notificationService = notificationService;
}
l’attribut RegistrationsControllerRoute .
8. Démarrer le débogage (commande + Entrée) pour vérifier que l’application utilise
le nouveau NotificationsController et retourne un état 401 Non autorisé.
7 Notes
9. Sous un nouvel onglet Postman , définissez la demande sur GET. Entrez l’adresse
ci-dessous en remplaçant l’espace réservé <applicationUrl> par l’applicationUrl
https trouvée dans Propriétés>[Link].
Bash
<applicationUrl>/api/notifications
7 Notes
10. Si vous avez choisi d’effectuer la section Authentifier les clients à l’aide d’une clé
API, veillez à configurer les en-têtes de demande pour inclure votre valeur apikey.
Clé Valeur
apikey <your_api_key>
7 Notes
C#
[HttpPut]
[Route("installations")]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
public async Task<IActionResult> UpdateInstallation(
[Required]DeviceInstallation deviceInstallation)
{
var success = await _notificationService
.CreateOrUpdateInstallationAsync(deviceInstallation,
[Link]);
if (!success)
return new UnprocessableEntityResult();
[HttpDelete()]
[Route("installations/{installationId}")]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
public async Task<ActionResult> DeleteInstallation(
[Required][FromRoute]string installationId)
{
var success = await _notificationService
.DeleteInstallationByIdAsync(installationId,
[Link]);
if (!success)
return new UnprocessableEntityResult();
[HttpPost]
[Route("requests")]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
public async Task<IActionResult> RequestPush(
[Required]NotificationRequest notificationRequest)
{
if (([Link] &&
[Link](notificationRequest?.Action)) ||
(![Link] &&
[Link](notificationRequest?.Text)))
return new BadRequestResult();
var success = await _notificationService
.RequestNotificationAsync(notificationRequest,
[Link]);
if (!success)
return new UnprocessableEntityResult();
2. Cliquez sur Créer une ressource, recherchez et choisissez Application API, puis
cliquez sur Créer.
Nom de l’application :
entrez un nom global unique pour l’application API.
Abonnement :
Choisissez l’Abonnement cible dans lequel vous avez créé le hub de notification.
Groupe de ressources :
Choisissez le Groupe de ressources cible dans lequel vous avez créé le hub de
notification.
7 Notes
Application Insights :
Conservez l’option suggérée (une nouvelle ressource sera créée avec ce nom) ou
choisissez une ressource existante.
4. Une fois l’application API provisionnée, accédez à cette ressource.
5. Notez la propriété URL dans le résumé Bases en haut de la Vue d’ensemble. Cette
URL représente le point de terminaison back-end qui sera utilisé plus loin dans ce
tutoriel.
7 Notes
Nom Valeur
Authentication:ApiKey <api_key_value>
NotificationHub:Name <hub_name_value>
NotificationHub:ConnectionString <hub_connection_string_value>
7 Notes
Ce sont les mêmes paramètres que ceux que vous avez définis dans les
paramètres utilisateur. Vous devez être en mesure de les reprendre. Le
paramètre Authentication:ApiKey est uniquement obligatoire si vous avez
choisi d’effectuer la section Authentifier les clients à l’aide d’une clé API.
Pour les scénarios de production, vous pouvez envisager des options telles
qu’Azure KeyVault . Ceux-ci ont été ajoutés en tant que paramètres
d’application pour des raisons de simplicité dans ce cas.
8. Une fois tous les paramètres d’application ajoutés, cliquez sur Enregistrer, puis
Continuer.
Les étapes suivantes sont spécifiques à Visual Studio pour Mac . Si vous utilisez
Visual Studio 2019 sur Windows, le flux de publication sera différent. Consultez
Publier sur Azure App Service sur Windows.
2. Utilisez Ctrl + Clic sur le projet PushDemoApi, puis choisissez Publier sur Azure...
dans le menu Publier.
4. Sélectionnez l’application API Azure App Service que vous avez créée dans la liste
comme cible de publication, puis cliquez sur Publier.
Après en avoir terminé avec l’Assistant, il publie l’application dans Azure, puis ouvre
l’application. Prenez note de l’URL si ce n’est déjà fait. Cette URL représente le point de
terminaison back-end qui est utilisé plus loin dans ce tutoriel.
C#
[Link]
7 Notes
2. Si vous avez choisi d’effectuer la section Authentifier les clients à l’aide d’une clé
API, veillez à configurer les en-têtes de demande pour inclure votre valeur apikey.
Clé Valeur
apikey <your_api_key>
3. Choisissez l’option raw (brut) pour Body (Corps), choisissez JSON dans la liste des
options de format, puis incluez du contenu JSON d’espace réservé :
JSON
{}
7 Notes
Bash
[Link]
7 Notes
Il n’est pas encore possible de tester l’API à l’aide de données de demande valides,
car cela nécessite des informations propres à la plateforme de la part de
l’application mobile cliente.
Elle vous permet de vous inscrire auprès d’un hub de notification et de vous en
désinscrire par le biais du service back-end que vous avez créé.
Une alerte s’affiche quand une action est spécifiée et que l’application est au premier
plan. Sinon, les notifications s’affichent dans le centre de notifications.
7 Notes
En général, vous effectuez les actions d’inscription (et de désinscription) au
moment approprié durant le cycle de vie de l’application (ou éventuellement dans
le cadre de votre première expérience d’exécution) sans entrées d’inscription ou de
désinscription explicites de la part de l’utilisateur. Toutefois, cet exemple demande
une entrée utilisateur explicite pour faciliter l’exploration et le test de cette
fonctionnalité.
7 Notes
2. Utilisez Ctrl + clic sur la solution PushDemo, puis choisissez Mettre à jour les
paquets NuGet.
3. Utilisez Ctrl + clic sur la solution PushDemo, puis choisissez Gérer les packages
NuGet... .
5. Cliquez sur Ajouter des packages, puis cliquez sur Accepter quand vous êtes invité
à accepter les termes du contrat de licence.
2. Utilisez Ctrl + clic sur le dossier Models, puis choisissez Nouveau fichier dans le
menu Ajouter.
3. Sélectionnez Général>Classe vide, entrez [Link], puis ajoutez
l’implémentation suivante.
C#
using [Link];
using [Link];
namespace [Link]
{
public class DeviceInstallation
{
[JsonProperty("installationId")]
public string InstallationId { get; set; }
[JsonProperty("platform")]
public string Platform { get; set; }
[JsonProperty("pushChannel")]
public string PushChannel { get; set; }
[JsonProperty("tags")]
public List<string> Tags { get; set; } = new List<string>();
}
}
C#
namespace [Link]
{
public enum PushDemoAction
{
ActionA,
ActionB
}
}
5. Ajoutez un nouveau dossier au projet PushDemo appelé Services, puis ajoutez une
Classe vide à ce dossier appelée [Link] avec l’implémentation
suivante.
C#
using System;
using [Link];
namespace [Link]
{
public static class ServiceContainer
{
static readonly Dictionary<Type, Lazy<object>> services
= new Dictionary<Type, Lazy<object>>();
7 Notes
C#
using [Link];
namespace [Link]
{
public interface IDeviceInstallationService
{
string Token { get; set; }
bool NotificationsSupported { get; }
string GetDeviceId();
DeviceInstallation GetDeviceInstallation(params string[] tags);
}
}
7 Notes
C#
using [Link];
namespace [Link]
{
public interface INotificationRegistrationService
{
Task DeregisterDeviceAsync();
Task RegisterDeviceAsync(params string[] tags);
Task RefreshRegistrationAsync();
}
}
7 Notes
C#
namespace [Link]
{
public interface INotificationActionService
{
void TriggerAction(string action);
}
}
7 Notes
C#
using System;
using [Link];
namespace [Link]
{
public interface IPushDemoNotificationActionService :
INotificationActionService
{
event EventHandler<PushDemoAction> ActionTriggered;
}
}
7 Notes
C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class NotificationRegistrationService :
INotificationRegistrationService
{
const string RequestUrl = "api/notifications/installations";
const string CachedDeviceTokenKey = "cached_device_token";
const string CachedTagsKey = "cached_tags";
string _baseApiUrl;
HttpClient _client;
IDeviceInstallationService _deviceInstallationService;
_baseApiUrl = baseApiUri;
}
IDeviceInstallationService DeviceInstallationService
=> _deviceInstallationService ??
(_deviceInstallationService =
[Link]<IDeviceInstallationService>());
if (cachedToken == null)
return;
if ([Link](deviceId))
throw new Exception("Unable to resolve an ID for the
device.");
[Link](CachedDeviceTokenKey);
[Link](CachedTagsKey);
}
await SendAsync<DeviceInstallation>([Link],
RequestUrl, deviceInstallation)
.ConfigureAwait(false);
await [Link](CachedDeviceTokenKey,
[Link])
.ConfigureAwait(false);
await [Link](CachedTagsKey,
[Link](tags));
}
if ([Link](cachedToken) ||
[Link](serializedTags) ||
[Link]([Link]) ||
cachedToken == [Link])
return;
await RegisterDeviceAsync(tags);
}
if (jsonRequest != null)
[Link] = new StringContent(jsonRequest,
Encoding.UTF8, "application/json");
7 Notes
C#
using System;
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class PushDemoNotificationActionService :
IPushDemoNotificationActionService
{
readonly Dictionary<string, PushDemoAction> _actionMappings =
new Dictionary<string, PushDemoAction>
{
{ "action_a", [Link] },
{ "action_b", [Link] }
};
if ([Link]())
throw new AggregateException(exceptions);
}
}
}
12. Ajoutez au projet PushDemo une Classe vide appelée [Link] avec
l’implémentation suivante.
C#
namespace PushDemo
{
public static partial class Config
{
public static string ApiKey = "API_KEY";
public static string BackendServiceEndpoint =
"BACKEND_SERVICE_ENDPOINT";
}
}
7 Notes
13. Ajoutez au projet PushDemo une autre Classe vide appelée Config.local_secrets.cs
avec l’implémentation suivante.
C#
namespace PushDemo
{
public static partial class Config
{
static Config()
{
ApiKey = "<your_api_key>";
BackendServiceEndpoint = "<your_api_app_url>";
}
}
}
7 Notes
Remplacez les valeurs d’espace réservé par vos propres valeurs. Vous devez en
avoir pris note quand vous avez créé le service back-end. L’URL de
l’application API doit être [Link] .
N’oubliez pas d’ajouter *.local_secrets.* à votre fichier gitignore pour éviter
de valider ce fichier.
14. Ajoutez au projet PushDemo une Classe vide appelée [Link] avec
l’implémentation suivante.
C#
using System;
using [Link];
namespace PushDemo
{
public static class Bootstrap
{
public static void Begin(Func<IDeviceInstallationService>
deviceInstallationService)
{
[Link](deviceInstallationService);
[Link]<IPushDemoNotificationActionService>(()
=> new PushDemoNotificationActionService());
[Link]<INotificationRegistrationService>
(()
=> new NotificationRegistrationService(
[Link],
[Link]));
}
}
}
7 Notes
XML
<StackLayout VerticalOptions="EndAndExpand"
HorizontalOptions="FillAndExpand"
Padding="20,40">
<Button x:Name="RegisterButton"
Text="Register"
Clicked="RegisterButtonClicked" />
<Button x:Name="DeregisterButton"
Text="Deregister"
Clicked="DeregisterButtonClicked" />
</StackLayout>
C#
readonly INotificationRegistrationService
_notificationRegistrationService;
C#
public MainPage()
{
InitializeComponent();
_notificationRegistrationService =
[Link]<INotificationRegistrationService>();
}
C#
5. Maintenant, dans [Link], vérifiez que les espaces de noms suivants sont
référencés.
C#
using [Link];
using [Link];
using [Link];
using [Link];
C#
public App()
{
InitializeComponent();
[Link]<IPushDemoNotificationActionService>()
.ActionTriggered += NotificationActionTriggered;
7 Notes
3. Définissez la Version Android minimale sur Android 8.0 (niveau d’API 26) et la
Version cible d’Android sur le dernier niveau d’API.
7 Notes
Seuls les appareils qui exécutent les niveaux d’API 26 et supérieurs sont pris
en charge dans le cadre de ce tutoriel, mais vous pouvez l’étendre pour
prendre en charge les appareils exécutant des versions antérieures.
5. Cliquez sur OK
4. Cliquez sur Ajouter des packages, puis cliquez sur Accepter quand vous êtes invité
à accepter les termes du contrat de licence.
2. Utilisez Ctrl + clic sur le dossier Services, puis choisissez Nouveau fichier dans le
menu Ajouter.
C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using static [Link];
namespace [Link]
{
public class DeviceInstallationService : IDeviceInstallationService
{
public string Token { get; set; }
if ([Link](Token))
throw new Exception("Unable to resolve token for FCM");
[Link](tags);
return installation;
}
string GetPlayServicesError()
{
int resultCode =
[Link](Applicatio
[Link]);
if (resultCode != [Link])
return
[Link](resultCode) ?
[Link](resultCode) :
"This device is not supported";
7 Notes
C#
using [Link];
using [Link];
using [Link];
using [Link];
namespace [Link]
{
[Service]
[IntentFilter(new[] { "[Link].MESSAGING_EVENT" })]
public class PushNotificationFirebaseMessagingService :
FirebaseMessagingService
{
IPushDemoNotificationActionService _notificationActionService;
INotificationRegistrationService
_notificationRegistrationService;
IDeviceInstallationService _deviceInstallationService;
IPushDemoNotificationActionService NotificationActionService
=> _notificationActionService ??
(_notificationActionService =
[Link]<IPushDemoNotificationActionService>());
INotificationRegistrationService
NotificationRegistrationService
=> _notificationRegistrationService ??
(_notificationRegistrationService =
[Link]<INotificationRegistrationService>());
IDeviceInstallationService DeviceInstallationService
=> _deviceInstallationService ??
(_deviceInstallationService =
[Link]<IDeviceInstallationService>
());
[Link]()
.ContinueWith((task) => { if ([Link]) throw
[Link]; });
}
5. Dans [Link], vérifiez que les espaces de noms suivants ont été ajoutés au
début du fichier.
C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
C#
[Activity(
Label = "PushDemo",
LaunchMode = [Link],
Icon = "@mipmap/icon",
Theme = "@style/MainTheme",
MainLauncher = true,
ConfigurationChanges = [Link] |
[Link])]
C#
IPushDemoNotificationActionService _notificationActionService;
IDeviceInstallationService _deviceInstallationService;
IPushDemoNotificationActionService NotificationActionService
=> _notificationActionService ??
(_notificationActionService =
[Link]<IPushDemoNotificationActionService>
());
IDeviceInstallationService DeviceInstallationService
=> _deviceInstallationService ??
(_deviceInstallationService =
[Link]<IDeviceInstallationService>());
C#
[Link]("getToken").Invoke(result).ToString();
}
C#
if ()
[Link](action);
}
}
catch (Exception ex)
{
[Link]([Link]);
}
}
C#
7 Notes
Dans la mesure où LaunchMode pour Activity est défini sur SingleTop, une
intention (Intent) sera envoyée à l’instance Activity par le biais de la méthode
OnNewIntent, plutôt que de la méthode OnCreate. Vous devez donc gérer
une intention entrante dans les méthodes OnCreate et OnNewIntent.
11. Mettez à jour la méthode OnCreate pour appeler [Link] juste après
l’appel à [Link] en passant l’implémentation de IDeviceInstallationService
propre à la plateforme.
C#
C#
if ([Link])
{
[Link]([Link])
.GetInstanceId()
.AddOnSuccessListener(this);
}
C#
...
LoadApplication(new App());
ProcessNotificationActions(Intent);
7 Notes
Pour continuer à recevoir des notifications Push, vous devez réinscrire l’application
chaque fois que vous l’exécutez et l’arrêtez à partir d’une session de débogage.
Configurer le projet iOS natif pour les
notifications Push
7 Notes
Seuls les appareils qui exécutent iOS 13.0 ou une version ultérieure sont pris
en charge dans ce tutoriel, mais vous pouvez l’étendre pour prendre en
charge les appareils exécutant des versions antérieures.
5. Dans Options du projet, sous Créer la > signature de bundle iOS, vérifiez que
votre compte de développeur est sélectionné sous Équipe. Vérifiez ensuite que
l’option « Automatically manage signing » (Gérer automatiquement la signature)
est activée et que votre certificat de signature et votre profil de provisionnement
ont été automatiquement sélectionnés.
7 Notes
2. Utilisez Ctrl + clic sur le dossier Services, puis choisissez Nouveau fichier... dans le
menu Ajouter.
C#
using System;
using [Link];
using [Link];
using UIKit;
namespace [Link]
{
public class DeviceInstallationService : IDeviceInstallationService
{
const int SupportedVersionMajor = 13;
const int SupportedVersionMinor = 0;
if ([Link](Token))
throw new Exception("Unable to resolve token for
APNS");
var installation = new DeviceInstallation
{
InstallationId = GetDeviceId(),
Platform = "apns",
PushChannel = Token
};
[Link](tags);
return installation;
}
string GetNotificationsSupportError()
{
if (!NotificationsSupported)
return $"This app only supports notifications on iOS
{SupportedVersionMajor}.{SupportedVersionMinor} and above. You are
running {[Link]}.";
if (Token == null)
return $"This app can support notifications but you
must enable this in your settings.";
7 Notes
C#
using [Link];
using Foundation;
namespace [Link]
{
internal static class NSDataExtensions
{
internal static string ToHexString(this NSData data)
{
var bytes = [Link]();
if (bytes == null)
return null;
return [Link]().ToUpperInvariant();
}
}
}
5. Dans [Link], vérifiez que les espaces de noms suivants ont été ajoutés au
début du fichier.
C#
using System;
using [Link];
using [Link];
using Foundation;
using [Link];
using [Link];
using [Link];
using UIKit;
using UserNotifications;
using [Link];
6. Ajoutez les propriétés privées et leurs champs de stockage respectifs pour stocker
une référence aux implémentations IPushDemoNotificationActionService,
INotificationRegistrationService et IDeviceInstallationService.
C#
IPushDemoNotificationActionService _notificationActionService;
INotificationRegistrationService _notificationRegistrationService;
IDeviceInstallationService _deviceInstallationService;
IPushDemoNotificationActionService NotificationActionService
=> _notificationActionService ??
(_notificationActionService =
[Link]<IPushDemoNotificationActionService>
());
INotificationRegistrationService NotificationRegistrationService
=> _notificationRegistrationService ??
(_notificationRegistrationService =
[Link]<INotificationRegistrationService>());
IDeviceInstallationService DeviceInstallationService
=> _deviceInstallationService ??
(_deviceInstallationService =
[Link]<IDeviceInstallationService>());
C#
void RegisterForRemoteNotifications()
{
[Link](() =>
{
var pushSettings =
[Link](
[Link] |
[Link] |
[Link],
new NSSet());
[Link](pushSe
ttings);
[Link]();
});
}
C#
try
{
var actionValue = [Link](new NSString("action"))
as NSString;
if ()
[Link]([Link]);
}
catch (Exception ex)
{
[Link]([Link]);
}
}
C#
C#
C#
public override void FailedToRegisterForRemoteNotifications(
UIApplication application,
NSError error)
=> [Link]([Link]);
7 Notes
C#
C#
if ([Link])
{
[Link](
[Link] |
[Link] |
[Link],
(approvalGranted, error) =>
{
if (approvalGranted && error == null)
RegisterForRemoteNotifications();
});
}
C#
using (var userInfo = options?.ObjectForKey(
[Link]) as NSDictionary)
ProcessNotificationActions(userInfo);
Test de la solution
Vous pouvez maintenant tester l’envoi de notifications par le biais du service back-end.
XML
[Link]
3. Si vous avez choisi d’effectuer la section Authentifier les clients à l’aide d’une clé
API, veillez à configurer les en-têtes de demande pour inclure votre valeur apikey.
Clé Valeur
apikey <your_api_key>
4. Choisissez l’option raw (brut) pour Body (Corps), choisissez JSON dans la liste des
options de format, puis incluez du contenu JSON d’espace réservé :
JSON
{
"text": "Message from Postman!",
"action": "action_a"
}
5. Sélectionnez le bouton Code qui apparaît dans le coin supérieur droit sous le
bouton Save (Enregistrer). La demande doit ressembler à l’exemple suivant quand
elle est affichée pour HTML (selon que vous avez inclus un en-tête apikey) :
HTML
{
"text": "Message from backend service",
"action": "action_a"
}
7 Notes
Si vous effectuez un test sur Android, assurez-vous que vous n’êtes pas en
mode Debug, ou si l’application a été déployée au moment de son exécution,
forcez sa fermeture, puis redémarrez-la à partir du lanceur.
9. Vérifiez que vous recevez une réponse 200 OK dans Postman et que l’alerte
s’affiche dans l’application sous la forme ActionA action received (Action ActionA
reçue).
10. Fermez l’application PushDemo, puis recliquez sur Send dans Postman .
11. Vérifiez que vous recevez une réponse 200 OK dans Postman . Vérifiez qu’une
notification s’affiche dans la zone de notification pour l’application PushDemo
avec le message approprié.
12. Appuyez sur la notification pour confirmer qu’elle ouvre l’application et qu’elle a
affiché l’alerte ActionA action received.
JSON
{
"action": "action_b",
"silent": true
}
14. L’application toujours ouverte, cliquez sur le bouton Send dans Postman .
15. Vérifiez que vous recevez une réponse 200 OK dans Postman et que l’alerte
s’affiche dans l’application sous la forme ActionB action received au lieu d’ActionA
action received.
16. Fermez l’application PushDemo, puis recliquez sur Send dans Postman .
17. Vérifiez que vous recevez une réponse 200 OK dans Postman et que la
notification silencieuse n’apparaît pas dans la zone de notification.
Dépannage
Si vous effectuez le test par rapport à l’application API Azure, vérifiez que le service est
en cours d’exécution, qu’il a été déployé et qu’il a démarré sans erreur.
Veillez à vérifier que vous avez correctement spécifié l’adresse de base dans Postman
ou dans la configuration de l’application mobile lors du test par le biais du client.
L’adresse de base doit être [Link] ou
[Link] lors du test local.
Vérifiez que vous définissez l’en-tête de demande apikey et que cette valeur correspond
à celle que vous avez configurée pour le service back-end.
Si vous recevez cette erreur quand vous procédez à un test local, vérifiez que la valeur
de clé que vous avez définie dans la configuration du client correspond à la valeur du
paramètre utilisateur Authentication:ApiKey utilisée par l’API.
Si vous effectuez un test avec une application API, assurez-vous que la valeur de clé
dans le fichier de configuration du client correspond au paramètre d’application
Authentication:ApiKey que vous utilisez dans l’application API.
7 Notes
Si vous avez créé ou modifié ce paramètre après avoir déployé le service back-end,
vous devez redémarrer le service afin qu’il prenne effet.
Si vous avez choisi de ne pas effectuer la section Authentifier les clients à l’aide d’une clé
API, assurez-vous que vous n’avez pas appliqué l’attribut Authorize à la classe
NotificationsController.
[PUT] [Link]
[DELETE] [Link]
<installation_id>
[POST] [Link]
[PUT] [Link]
[DELETE] [Link]
id>
[POST] [Link]
Quand vous spécifiez l’adresse de base dans l’application cliente, assurez-vous qu’elle se
termine par un caractère / . L’adresse de base doit être
[Link] ou [Link] lors du test local.
Vérifiez que l’appareil de test dispose d’une connectivité réseau. Ensuite, déterminez le
code d’état de la réponse HTTP en définissant un point d’arrêt pour inspecter la valeur
de propriété StatusCode dans HttpResponse.
Définissez un point d’arrêt sur les lignes qui retournent ces codes d’état pour l’API
concernée. Essayez ensuite d’appeler le service back-end lors du débogage local.
Vérifiez que le service back-end fonctionne comme prévu via Postman à l’aide de la
charge utile appropriée. Utilisez la charge utile réelle créée par le code client pour la
plateforme en question.
Passez en revue les sections de configuration propres à la plateforme pour vous assurer
qu’aucune étape n’a été manquée. Vérifiez que les valeurs appropriées sont résolues
pour les variables installation id et token pour la plateforme appropriée.
Liens connexes
Vue d’ensemble d’Azure Notification Hubs
Installation de Visual Studio pour Mac
Installation de Xamarin sur Windows
Kit de développement logiciel (SDK) Notification Hubs pour opérations backend
Kit de développement logiciel (SDK) Notification Hubs sur GitHub
S’inscrire auprès d’un back-end d’application
Gestion des inscriptions
Utilisation de balises
Utilisation des modèles personnalisés
Étapes suivantes
Vous devez maintenant disposer d’une application [Link] de base connectée à
un hub de notification par le biais d’un service back-end et qui peut envoyer et recevoir
des notifications.
Vous devrez probablement adapter à votre propre scénario l’exemple utilisé dans ce
tutoriel. L’implémentation d’une gestion des erreurs, d’une logique de nouvelle tentative
et d’une journalisation plus robustes est également recommandée.
Visual Studio App Center peut être rapidement intégré à des applications mobiles qui
fournissent des analytiques et des diagnostics pour faciliter la résolution des problèmes.
Tutoriel : Envoyer des notifications Push
à des applications React Native à l’aide
d’Azure Notification Hubs par le biais
d’un service back-end
Article • 08/06/2023
Télécharger l’exemple
Dans ce tutoriel, vous allez utiliser Azure Notification Hubs pour envoyer des
notifications Push à une application React Native ciblant Android et iOS.
Une API web [Link] Core back-end est utilisée pour gérer l’inscription d’appareils
pour le client à l’aide de l’approche d’installation la plus récente et la plus appropriée. Le
service envoie également des notifications Push en mode multiplateforme.
Ces opérations sont gérées à l’aide du SDK Notification Hubs pour les opérations back-
end . Vous trouverez plus d’informations sur l’approche globale dans la documentation
sur l’inscription à partir de votre back-end d’application.
Prérequis
Pour suivre ce tutoriel, vous avez besoin des éléments suivants :
7 Notes
Vous pouvez effectuer les étapes de cet exemple sans expérience préalable. Toutefois,
une connaissance des éléments suivants vous sera utile :
Les étapes fournies concernent Visual Studio pour Mac et Visual Studio Code .
Toutefois, il est possible d’utiliser Visual Studio 2019 .
7 Notes
Un nom unique sera généré pour vous. Par défaut, il s’agit d’une variante en
minuscules du nom que vous avez fourni plus un nombre généré, séparés par
un tiret. Vous pouvez le changer si vous voulez, du moment qu’il reste unique
au niveau global.
2. Une fois le projet créé, sélectionnez Add Firebase to your Android app (Ajouter
Firebase à votre application Android).
3. Dans la page Add Firebase to your Android app (Ajouter Firebase à votre
application Android), effectuez les étapes suivantes :
a. Pour Android package name (Nom du package Android), entrez un nom pour
votre package. Par exemple : com.<organization_identifier>.<package_name> .
b. Sélectionnez Inscrire une application.
7 Notes
3. Mettez à jour les trois valeurs suivantes pour votre nouvelle application, puis
sélectionnez Continue :
L’ID de votre application est généré et vous êtes invité à confirmer les
informations. Sélectionnez Continue (Continuer), puis Register (Inscrire) pour
confirmer le nouvel ID d’application.
2. Création d’un certificat p8 qui peut être utilisé pour l’authentification basée sur un
jeton (l’approche la plus récente et recommandée)
OPTION 1 : Création d’un certificat Push p12 qui peut être chargé
directement sur le hub de notification
1. Sur votre Mac, exécutez l’outil Trousseaux d’accès. Vous pouvez l’ouvrir à partir du
dossier Utilitaires ou du dossier Autre sur Launchpad.
7 Notes
7 Notes
7 Notes
Par défaut, le certificat de développement téléchargé se nomme
aps_development.cer.
7 Notes
Bien que le nom de votre certificat puisse être différent, il portera le préfixe
Apple Development iOS Push Notification Services et se verra associer
l’identificateur de bundle approprié.
10. Dans Trousseau d’accès, utilisez Ctrl + clic sur le certificat push que vous avez créé
dans la catégorie Certificats. Sélectionnez Exporter, nommez le fichier,
sélectionnez le format p12, puis sélectionnez Enregistrer.
Vous pouvez choisir de protéger le certificat par un mot de passe, mais ce dernier
est facultatif. Cliquez sur OK si vous souhaitez ignorer l’étape de création du mot
de passe. Notez le nom du fichier et l’emplacement du certificat p12 exporté. Ces
informations sont nécessaires pour activer l’authentification avec APNs.
7 Notes
7 Notes
Si vous disposez déjà d’une clé configurée pour APNS, vous pouvez réutiliser
le certificat p8 que vous avez téléchargé juste après l’avoir créée. Dans ce cas,
vous pouvez ignorer les étapes 3 à 5.
3. Cliquez sur le bouton + (ou sur le bouton Créer une clé) pour créer une clé.
4. Fournissez une valeur appropriée pour Nom de clé, activez l’option Apple Push
Notification Service (APNS) , puis cliquez sur Continuer, puis sur Inscrire dans
l’écran suivant.
5. Cliquez sur Télécharger, puis déplacez le fichier p8 (préfixé avec AuthKey_ ) vers un
répertoire local sécurisé, puis cliquez sur Terminé.
7 Notes
6. Dans Clés, cliquez sur la clé que vous avez créée (ou une clé existante si vous avez
choisi de l’utiliser à la place).
8. Ouvrez votre certificat .p8 dans l’application appropriée de votre choix, par
exemple Visual Studio Code . Notez la valeur de la clé (comprise entre -----
BEGIN PRIVATE KEY----- et -----END PRIVATE KEY----- ).
7 Notes
À la fin de ces étapes, vous devez disposer des informations suivantes, dont vous vous
servirez dans Configurer votre hub de notification avec des informations APNS :
3. Ensuite, dans la liste déroulante App ID, sélectionnez l’ID d’application que vous
avez créé, puis sélectionnez Continue.
7 Notes
Ce certificat n’est pas le certificat Push que vous avez créé à l’étape
précédente. Il s’agit de votre certificat de développement. S’il n’en existe pas,
vous devez le créer, car il s’agit d’un prérequis pour ce tutoriel. Vous pouvez
créer des certificats de développeur dans le portail des développeurs
Apple , par le biais de Xcode ou dans Visual Studio.
8. Pour finir, choisissez un nom pour le profil dans Provisioning Profile Name (Nom
du profil de provisionnement), puis sélectionnez Generate (Générer).
1. Connectez-vous à Azure .
2. Cliquez sur Créer une ressource, recherchez et choisissez Hub de notification, puis
cliquez sur Créer.
7 Notes
7 Notes
4. Une fois que le hub de notifications a été provisionné, accédez à cette ressource.
7. Notez les valeurs de Nom de la stratégie ainsi que les valeurs de Chaîne de
connexion correspondantes.
7 Notes
Utilisez uniquement le mode Production ou Application si vous souhaitez envoyer
des notifications Push aux utilisateurs ayant acheté votre application dans le Store.
6. Sélectionnez Enregistrer.
ID de clé
ID de bundle
ID de l’équipe
Jeton
4. Sélectionnez Enregistrer.
3. Dans la boîte de dialogue Configurer votre nouvelle API web [Link] Core,
sélectionnez .NET Core 3.1 comme Framework cible.
7 Notes
a. Cliquez sur Oui pour accepter d’exécuter l’outil « dotnet dev-certs https »
afin de résoudre ce problème. L’outil « dotnet dev-certs https » vous invite
ensuite à entrer un mot de passe pour le certificat et le mot de passe pour
votre trousseau.
7. Supprimez [Link].
8. Configurez les valeurs de configuration locales à l’aide de l’outil Secret Manager.
Le découplage des secrets de la solution garantit qu’ils ne se trouvent pas dans le
contrôle de code source. Ouvrez Terminal, puis accédez au répertoire du fichier
projet et exécutez les commandes suivantes :
Bash
Remplacez les valeurs d’espace réservé par vos propres valeurs de nom de hub de
notification et de chaîne de connexion. Vous les avez notées dans la section Créer
un hub de notification. Sinon, vous pouvez les rechercher dans Azure .
NotificationHub:Name :
Consultez Nom dans le résumé Bases en haut de Vue d’ensemble.
NotificationHub:ConnectionString :
Consultez DefaultFullSharedAccessSignature dans Stratégies d’accès.
7 Notes
Pour les scénarios de production, vous pouvez envisager des options telles
qu’Azure KeyVault pour stocker la chaîne de connexion de manière
sécurisée. Par souci de simplicité, les secrets sont ajoutés aux paramètres
d’application d’Azure App Service .
Bash
7 Notes
Vous devez remplacer la valeur d’espace réservé par la vôtre et en prendre
note.
2. Utilisez Ctrl + clic sur le projet PushDemoApi, choisissez Nouveau dossier dans le
menu Ajouter, puis cliquez sur Ajouter en utilisant Authentication comme Nom de
dossier.
3. Utilisez Ctrl + clic sur le dossier Authentication, puis choisissez Nouveau fichier
dans le menu Ajouter.
C#
using [Link];
namespace [Link]
{
public class ApiKeyAuthOptions : AuthenticationSchemeOptions
{
public const string DefaultScheme = "ApiKey";
public string Scheme => DefaultScheme;
public string ApiKey { get; set; }
}
}
C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class ApiKeyAuthHandler :
AuthenticationHandler<ApiKeyAuthOptions>
{
const string ApiKeyIdentifier = "apikey";
public ApiKeyAuthHandler(
IOptionsMonitor<ApiKeyAuthOptions> options,
ILoggerFactory logger,
UrlEncoder encoder,
ISystemClock clock)
: base(options, logger, encoder, clock) {}
if ([Link][ApiKeyIdentifier].Any())
{
key =
[Link][ApiKeyIdentifier].FirstOrDefault();
}
else if ([Link](ApiKeyIdentifier))
{
if ([Link](ApiKeyIdentifier, out var
queryKey))
key = queryKey;
}
if ([Link](key))
return [Link]([Link]("No api
key provided"));
if ()
return [Link]([Link]("Invalid
api key."));
return [Link]([Link](ticket));
}
}
}
7 Notes
C#
using System;
using [Link];
namespace [Link]
{
public static class AuthenticationBuilderExtensions
{
public static AuthenticationBuilder AddApiKeyAuth(
this AuthenticationBuilder builder,
Action<ApiKeyAuthOptions> configureOptions)
{
return builder
.AddScheme<ApiKeyAuthOptions, ApiKeyAuthHandler>(
[Link],
configureOptions);
}
}
}
7 Notes
C#
using [Link];
using [Link];
using [Link];
[Link](options =>
{
[Link] =
[Link];
[Link] =
[Link];
}).AddApiKeyAuth([Link]("Authentication").Bind);
}
8. Toujours dans [Link], mettez à jour la méthode Configure pour appeler les
méthodes d’extension UseAuthentication et UseAuthorization sur
l’IApplicationBuilder de l’application. Assurez-vous que ces méthodes sont
appelées après UseRouting et avant [Link].
C#
[Link]();
[Link]();
[Link]();
[Link]();
[Link](endpoints =>
{
[Link]();
});
}
7 Notes
1. Utilisez Ctrl + clic sur le dossier Dependencies, puis choisissez Gérer les packages
NuGet... .
3. Cliquez sur Ajouter des packages, puis cliquez sur Accepter quand vous êtes invité
à accepter les termes du contrat de licence.
4. Utilisez Ctrl + clic sur le projet PushDemoApi, choisissez Nouveau dossier dans le
menu Ajouter, puis cliquez sur Ajouter en utilisant Models comme Nom de
dossier.
5. Utilisez Ctrl + clic sur le dossier Models, puis choisissez Nouveau fichier dans le
menu Ajouter.
C#
namespace [Link]
{
public class PushTemplates
{
public class Generic
{
public const string Android = "{ \"notification\": {
\"title\" : \"PushDemo\", \"body\" : \"$(alertMessage)\"}, \"data\" : {
\"action\" : \"$(alertAction)\" } }";
public const string iOS = "{ \"aps\" : {\"alert\" :
\"$(alertMessage)\"}, \"action\" : \"$(alertAction)\" }";
}
7 Notes
Cette classe contient les charges utiles de notification sous forme de jetons
pour les notifications génériques et silencieuses requises par ce scénario. Les
charges utiles sont définies en dehors de l’installation pour permettre
l’expérimentation sans avoir à mettre à jour les installations existantes via le
service. La gestion des modifications apportées aux installations de cette
façon n’entre pas dans le cadre de ce tutoriel. Pour la production, envisagez
des modèles personnalisés.
7. Ajoutez une autre Classe vide au dossier Models appelée [Link], puis
ajoutez l’implémentation suivante.
C#
using [Link];
using [Link];
namespace [Link]
{
public class DeviceInstallation
{
[Required]
public string InstallationId { get; set; }
[Required]
public string Platform { get; set; }
[Required]
public string PushChannel { get; set; }
C#
using System;
namespace [Link]
{
public class NotificationRequest
{
public string Text { get; set; }
public string Action { get; set; }
public string[] Tags { get; set; } = [Link]<string>();
public bool Silent { get; set; }
}
}
C#
using [Link];
namespace [Link]
{
public class NotificationHubOptions
{
[Required]
public string Name { get; set; }
[Required]
public string ConnectionString { get; set; }
}
}
11. Ajoutez une Interface vide au dossier Services appelée [Link], puis
ajoutez l’implémentation suivante.
C#
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public interface INotificationService
{
Task<bool> CreateOrUpdateInstallationAsync(DeviceInstallation
deviceInstallation, CancellationToken token);
Task<bool> DeleteInstallationByIdAsync(string installationId,
CancellationToken token);
Task<bool> RequestNotificationAsync(NotificationRequest
notificationRequest, CancellationToken token);
}
}
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class NotificationHubService : INotificationService
{
readonly NotificationHubClient _hub;
readonly Dictionary<string, NotificationPlatform>
_installationPlatform;
readonly ILogger<NotificationHubService> _logger;
public NotificationHubService(IOptions<NotificationHubOptions>
options, ILogger<NotificationHubService> logger)
{
_logger = logger;
_hub =
[Link](
[Link],
[Link]);
[Link](deviceInstallation?.PushChannel))
return false;
if
(_installationPlatform.TryGetValue([Link], out var
platform))
[Link] = platform;
else
return false;
try
{
await
_hub.CreateOrUpdateInstallationAsync(installation, token);
}
catch
{
return false;
}
return true;
}
try
{
await _hub.DeleteInstallationAsync(installationId,
token);
}
catch
{
return false;
}
return true;
}
try
{
if ([Link] == 0)
{
// This will broadcast to all users registered in
the notification hub
await
SendPlatformNotificationsAsync(androidPayload, iOSPayload, token);
}
else if ([Link] <= 20)
{
await
SendPlatformNotificationsAsync(androidPayload, iOSPayload,
[Link], token);
}
else
{
var notificationTasks = [Link]
.Select((value, index) => (value, index))
.GroupBy(g => [Link] / 20, i => [Link])
.Select(tags =>
SendPlatformNotificationsAsync(androidPayload, iOSPayload, tags,
token));
await [Link](notificationTasks);
}
return true;
}
catch (Exception e)
{
_logger.LogError(e, "Unexpected error sending
notification");
return false;
}
}
return [Link](sendTasks);
}
return [Link](sendTasks);
}
}
}
7 Notes
C#
using [Link];
using [Link];
[Link]<INotificationService, NotificationHubService>
();
[Link]<NotificationHubOptions>()
.Configure([Link]("NotificationHub").Bind)
.ValidateDataAnnotations();
}
7 Notes
C#
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
4. Mettez à jour le contrôleur basé sur un modèle pour le faire dériver de
ControllerBase et le décorer avec l’attribut ApiController.
C#
[ApiController]
[Route("api/[controller]")]
public class NotificationsController : ControllerBase
{
// Templated methods here
}
7 Notes
La classe de base du contrôleur prend en charge les vues, mais ce n’est pas
nécessaire dans ce cas et peut donc être utilisé à la place. Si vous utilisez
Visual Studio 2019 , vous pouvez ignorer cette étape.
5. Si vous avez choisi d’effectuer la section Authentifier les clients à l’aide d’une clé
API, vous devez décorer NotificationsController avec l’attribut Authorize
également.
C#
[Authorize]
C#
public NotificationsController(INotificationService
notificationService)
{
_notificationService = notificationService;
}
l’attribut RegistrationsControllerRoute .
8. Démarrer le débogage (commande + Entrée) pour vérifier que l’application utilise
le nouveau NotificationsController et retourne un état 401 Non autorisé.
7 Notes
9. Sous un nouvel onglet Postman , définissez la demande sur GET. Entrez l’adresse
ci-dessous en remplaçant l’espace réservé <applicationUrl> par l’applicationUrl
https trouvé dans Propriétés>[Link].
Bash
<applicationUrl>/api/notifications
7 Notes
10. Si vous avez choisi d’effectuer la section Authentifier les clients à l’aide d’une clé
API, veillez à configurer les en-têtes de demande pour inclure votre valeur apikey.
Clé Valeur
apikey <your_api_key>
7 Notes
C#
[HttpPut]
[Route("installations")]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
public async Task<IActionResult> UpdateInstallation(
[Required]DeviceInstallation deviceInstallation)
{
var success = await _notificationService
.CreateOrUpdateInstallationAsync(deviceInstallation,
[Link]);
if (!success)
return new UnprocessableEntityResult();
[HttpDelete()]
[Route("installations/{installationId}")]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
public async Task<ActionResult> DeleteInstallation(
[Required][FromRoute]string installationId)
{
var success = await _notificationService
.DeleteInstallationByIdAsync(installationId,
[Link]);
if (!success)
return new UnprocessableEntityResult();
[HttpPost]
[Route("requests")]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
public async Task<IActionResult> RequestPush(
[Required]NotificationRequest notificationRequest)
{
if (([Link] &&
[Link](notificationRequest?.Action)) ||
(![Link] &&
[Link](notificationRequest?.Text)))
return new BadRequestResult();
var success = await _notificationService
.RequestNotificationAsync(notificationRequest,
[Link]);
if (!success)
return new UnprocessableEntityResult();
2. Cliquez sur Créer une ressource, recherchez et choisissez Application API, puis
cliquez sur Créer.
Nom de l’application :
entrez un nom global unique pour l’application API.
Abonnement :
Choisissez l’Abonnement cible dans lequel vous avez créé le hub de notification.
Groupe de ressources :
Choisissez le Groupe de ressources cible dans lequel vous avez créé le hub de
notification.
7 Notes
Application Insights :
Conservez l’option suggérée (une nouvelle ressource sera créée avec ce nom) ou
choisissez une ressource existante.
4. Une fois l’application API provisionnée, accédez à cette ressource.
5. Notez la propriété URL dans le résumé Bases en haut de la Vue d’ensemble. Cette
URL représente le point de terminaison back-end qui sera utilisé plus loin dans ce
tutoriel.
7 Notes
Nom Valeur
Authentication:ApiKey <api_key_value>
NotificationHub:Name <hub_name_value>
NotificationHub:ConnectionString <hub_connection_string_value>
7 Notes
Ce sont les mêmes paramètres que ceux que vous avez définis dans les
paramètres utilisateur. Vous devez être en mesure de les reprendre. Le
paramètre Authentication:ApiKey est uniquement obligatoire si vous avez
choisi d’effectuer la section Authentifier les clients à l’aide d’une clé API.
Pour les scénarios de production, vous pouvez envisager des options telles
qu’Azure KeyVault . Ceux-ci ont été ajoutés en tant que paramètres
d’application pour des raisons de simplicité dans ce cas.
8. Une fois tous les paramètres d’application ajoutés, cliquez sur Enregistrer, puis
Continuer.
Les étapes suivantes sont spécifiques à Visual Studio pour Mac . Si vous utilisez
Visual Studio 2019 sur Windows, le flux de publication sera différent. Consultez
Publier sur Azure App Service sur Windows.
2. Utilisez Ctrl + Clic sur le projet PushDemoApi, puis choisissez Publier sur Azure...
dans le menu Publier.
4. Sélectionnez l’application API Azure App Service que vous avez créée dans la liste
comme cible de publication, puis cliquez sur Publier.
Après en avoir terminé avec l’Assistant, il publie l’application dans Azure, puis ouvre
l’application. Prenez note de l’URL si ce n’est déjà fait. Cette URL représente le point de
terminaison back-end qui est utilisé plus loin dans ce tutoriel.
C#
[Link]
7 Notes
2. Si vous avez choisi d’effectuer la section Authentifier les clients à l’aide d’une clé
API, veillez à configurer les en-têtes de demande pour inclure votre valeur apikey.
Clé Valeur
apikey <your_api_key>
3. Choisissez l’option raw (brut) pour Body (Corps), choisissez JSON dans la liste des
options de format, puis incluez du contenu JSON d’espace réservé :
JSON
{}
7 Notes
Bash
[Link]
7 Notes
Il n’est pas encore possible de tester l’API à l’aide de données de demande valides,
car cela nécessite des informations propres à la plateforme de la part de
l’application mobile cliente.
Elle vous permet de vous inscrire auprès d’un hub de notification et de vous en
désinscrire par le biais du service back-end que vous avez créé.
Une alerte s’affiche quand une action est spécifiée et que l’application est au premier
plan. Sinon, les notifications s’affichent dans le centre de notifications.
7 Notes
En général, vous effectuez les actions d’inscription (et de désinscription) au
moment approprié durant le cycle de vie de l’application (ou éventuellement dans
le cadre de votre première expérience d’exécution) sans entrées d’inscription ou de
désinscription explicites de la part de l’utilisateur. Toutefois, cet exemple demande
une entrée utilisateur explicite pour faciliter l’exploration et le test de cette
fonctionnalité.
Bash
# install node
brew install node
# or update
brew update node
# install watchman
brew install watchman
# or update
brew upgrade watchman
# install cocoapods
sudo gem install cocoapods
2. Dans Terminal , si vous avez l’interface CLI React Native installée, exécutez la
commande suivante pour la désinstaller. Utilisez npx pour accéder
automatiquement à la dernière version de l’interface CLI React Native disponible :
Bash
7 Notes
Bash
4. Exécutez le serveur Metro, qui génère des bundles JavaScript et surveille toutes les
mises à jour du code pour actualiser les bundles en temps réel :
Bash
cd PushDemo
npx react-native start
Bash
Bash
Bash
Une fois dans l’application, appuyez sur CMD+M (émulateur) ou secouez l’appareil
pour renseigner les paramètres du développeur, accédez à Settings > Change
Bundle Location et spécifiez l’adresse IP du serveur Metro avec le port par défaut :
<metro-server-ip-address>:8081 .
7 Notes
Bash
Bash
TypeScript
class DemoNotificationHandler {
private _onRegister: any;
private _onNotification: any;
onNotification(notification: any) {
[Link]('NotificationHandler:', notification);
onRegister(token: any) {
[Link]('NotificationHandler:', token);
attachTokenReceived(handler: any) {
this._onRegister = handler;
}
attachNotificationReceived(handler: any) {
this._onNotification = handler;
}
}
const handler = new DemoNotificationHandler();
[Link]({
onRegister: [Link](handler),
onNotification: [Link](handler),
permissions: {
alert: true,
badge: true,
sound: true,
},
popInitialNotification: true,
requestPermissions: true,
});
TypeScript
[Link](onNotificationReceiv
ed);
[Link](function(number:
number) {
if(number > 0) {
[Link](0);
}
});
}
checkPermissions(cbk: any) {
return [Link](cbk);
}
requestPermissions() {
return [Link]();
}
cancelNotifications() {
[Link]();
}
cancelAll() {
[Link]();
}
abandonPermissions() {
[Link]();
}
}
TypeScript
JSON
Exécutez ensuite ce script, qui copiera la configuration par défaut dans le dossier
config .
Bash
yarn configure
TypeScript
[Link] = {
appName: "PushDemo",
env: "production",
apiUrl: "[Link]
apiKey: "<api-auth-key>",
};
TypeScript
<View style={[Link]}>
{[Link] &&
<ActivityIndicator></ActivityIndicator>
}
<View style={[Link]}>
<Button title="Register" onPress=
{[Link](this)} disabled={[Link]} />
</View>
<View style={[Link]}>
<Button title="Deregister" onPress=
{[Link](this)} disabled={[Link]}
/>
</View>
</View>
css
TypeScript
state: IState;
notificationService: DemoNotificationService;
notificationRegistrationService: DemoNotificationRegistrationService;
deviceId: string;
constructor(props: any) {
super(props);
[Link] = [Link]();
[Link] = {
status: "Push notifications registration status is unknown",
registeredOS: "",
registeredToken: "",
isRegistered: false,
isBusy: false,
};
[Link] = new
DemoNotificationRegistrationService(
[Link],
[Link],
);
}
TypeScript
async onRegisterButtonPress() {
if (![Link] || ![Link]) {
[Link]("The push notifications token wasn't received.");
return;
}
async onDeregisterButtonPress() {
if (![Link])
return;
TypeScript
onTokenReceived(token: any) {
[Link](`Received a notification token on ${[Link]}`);
[Link]({ registeredToken: [Link], registeredOS:
[Link], status: `The push notifications token has been received.` });
onNotificationReceived(notification: any) {
[Link](`Received a push notification on
${[Link]}`);
[Link]({ status: `Received a push notification...` });
if ([Link]) {
[Link]([Link], `${[Link]}
action received`);
}
}
};
XML
<manifest xmlns:android="[Link]
package="YOUR_PACKAGE_NAME">
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:usesCleartextTraffic="true"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:allowBackup="false"
android:theme="@style/AppTheme">
<meta-data
android:name="[Link].notification_channel_nam
e"
android:value="PushDemo Channel"/>
<meta-data
android:name="[Link].notification_channel_des
cription"
android:value="PushDemo Channel Description"/>
<meta-data
android:name="[Link].notification_foreground"
android:value="true"/>
<meta-data
android:name="[Link].notification_color"
android:resource="@android:color/white"/>
<receiver
android:name="[Link]
onPublisher" />
<receiver
android:name="[Link]
onBootEventReceiver">
<intent-filter>
<action android:name="[Link].BOOT_COMPLETED"
/>
</intent-filter>
</receiver>
<service
android:name="[Link]
onListenerService"
android:exported="false" >
<intent-filter>
<action android:name="[Link].MESSAGING_EVENT"
/>
</intent-filter>
</service>
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode
"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="[Link]" />
<category android:name="[Link]" />
</intent-filter>
</activity>
<activity
android:name="[Link]" />
</application>
</manifest>
Gradle
dependencies {
...
implementation '[Link]:firebase-analytics:17.3.0'
...
}
Bash
npx pod-install
objective-c
#import <UserNotifications/UNUserNotificationCenter.h>
2. Mettez à jour la liste des protocoles pris en charge par « AppDelegate » en
ajoutant UNUserNotificationCenterDelegate :
objective-c
objective-c
#import <UserNotifications/UserNotifications.h>
#import <RNCPushNotificationIOS.h>
...
// Required for the notification event. You must call the completion
handler after handling the remote notification.
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)
(UIBackgroundFetchResult))completionHandler
{
[RNCPushNotificationIOS didReceiveRemoteNotification:userInfo
fetchCompletionHandler:completionHandler];
}
Test de la solution
Vous pouvez maintenant tester l’envoi de notifications par le biais du service back-end.
XML
[Link]
3. Si vous avez choisi d’effectuer la section Authentifier les clients à l’aide d’une clé
API, veillez à configurer les en-têtes de demande pour inclure votre valeur apikey.
Clé Valeur
apikey <your_api_key>
4. Choisissez l’option raw (brut) pour Body (Corps), choisissez JSON dans la liste des
options de format, puis incluez du contenu JSON d’espace réservé :
JSON
{
"text": "Message from Postman!",
"action": "action_a"
}
5. Sélectionnez le bouton Code qui apparaît dans le coin supérieur droit sous le
bouton Save (Enregistrer). La demande doit ressembler à l’exemple suivant quand
elle est affichée pour HTML (selon que vous avez inclus un en-tête apikey) :
HTML
{
"text": "Message from backend service",
"action": "action_a"
}
7 Notes
Si vous effectuez un test sur Android, assurez-vous que vous n’êtes pas en
mode Debug, ou si l’application a été déployée au moment de son exécution,
forcez sa fermeture, puis redémarrez-la à partir du lanceur.
9. Vérifiez que vous recevez une réponse 200 OK dans Postman et que l’alerte
s’affiche dans l’application sous la forme ActionA action received (Action ActionA
reçue).
10. Fermez l’application PushDemo, puis recliquez sur Send dans Postman .
11. Vérifiez que vous recevez une réponse 200 OK dans Postman . Vérifiez qu’une
notification s’affiche dans la zone de notification pour l’application PushDemo
avec le message approprié.
12. Appuyez sur la notification pour confirmer qu’elle ouvre l’application et qu’elle a
affiché l’alerte ActionA action received.
JSON
{
"action": "action_b",
"silent": true
}
14. L’application toujours ouverte, cliquez sur le bouton Send dans Postman .
15. Vérifiez que vous recevez une réponse 200 OK dans Postman et que l’alerte
s’affiche dans l’application sous la forme ActionB action received au lieu d’ActionA
action received.
16. Fermez l’application PushDemo, puis recliquez sur Send dans Postman .
17. Vérifiez que vous recevez une réponse 200 OK dans Postman et que la
notification silencieuse n’apparaît pas dans la zone de notification.
Dépannage
Si vous effectuez le test par rapport à l’application API Azure, vérifiez que le service est
en cours d’exécution, qu’il a été déployé et qu’il a démarré sans erreur.
Veillez à vérifier que vous avez correctement spécifié l’adresse de base dans Postman
ou dans la configuration de l’application mobile lors du test par le biais du client.
L’adresse de base doit être [Link] ou
[Link] lors du test local.
Si vous recevez cette erreur quand vous procédez à un test local, vérifiez que la valeur
de clé que vous avez définie dans la configuration du client correspond à la valeur du
paramètre utilisateur Authentication:ApiKey utilisée par l’API.
Si vous effectuez un test avec une application API, assurez-vous que la valeur de clé
dans le fichier de configuration du client correspond au paramètre d’application
Authentication:ApiKey que vous utilisez dans l’application API.
7 Notes
Si vous avez créé ou modifié ce paramètre après avoir déployé le service back-end,
vous devez redémarrer le service afin qu’il prenne effet.
Si vous avez choisi de ne pas effectuer la section Authentifier les clients à l’aide d’une clé
API, assurez-vous que vous n’avez pas appliqué l’attribut Authorize à la classe
NotificationsController.
[PUT] [Link]
[DELETE] [Link]
<installation_id>
[POST] [Link]
Ou lors du test local :
[PUT] [Link]
[DELETE] [Link]
id>
[POST] [Link]
Quand vous spécifiez l’adresse de base dans l’application cliente, assurez-vous qu’elle se
termine par un caractère / . L’adresse de base doit être
[Link] ou [Link] lors du test local.
Vérifiez que l’appareil de test dispose d’une connectivité réseau. Ensuite, déterminez le
code d’état de la réponse HTTP en définissant un point d’arrêt pour inspecter la valeur
de propriété StatusCode dans HttpResponse.
Définissez un point d’arrêt sur les lignes qui retournent ces codes d’état pour l’API
concernée. Essayez ensuite d’appeler le service back-end lors du débogage local.
Vérifiez que le service back-end fonctionne comme prévu via Postman à l’aide de la
charge utile appropriée. Utilisez la charge utile réelle créée par le code client pour la
plateforme en question.
Passez en revue les sections de configuration propres à la plateforme pour vous assurer
qu’aucune étape n’a été manquée. Vérifiez que les valeurs appropriées sont résolues
pour les variables installation id et token pour la plateforme appropriée.
Liens connexes
Vue d’ensemble d’Azure Notification Hubs
Installation de Visual Studio pour Mac
Installation de Visual Studio Code
Configuration de l’environnement de développement React Native
Kit de développement logiciel (SDK) Notification Hubs pour opérations backend
Kit de développement logiciel (SDK) Notification Hubs sur GitHub
S’inscrire auprès d’un back-end d’application
Gestion des inscriptions
Utilisation de balises
Utilisation des modèles personnalisés
Étapes suivantes
Vous devez maintenant disposer d’une application React Native de base connectée à un
hub de notification par le biais d’un service back-end, et qui peut envoyer et recevoir
des notifications.
Vous devrez probablement adapter à votre propre scénario l’exemple utilisé dans ce
tutoriel. L’implémentation d’une gestion des erreurs, d’une logique de nouvelle tentative
et d’une journalisation plus robustes est également recommandée.
Visual Studio App Center peut être rapidement intégré à des applications mobiles qui
fournissent des analytiques et des diagnostics pour faciliter la résolution des problèmes.
Tutoriel : Envoyer des notifications Push
aux applications Flutter à l’aide d’Azure
Notification Hubs via un service
principal
Article • 23/10/2023
Télécharger l’exemple
Dans ce tutoriel, vous allez utiliser Azure Notification Hubs pour envoyer des
notifications Push à une application Flutter ciblant Android et iOS.
Une API web [Link] Core back-end est utilisée pour gérer l’inscription d’appareils
pour le client à l’aide de l’approche d’installation la plus récente et la plus appropriée. Le
service envoie également des notifications Push en mode multiplateforme.
Ces opérations sont gérées à l’aide du SDK Notification Hubs pour les opérations back-
end . Vous trouverez plus d’informations sur l’approche globale dans la documentation
sur l’inscription à partir de votre back-end d’application.
Prérequis
Pour suivre ce tutoriel, vous avez besoin des éléments suivants :
7 Notes
Vous pouvez effectuer les étapes de cet exemple sans expérience préalable. Toutefois,
une connaissance des éléments suivants vous sera utile :
Les étapes fournies sont propres au système d’exploitation macOS . Il est possible de
suivre ces instructions sur Windows en ignorant les aspects concernant iOS.
7 Notes
Un nom unique sera généré pour vous. Par défaut, il s’agit d’une variante en
minuscules du nom que vous avez fourni plus un nombre généré, séparés par
un tiret. Vous pouvez le changer si vous voulez, du moment qu’il reste unique
au niveau global.
2. Une fois le projet créé, sélectionnez Add Firebase to your Android app (Ajouter
Firebase à votre application Android).
3. Dans la page Add Firebase to your Android app (Ajouter Firebase à votre
application Android), effectuez les étapes suivantes :
a. Pour Android package name (Nom du package Android), entrez un nom pour
votre package. Par exemple : com.<organization_identifier>.<package_name> .
b. Sélectionnez Inscrire une application.
7 Notes
3. Mettez à jour les trois valeurs suivantes pour votre nouvelle application, puis
sélectionnez Continue :
L’ID de votre application est généré et vous êtes invité à confirmer les
informations. Sélectionnez Continue (Continuer), puis Register (Inscrire) pour
confirmer le nouvel ID d’application.
2. Création d’un certificat p8 qui peut être utilisé pour l’authentification basée sur un
jeton (l’approche la plus récente et recommandée)
OPTION 1 : Création d’un certificat Push p12 qui peut être chargé
directement sur Notification Hub
1. Sur votre Mac, exécutez l’outil Trousseaux d’accès. Vous pouvez l’ouvrir à partir du
dossier Utilitaires ou du dossier Autre sur Launchpad.
7 Notes
7 Notes
7 Notes
Par défaut, le certificat de développement téléchargé se nomme
aps_development.cer.
7 Notes
Bien que le nom de votre certificat puisse être différent, il portera le préfixe
Apple Development iOS Push Notification Services et se verra associer
l’identificateur de bundle approprié.
10. Dans Trousseau d’accès, utilisez Ctrl + clic sur le certificat push que vous avez créé
dans la catégorie Certificats. Sélectionnez Exporter, nommez le fichier,
sélectionnez le format p12, puis sélectionnez Enregistrer.
Vous pouvez choisir de protéger le certificat par un mot de passe, mais ce dernier
est facultatif. Cliquez sur OK si vous souhaitez ignorer l’étape de création du mot
de passe. Notez le nom du fichier et l’emplacement du certificat p12 exporté. Ces
informations sont nécessaires pour activer l’authentification avec APNs.
7 Notes
7 Notes
Si vous disposez déjà d’une clé configurée pour APNS, vous pouvez réutiliser
le certificat p8 que vous avez téléchargé juste après l’avoir créée. Dans ce cas,
vous pouvez ignorer les étapes 3 à 5.
3. Cliquez sur le bouton + (ou sur le bouton Créer une clé) pour créer une clé.
4. Fournissez une valeur appropriée pour Nom de clé, activez l’option Apple Push
Notification Service (APNS), puis cliquez sur Continuer, puis sur Inscrire dans
l’écran suivant.
5. Cliquez sur Télécharger, puis déplacez le fichier p8 (préfixé avec AuthKey_) vers un
répertoire local sécurisé, puis cliquez sur Terminé.
7 Notes
6. Dans Clés, cliquez sur la clé que vous avez créée (ou une clé existante si vous avez
choisi de l’utiliser à la place).
8. Ouvrez votre certificat .p8 dans l’application appropriée de votre choix, par
exemple Visual Studio Code . Notez la valeur de la clé (comprise entre -----
BEGIN PRIVATE KEY----- et -----END PRIVATE KEY-----).
7 Notes
À la fin de ces étapes, vous devez disposer des informations suivantes, dont vous vous
servirez dans Configurer votre hub de notification avec des informations APNS :
3. Ensuite, dans la liste déroulante App ID, sélectionnez l’ID d’application que vous
avez créé, puis sélectionnez Continue.
7 Notes
Ce certificat n’est pas le certificat Push que vous avez créé à l’étape
précédente. Il s’agit de votre certificat de développement. S’il n’en existe pas,
vous devez le créer, car il s’agit d’un prérequis pour ce tutoriel. Vous pouvez
créer des certificats de développeur dans le portail des développeurs
Apple , par le biais de Xcode ou dans Visual Studio.
8. Pour finir, choisissez un nom pour le profil dans Provisioning Profile Name (Nom
du profil de provisionnement), puis sélectionnez Generate (Générer).
1. Connectez-vous à Azure .
2. Cliquez sur Créer une ressource, recherchez et choisissez Hub de notification, puis
cliquez sur Créer.
7 Notes
7 Notes
4. Une fois que le hub de notifications a été provisionné, accédez à cette ressource.
7. Notez les valeurs de Nom de la stratégie ainsi que les valeurs de Chaîne de
connexion correspondantes.
7 Notes
Utilisez uniquement le mode Production ou Application si vous souhaitez envoyer
des notifications Push aux utilisateurs ayant acheté votre application dans le Store.
ID de clé
ID de bundle
ID de l’équipe
Jeton
3. Dans la boîte de dialogue Configurer votre nouvelle API web [Link] Core,
sélectionnez .NET Core 3.1 comme Framework cible.
7 Notes
a. Cliquez sur Oui pour accepter d’exécuter l’outil « dotnet dev-certs https »
afin de résoudre ce problème. L’outil « dotnet dev-certs https » vous invite
ensuite à entrer un mot de passe pour le certificat et le mot de passe pour
votre trousseau.
7. Supprimez [Link].
8. Configurez les valeurs de configuration locales à l’aide de l’outil Secret Manager.
Le découplage des secrets de la solution garantit qu’ils ne se trouvent pas dans le
contrôle de code source. Ouvrez Terminal, puis accédez au répertoire du fichier
projet et exécutez les commandes suivantes :
Bash
Remplacez les valeurs d’espace réservé par vos propres valeurs de nom de hub de
notification et de chaîne de connexion. Vous les avez notées dans la section Créer
un hub de notification. Sinon, vous pouvez les rechercher dans Azure .
NotificationHub :Name :
Consultez Nom dans le résumé Bases en haut de Vue d’ensemble.
NotificationHub:ConnectionString :
Consultez DefaultFullSharedAccessSignature dans Stratégies d’accès.
7 Notes
Pour les scénarios de production, vous pouvez envisager des options telles
qu’Azure KeyVault pour stocker la chaîne de connexion de manière
sécurisée. Par souci de simplicité, les secrets sont ajoutés aux paramètres
d’application d’Azure App Service .
Bash
7 Notes
Vous devez remplacer la valeur d’espace réservé par la vôtre et en prendre
note.
2. Utilisez Ctrl + clic sur le projet PushDemoApi, choisissez Nouveau dossier dans le
menu Ajouter, puis cliquez sur Ajouter en utilisant Authentication comme Nom de
dossier.
3. Utilisez Ctrl + clic sur le dossier Authentication, puis choisissez Nouveau fichier
dans le menu Ajouter.
C#
using [Link];
namespace [Link]
{
public class ApiKeyAuthOptions : AuthenticationSchemeOptions
{
public const string DefaultScheme = "ApiKey";
public string Scheme => DefaultScheme;
public string ApiKey { get; set; }
}
}
C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class ApiKeyAuthHandler :
AuthenticationHandler<ApiKeyAuthOptions>
{
const string ApiKeyIdentifier = "apikey";
public ApiKeyAuthHandler(
IOptionsMonitor<ApiKeyAuthOptions> options,
ILoggerFactory logger,
UrlEncoder encoder,
ISystemClock clock)
: base(options, logger, encoder, clock) {}
if ([Link][ApiKeyIdentifier].Any())
{
key =
[Link][ApiKeyIdentifier].FirstOrDefault();
}
else if ([Link](ApiKeyIdentifier))
{
if ([Link](ApiKeyIdentifier, out var
queryKey))
key = queryKey;
}
if ([Link](key))
return [Link]([Link]("No api
key provided"));
if ()
return [Link]([Link]("Invalid
api key."));
return [Link]([Link](ticket));
}
}
}
7 Notes
C#
using System;
using [Link];
namespace [Link]
{
public static class AuthenticationBuilderExtensions
{
public static AuthenticationBuilder AddApiKeyAuth(
this AuthenticationBuilder builder,
Action<ApiKeyAuthOptions> configureOptions)
{
return builder
.AddScheme<ApiKeyAuthOptions, ApiKeyAuthHandler>(
[Link],
configureOptions);
}
}
}
7 Notes
C#
using [Link];
using [Link];
using [Link];
[Link](options =>
{
[Link] =
[Link];
[Link] =
[Link];
}).AddApiKeyAuth([Link]("Authentication").Bind);
}
8. Toujours dans [Link], mettez à jour la méthode Configure pour appeler les
méthodes d’extension UseAuthentication et UseAuthorization sur
l’IApplicationBuilder de l’application. Assurez-vous que ces méthodes sont
appelées après UseRouting et avant [Link].
C#
[Link]();
[Link]();
[Link]();
[Link]();
[Link](endpoints =>
{
[Link]();
});
}
7 Notes
1. Utilisez Ctrl + clic sur le dossier Dependencies, puis choisissez Gérer les packages
NuGet....
3. Cliquez sur Ajouter des packages, puis cliquez sur Accepter quand vous êtes invité
à accepter les termes du contrat de licence.
4. Utilisez Ctrl + clic sur le projet PushDemoApi, choisissez Nouveau dossier dans le
menu Ajouter, puis cliquez sur Ajouter en utilisant Models comme Nom de
dossier.
5. Utilisez Ctrl + clic sur le dossier Models, puis choisissez Nouveau fichier dans le
menu Ajouter.
C#
namespace [Link]
{
public class PushTemplates
{
public class Generic
{
public const string Android = "{ \"notification\": {
\"title\" : \"PushDemo\", \"body\" : \"$(alertMessage)\"}, \"data\" : {
\"action\" : \"$(alertAction)\" } }";
public const string iOS = "{ \"aps\" : {\"alert\" :
\"$(alertMessage)\"}, \"action\" : \"$(alertAction)\" }";
}
7 Notes
Cette classe contient les charges utiles de notification sous forme de jetons
pour les notifications génériques et silencieuses requises par ce scénario. Les
charges utiles sont définies en dehors de l’installation pour permettre
l’expérimentation sans avoir à mettre à jour les installations existantes via le
service. La gestion des modifications apportées aux installations de cette
façon n’entre pas dans le cadre de ce tutoriel. Pour la production, envisagez
des modèles personnalisés.
7. Ajoutez une autre Classe vide au dossier Models appelée [Link], puis
ajoutez l’implémentation suivante.
C#
using [Link];
using [Link];
namespace [Link]
{
public class DeviceInstallation
{
[Required]
public string InstallationId { get; set; }
[Required]
public string Platform { get; set; }
[Required]
public string PushChannel { get; set; }
C#
using System;
namespace [Link]
{
public class NotificationRequest
{
public string Text { get; set; }
public string Action { get; set; }
public string[] Tags { get; set; } = [Link]<string>();
public bool Silent { get; set; }
}
}
C#
using [Link];
namespace [Link]
{
public class NotificationHubOptions
{
[Required]
public string Name { get; set; }
[Required]
public string ConnectionString { get; set; }
}
}
11. Ajoutez une Interface vide au dossier Services appelée [Link], puis
ajoutez l’implémentation suivante.
C#
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public interface INotificationService
{
Task<bool> CreateOrUpdateInstallationAsync(DeviceInstallation
deviceInstallation, CancellationToken token);
Task<bool> DeleteInstallationByIdAsync(string installationId,
CancellationToken token);
Task<bool> RequestNotificationAsync(NotificationRequest
notificationRequest, CancellationToken token);
}
}
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class NotificationHubService : INotificationService
{
readonly NotificationHubClient _hub;
readonly Dictionary<string, NotificationPlatform>
_installationPlatform;
readonly ILogger<NotificationHubService> _logger;
public NotificationHubService(IOptions<NotificationHubOptions>
options, ILogger<NotificationHubService> logger)
{
_logger = logger;
_hub =
[Link](
[Link],
[Link]);
[Link](deviceInstallation?.PushChannel))
return false;
if
(_installationPlatform.TryGetValue([Link], out var
platform))
[Link] = platform;
else
return false;
try
{
await
_hub.CreateOrUpdateInstallationAsync(installation, token);
}
catch
{
return false;
}
return true;
}
try
{
await _hub.DeleteInstallationAsync(installationId,
token);
}
catch
{
return false;
}
return true;
}
try
{
if ([Link] == 0)
{
// This will broadcast to all users registered in
the notification hub
await
SendPlatformNotificationsAsync(androidPayload, iOSPayload, token);
}
else if ([Link] <= 20)
{
await
SendPlatformNotificationsAsync(androidPayload, iOSPayload,
[Link], token);
}
else
{
var notificationTasks = [Link]
.Select((value, index) => (value, index))
.GroupBy(g => [Link] / 20, i => [Link])
.Select(tags =>
SendPlatformNotificationsAsync(androidPayload, iOSPayload, tags,
token));
await [Link](notificationTasks);
}
return true;
}
catch (Exception e)
{
_logger.LogError(e, "Unexpected error sending
notification");
return false;
}
}
return [Link](sendTasks);
}
return [Link](sendTasks);
}
}
}
7 Notes
C#
using [Link];
using [Link];
[Link]<INotificationService, NotificationHubService>
();
[Link]<NotificationHubOptions>()
.Configure([Link]("NotificationHub").Bind)
.ValidateDataAnnotations();
}
7 Notes
C#
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
C#
[ApiController]
[Route("api/[controller]")]
public class NotificationsController : ControllerBase
{
// Templated methods here
}
7 Notes
La classe de base du contrôleur prend en charge les vues, mais cela n’est pas
nécessaire dans ce cas et controllerBase peut donc être utilisé à la place. Si
vous utilisez Visual Studio 2019 , vous pouvez ignorer cette étape.
5. Si vous avez choisi d’effectuer la section Authentifier les clients à l’aide d’une clé
API, vous devez décorer NotificationsController avec l’attribut Authorize
également.
C#
[Authorize]
C#
public NotificationsController(INotificationService
notificationService)
{
_notificationService = notificationService;
}
7 Notes
9. Sous un nouvel onglet Postman , définissez la demande sur GET. Entrez l’adresse
ci-dessous en remplaçant l’espace réservé <applicationUrl> par l’applicationUrl
https trouvée dans le lancement des propriétés>Paramè[Link].
Bash
<applicationUrl>/api/notifications
7 Notes
10. Si vous avez choisi d’effectuer la section Authentifier les clients à l’aide d’une clé
API, veillez à configurer les en-têtes de demande pour inclure votre valeur apikey.
Clé Valeur
apikey <your_api_key>
7 Notes
C#
[HttpPut]
[Route("installations")]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
public async Task<IActionResult> UpdateInstallation(
[Required]DeviceInstallation deviceInstallation)
{
var success = await _notificationService
.CreateOrUpdateInstallationAsync(deviceInstallation,
[Link]);
if (!success)
return new UnprocessableEntityResult();
[HttpDelete()]
[Route("installations/{installationId}")]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
public async Task<ActionResult> DeleteInstallation(
[Required][FromRoute]string installationId)
{
var success = await _notificationService
.DeleteInstallationByIdAsync(installationId,
[Link]);
if (!success)
return new UnprocessableEntityResult();
[HttpPost]
[Route("requests")]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
[ProducesResponseType((int)[Link])]
public async Task<IActionResult> RequestPush(
[Required]NotificationRequest notificationRequest)
{
if (([Link] &&
[Link](notificationRequest?.Action)) ||
(![Link] &&
[Link](notificationRequest?.Text)))
return new BadRequestResult();
if (!success)
return new UnprocessableEntityResult();
2. Cliquez sur Créer une ressource, recherchez et choisissez Application API, puis
cliquez sur Créer.
Nom de l’application :
entrez un nom global unique pour l’application API.
Abonnement :
Choisissez l’Abonnement cible dans lequel vous avez créé le hub de notification.
Groupe de ressources :
Choisissez le Groupe de ressources cible dans lequel vous avez créé le hub de
notification.
7 Notes
Passez de l’option par défaut à un plan qui comprend la prise en charge de
SSL. Sinon, vous devrez prendre les mesures appropriées lors de l’utilisation
de l’application mobile pour empêcher le blocage des demandes http.
Application Insights :
Conservez l’option suggérée (une nouvelle ressource sera créée avec ce nom) ou
choisissez une ressource existante.
5. Notez la propriété URL dans le résumé Bases en haut de la Vue d’ensemble. Cette
URL représente le point de terminaison back-end qui sera utilisé plus loin dans ce
tutoriel.
7 Notes
Nom Valeur
Authentication:ApiKey <api_key_value>
NotificationHub:Name <hub_name_value>
NotificationHub:ConnectionString <hub_connection_string_value>
7 Notes
Ce sont les mêmes paramètres que ceux que vous avez définis dans les
paramètres utilisateur. Vous devez être en mesure de les reprendre. Le
paramètre Authentication:ApiKey est uniquement obligatoire si vous avez
choisi d’effectuer la section Authentifier les clients à l’aide d’une clé API.
Pour les scénarios de production, vous pouvez envisager des options telles
qu’Azure KeyVault . Ceux-ci ont été ajoutés en tant que paramètres
d’application pour des raisons de simplicité dans ce cas.
8. Une fois tous les paramètres d’application ajoutés, cliquez sur Enregistrer, puis
Continuer.
7 Notes
Les étapes suivantes sont spécifiques à Visual Studio pour Mac . Si vous utilisez
Visual Studio 2019 sur Windows, le flux de publication sera différent. Consultez
Publier sur Azure App Service sur Windows.
2. Utilisez Ctrl + Clic sur le projet PushDemoApi, puis choisissez Publier sur Azure...
dans le menu Publier.
4. Sélectionnez l’application API Azure App Service que vous avez créée dans la liste
comme cible de publication, puis cliquez sur Publier.
Après en avoir terminé avec l’Assistant, il publie l’application dans Azure, puis ouvre
l’application. Prenez note de l’URL si ce n’est déjà fait. Cette URL représente le point de
terminaison back-end qui est utilisé plus loin dans ce tutoriel.
C#
[Link]
7 Notes
L’adresse de base doit être au format [Link] .
2. Si vous avez choisi d’effectuer la section Authentifier les clients à l’aide d’une clé
API, veillez à configurer les en-têtes de demande pour inclure votre valeur apikey.
Clé Valeur
apikey <your_api_key>
3. Choisissez l’option raw (brut) pour Body (Corps), choisissez JSON dans la liste des
options de format, puis incluez du contenu JSON d’espace réservé :
JSON
{}
7 Notes
Bash
[Link]
7 Notes
Il n’est pas encore possible de tester l’API à l’aide de données de demande valides,
car cela nécessite des informations propres à la plateforme de la part de
l’application mobile cliente.
Une alerte s’affiche quand une action est spécifiée et que l’application est au premier
plan. Sinon, les notifications s’affichent dans le centre de notifications.
7 Notes
6. Faites un Ctrl + clic sur le dossier kotlin (sous app>src>main), puis choisissez
Révéler dans le Finder. Ensuite, renommez les dossiers enfants (sous le dossier
kotlin) en com , <your_organization> et pushdemo respectivement.
7 Notes
Lorsque vous utilisez le modèle Visual Studio Code , ces dossiers sont par
défaut com, par exemple, <project_name>. À titre indicatif, si mobcat est
utilisé comme organisation, la structure des dossiers doit apparaître comme
suit :
Kotlin
Com
mobcat
pushdemo
7 Notes
Vous devez utiliser votre propre nom d’organisation pour l’espace <réservé
your_organization> . Par exemple, avec mobcat comme organisation, Nom du
package a la valeur [Link].
XML
<manifest
xmlns:android="[Link]
package="com.<your_organization>.pushdemo>">
...
</manifest>
XML
<application
android:name="[Link]"
android:label="PushDemo"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher">
...
</application>
7 Notes
Seuls les appareils qui exécutent les niveaux d’API 26 et supérieurs sont pris
en charge dans le cadre de ce tutoriel, mais vous pouvez l’étendre pour
prendre en charge les appareils exécutant des versions antérieures.
11. Faites un Ctrl + clic sur le dossier ios, puis choisissez Ouvrir dans Xcode.
12. Dans Xcode, cliquez sur Runner (projet xcodeproj en haut, pas le dossier). Ensuite,
sélectionnez la cible Runner et sélectionnez l’onglet Général. Une fois la
configuration de build all sélectionnée, mettez à jour l’identificateur de bundle sur
com.<your_organization>.PushDemo .
7 Notes
Vous devez utiliser votre propre nom d’organisation pour l’espace <réservé
your_organization> . Par exemple, avec mobcat comme organisation, Bundle
Identifier a la valeur [Link].
13. Cliquez sur [Link], puis remplacez la valeur de Bundle name par PushDemo.
15. De retour dans Visual Studio Code, ouvrez [Link], ajoutez les packages
http et flutter_secure_storage Dart en tant que dépendances. Ensuite,
enregistrez le fichier et cliquez sur Obtenir des packages quand vous y êtes invité.
YAML
dependencies:
flutter:
sdk: flutter
http: ^0.12.1
flutter_secure_storage: ^3.3.3
16. Dans Terminal, passez au dossier ios (pour votre projet Flutter). Ensuite, exécutez
la commande pod install pour installer de nouveaux pods (requis par le package
flutter_secure_storage ).
17. Faites un Ctrl + clic sur le dossier lib, puis choisissez Nouveau fichier dans le menu
avec main_page.dart comme nom de fichier. Ajoutez ensuite le code suivant.
Kotlin
import 'package:flutter/[Link]';
18. Dans [Link], remplacez le code basé sur un modèle par ce qui suit.
dart
import 'package:flutter/[Link]';
import 'package:push_demo/main_page.dart';
19. Dans Terminal, générez et exécutez l’application sur chaque plateforme cible pour
vérifier que l’application basée sur un modèle s’exécute sur vos appareils. Vérifiez
que les appareils pris en charge sont connectés.
Bash
flutter run
dart
class DeviceInstallation {
final String deviceId;
final String platform;
final String token;
final List<String> tags;
dart
enum PushDemoAction {
actionA,
actionB,
}
dart
import 'package:flutter/[Link]';
class DeviceInstallationService {
static const deviceInstallation = const MethodChannel('com.
<your_organization>.pushdemo/deviceinstallation');
static const String getDeviceIdChannelMethod = "getDeviceId";
static const String getDeviceTokenChannelMethod = "getDeviceToken";
static const String getDevicePlatformChannelMethod =
"getDevicePlatform";
Future<String> getDeviceId() {
return [Link](getDeviceIdChannelMethod);
}
Future<String> getDeviceToken() {
return
[Link](getDeviceTokenChannelMethod);
}
Future<String> getDevicePlatform() {
return
[Link](getDevicePlatformChannelMethod);
}
}
7 Notes
Vous devez utiliser votre propre nom d’organisation pour l’espace <réservé
your_organization> . Par exemple, avec mobcat comme organisation,
MethodChannel a pour nom [Link]/deviceinstallation.
dart
import 'package:flutter/[Link]';
import 'dart:async';
import 'package:push_demo/models/push_demo_action.dart';
class NotificationActionService {
static const notificationAction =
const MethodChannel('com.
<your_organization>.pushdemo/notificationaction');
static const String triggerActionChannelMethod = "triggerAction";
static const String getLaunchActionChannelMethod = "getLaunchAction";
final actionMappings = {
'action_a' : [Link],
'action_b' : [Link]
};
NotificationActionService() {
notificationAction
.setMethodCallHandler(handleNotificationActionCall);
}
if () {
return;
}
[Link](actionMappings[action]);
}
if (launchAction != null) {
triggerAction(action: launchAction);
}
}
7 Notes
dart
import 'dart:convert';
import 'package:flutter/[Link]';
import 'package:http/[Link]' as http;
import 'package:push_demo/services/device_installation_service.dart';
import 'package:push_demo/models/device_installation.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
class NotificationRegistrationService {
static const notificationRegistration =
const MethodChannel('com.
<your_organization>.pushdemo/notificationregistration');
String baseApiUrl;
String apikey;
NotificationRegistrationService([Link], [Link]) {
notificationRegistration
.setMethodCallHandler(handleNotificationRegistrationCall);
}
if ([Link]) {
throw "Unable to resolve an ID for the device.";
}
if ([Link] != 200) {
throw "Deregister request failed: ${[Link]}";
}
final deviceInstallation =
DeviceInstallation(deviceId, platform, token, tags);
if ([Link] != 200) {
throw "Register request failed: ${[Link]}";
}
if (currentToken == null ||
cachedToken == null ||
serializedTags == null ||
currentToken == cachedToken) {
return;
}
return registerDevice(tags);
}
7 Notes
dart
class Config {
static String apiKey = "API_KEY";
static String backendServiceEndpoint = "BACKEND_SERVICE_ENDPOINT";
}
7 Notes
Il s’agit d’un moyen simple de définir des secrets d’application. Remplacez les
valeurs d’espace réservé par vos propres valeurs. Vous devez en avoir pris
note quand vous avez créé le service back-end. L’URL de l’application API
doit être [Link] . Le membre apiKey
n’est obligatoire que si vous avez choisi d’effectuer la section Authentifier les
clients à l’aide d’une clé API.
Veillez à ajouter cela à votre fichier gitignore pour éviter de valider ces secrets
dans le contrôle de code source.
dart
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const [Link](horizontal: 20.0, vertical:
40.0),
child: Column(
mainAxisAlignment: [Link],
crossAxisAlignment: [Link],
children: <Widget>[
FlatButton(
child: Text("Register"),
onPressed: registerButtonClicked,
),
FlatButton(
child: Text("Deregister"),
onPressed: deregisterButtonClicked,
),
],
),
),
);
}
dart
import
'package:push_demo/services/notification_registration_service.dart';
import '[Link]';
dart
final notificationRegistrationService =
NotificationRegistrationService([Link],
[Link]);
dart
5. Maintenant, dans [Link], vérifiez que les importations suivantes sont présentes
en haut du fichier.
dart
import 'package:flutter/[Link]';
import 'package:push_demo/models/push_demo_action.dart';
import 'package:push_demo/services/notification_action_service.dart';
import 'package:push_demo/main_page.dart';
dart
7. Ajoutez des fonctions pour gérer l’affichage d’une alerte quand une action est
déclenchée.
dart
dart
7 Notes
XML
<manifest>
<application>...</application>
<uses-permission android:name="[Link]" />
<uses-permission android:name="[Link].READ_PHONE_STATE"
/>
</manifest>
JSON
buildscript {
repositories {
// Check that you have the following line (if not, add it):
google() // Google's Maven repository
}
dependencies {
// ...
allprojects {
// ...
repositories {
// Check that you have the following line (if not, add it):
google() // Google's Maven repository
// ...
}
}
7 Notes
JSON
// ...
android {
// ...
}
JSON
dependencies {
// ...
implementation '[Link]:firebase-messaging:20.2.0'
}
7 Notes
4. Enregistrez les changements, puis cliquez sur le bouton Sync Now (dans l’invite de
la barre d’outils) ou sur Sync Project with Gradle Files.
2. Faites un Ctrl + clic dans le dossier services, puis choisissez Kotlin File/Class dans
le menu New. Entrez DeviceInstallationService comme nom, puis appuyez sur
Entrée.
Kotlin
package com.<your_organization>.[Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
@SuppressLint("HardwareIds")
class DeviceInstallationService {
companion object {
const val DEVICE_INSTALLATION_CHANNEL = "com.
<your_organization>.pushdemo/deviceinstallation"
const val GET_DEVICE_ID = "getDeviceId"
const val GET_DEVICE_TOKEN = "getDeviceToken"
const val GET_DEVICE_PLATFORM = "getDevicePlatform"
}
val playServicesAvailable
get() =
[Link]().isGooglePlayServicesAvailable(conte
xt) == [Link]
if ([Link]()) {
throw Exception("Unable to resolve token for FCM.")
}
return token
}
if (resultCode != [Link]) {
return if
([Link]().isUserResolvableError(resultCode))
{
[Link]().getErrorString(resultCode)
} else {
"This device is not supported"
}
}
7 Notes
Kotlin
package com.<your_organization>.[Link]
import [Link]
import [Link]
class NotificationRegistrationService {
companion object {
const val NOTIFICATION_REGISTRATION_CHANNEL = "com.
<your_organization>.pushdemo/notificationregistration"
const val REFRESH_REGISTRATION = "refreshRegistration"
}
constructor(flutterEngine: FlutterEngine) {
notificationRegistrationChannel =
MethodChannel([Link],
NotificationRegistrationService.NOTIFICATION_REGISTRATION_CHANNEL)
}
fun refreshRegistration() {
[Link](REFRESH_REGISTRATION,
null)
}
}
7 Notes
Kotlin
package com.<your_organization>.[Link]
import [Link]
import [Link]
import [Link]
class NotificationActionService {
companion object {
const val NOTIFICATION_ACTION_CHANNEL = "com.
<your_organization>.pushdemo/notificationaction"
const val TRIGGER_ACTION = "triggerAction"
const val GET_LAUNCH_ACTION = "getLaunchAction"
}
constructor(flutterEngine: FlutterEngine) {
notificationActionChannel =
MethodChannel([Link],
NotificationActionService.NOTIFICATION_ACTION_CHANNEL)
[Link] { call, result -
> handleNotificationActionCall(call, result) }
}
[Link]([Link]
R_ACTION, action)
}
7 Notes
Kotlin
package com.<your_organization>.pushdemo
import [Link]
import [Link]
import [Link]
import [Link]
import com.
<your_organization>.[Link]
import com.
<your_organization>.[Link]
class PushNotificationsFirebaseMessagingService :
FirebaseMessagingService() {
companion object {
var token : String? = null
var notificationRegistrationService :
NotificationRegistrationService? = null
var notificationActionService : NotificationActionService? =
null
}
notificationActionService?.triggerAction([Link]("action",
null))
}
}
}
}
7 Notes
XML
<manifest>
<application>
<!-- EXISTING MANIFEST CONTENT -->
<service
android:name="com.
<your_organization>.[Link]"
android:exported="false">
<intent-filter>
<action
android:name="[Link].MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
</manifest>
Kotlin
package com.<your_organization>.pushdemo
import com.
<your_organization>.[Link]
gService
7 Notes
if ([Link]()) {
throw Exception("Unable to resolve token for FCM.")
}
return token
}
10. Dans MainActivity, vérifiez que les importations suivantes sont présentes en haut
du fichier.
Kotlin
package com.<your_organization>.pushdemo
import [Link]
import [Link]
import [Link]
import [Link]
import com.
<your_organization>.[Link]
import com.
<your_organization>.[Link]
import com.
<your_organization>.[Link]
import [Link]
7 Notes
Kotlin
Kotlin
if ([Link]()) {
if (launchAction) {
[Link]?.la
unchAction = action
}
else {
[Link]?.tr
iggerAction(action)
}
}
}
}
Kotlin
7 Notes
flutterEngine?.let {
deviceInstallationService = DeviceInstallationService(context,
it)
}
}
Kotlin
flutterEngine?.let {
deviceInstallationService = DeviceInstallationService(context, it)
[Link] =
NotificationActionService(it)
[Link]
ce = NotificationRegistrationService(it)
}
Kotlin
if(deviceInstallationService?.playServicesAvailable) {
[Link]().instanceId
.addOnCompleteListener(OnCompleteListener { task ->
if (![Link])
return@OnCompleteListener
[Link] =
[Link]?.token
[Link]
ce?.refreshRegistration()
})
}
Kotlin
processNotificationActions([Link], true)
7 Notes
Pour continuer à recevoir des notifications Push, vous devez réinscrire l’application
chaque fois que vous l’exécutez et l’arrêtez à partir d’une session de débogage.
2. Dans Xcode, cliquez sur Runner (xcodeprojen haut, et non sur le dossier), puis
sélectionnez la cible Runner, puis les fonctionnalités de signature&. Après avoir
sélectionné la configuration de build All, choisissez votre compte de développeur
pour Team. Vérifiez ensuite que l’option « Automatically manage signing » est
activée et que votre certificat de signature et votre profil de provisionnement sont
automatiquement sélectionnés.
7 Notes
7 Notes
Seuls les appareils qui exécutent iOS 13.0 ou une version ultérieure sont pris
en charge dans ce tutoriel, mais vous pouvez l’étendre pour prendre en
charge les appareils exécutant des versions antérieures.
Swift
import Foundation
class DeviceInstallationService {
[Link](handleDeviceInstallation
Call)
}
if (token == nil) {
throw [Link](message:
"Unable to resolve token for APNS.")
}
if (!notificationsSupported) {
return "This app only supports notifications on iOS 13.0
and above. You are running \([Link])"
}
7 Notes
Swift
import Foundation
class NotificationRegistrationService {
[Link](REFRESH_REGISTRATION,
arguments: nil)
}
}
7 Notes
Swift
import Foundation
class NotificationActionService {
[Link](handleNotificationAction
Call)
}
7 Notes
6. Dans [Link], ajoutez des variables pour stocker une référence aux
services que vous avez créés précédemment.
Swift
Swift
Swift
Swift
Swift
7 Notes
Swift
let controller : FlutterViewController = window?.rootViewController as!
FlutterViewController
deviceInstallationService =
DeviceInstallationService(withBinaryMessenger:
[Link])
notificationRegistrationService =
NotificationRegistrationService(withBinaryMessenger:
[Link])
notificationActionService =
NotificationActionService(withBinaryMessenger:
[Link])
Swift
if #available(iOS 13.0, *) {
[Link]().requestAuthorization(options:
[.alert, .sound, .badge]) {
(granted, error) in
if (granted)
{
[Link] {
let pushSettings = UIUserNotificationSettings(types:
[.alert, .sound, .badge], categories: nil)
[Link](pushSettings)
[Link]()
}
}
}
}
Swift
XML
[Link]
3. Si vous avez choisi d’effectuer la section Authentifier les clients à l’aide d’une clé
API, veillez à configurer les en-têtes de demande pour inclure votre valeur apikey.
Clé Valeur
apikey <your_api_key>
4. Choisissez l’option raw (brut) pour Body (Corps), choisissez JSON dans la liste des
options de format, puis incluez du contenu JSON d’espace réservé :
JSON
{
"text": "Message from Postman!",
"action": "action_a"
}
5. Sélectionnez le bouton Code qui apparaît dans le coin supérieur droit sous le
bouton Save (Enregistrer). La demande doit ressembler à l’exemple suivant quand
elle est affichée pour HTML (selon que vous avez inclus un en-tête apikey) :
HTML
{
"text": "Message from backend service",
"action": "action_a"
}
7 Notes
Si vous effectuez un test sur Android, assurez-vous que vous n’êtes pas en
mode Debug, ou si l’application a été déployée au moment de son exécution,
forcez sa fermeture, puis redémarrez-la à partir du lanceur.
9. Vérifiez que vous recevez une réponse 200 OK dans Postman et que l’alerte
s’affiche dans l’application sous la forme ActionA action received (Action ActionA
reçue).
10. Fermez l’application PushDemo, puis recliquez sur Send dans Postman .
11. Vérifiez que vous recevez une réponse 200 OK dans Postman . Vérifiez qu’une
notification s’affiche dans la zone de notification pour l’application PushDemo
avec le message approprié.
12. Appuyez sur la notification pour confirmer qu’elle ouvre l’application et qu’elle a
affiché l’alerte ActionA action received.
JSON
{
"action": "action_b",
"silent": true
}
14. L’application toujours ouverte, cliquez sur le bouton Send dans Postman .
15. Vérifiez que vous recevez une réponse 200 OK dans Postman et que l’alerte
s’affiche dans l’application sous la forme ActionB action received au lieu d’ActionA
action received.
16. Fermez l’application PushDemo, puis recliquez sur Send dans Postman .
17. Vérifiez que vous recevez une réponse 200 OK dans Postman et que la
notification silencieuse n’apparaît pas dans la zone de notification.
Lors du test local, vérifiez que le service back-end est en cours d’exécution et qu’il utilise
le port approprié.
Si vous effectuez le test par rapport à l’application API Azure, vérifiez que le service est
en cours d’exécution, qu’il a été déployé et qu’il a démarré sans erreur.
Veillez à vérifier que vous avez correctement spécifié l’adresse de base dans Postman
ou dans la configuration de l’application mobile lors du test par le biais du client.
L’adresse de base doit être [Link] ou
[Link] lors du test local.
Vérifiez que vous définissez l’en-tête de demande apikey et que cette valeur correspond
à celle que vous avez configurée pour le service back-end.
Si vous recevez cette erreur quand vous procédez à un test local, vérifiez que la valeur
de clé que vous avez définie dans la configuration du client correspond à la valeur du
paramètre utilisateur Authentication:ApiKey utilisée par l’API.
Si vous effectuez un test avec une application API, assurez-vous que la valeur de clé
dans le fichier de configuration du client correspond au paramètre d’application
Authentication:ApiKey que vous utilisez dans l’application API.
7 Notes
Si vous avez créé ou modifié ce paramètre après avoir déployé le service back-end,
vous devez redémarrer le service afin qu’il prenne effet.
Si vous avez choisi de ne pas effectuer la section Authentifier les clients à l’aide d’une clé
API, assurez-vous que vous n’avez pas appliqué l’attribut Authorize à la classe
NotificationsController.
Vérifiez que le point de terminaison et la méthode de demande HTTP sont corrects. Par
exemple, les points de terminaison doivent être :
[PUT] [Link]
[DELETE] [Link]
<installation_id>
[POST] [Link]
[PUT] [Link]
[DELETE] [Link]
id>
[POST] [Link]
Quand vous spécifiez l’adresse de base dans l’application cliente, assurez-vous qu’elle se
termine par un caractère / . L’adresse de base doit être
[Link] ou [Link] lors du test local.
Vérifiez que l’appareil de test dispose d’une connectivité réseau. Ensuite, déterminez le
code d’état de la réponse HTTP en définissant un point d’arrêt pour inspecter la valeur
de propriété StatusCode dans HttpResponse.
Vérifiez que le service back-end fonctionne comme prévu via Postman à l’aide de la
charge utile appropriée. Utilisez la charge utile réelle créée par le code client pour la
plateforme en question.
Passez en revue les sections de configuration propres à la plateforme pour vous assurer
qu’aucune étape n’a été manquée. Vérifiez que les valeurs appropriées sont résolues
pour les variables installation id et token pour la plateforme appropriée.
Passez en revue les sections de configuration propres à la plateforme pour vous assurer
qu’aucune étape n’a été manquée.
Liens connexes
Vue d’ensemble d’Azure Notification Hubs
Installation de Flutter sur macOS
Installation de Flutter sur Windows
Kit de développement logiciel (SDK) Notification Hubs pour opérations backend
Kit de développement logiciel (SDK) Notification Hubs sur GitHub
S’inscrire auprès d’un back-end d’application
Gestion des inscriptions
Utilisation de balises
Utilisation des modèles personnalisés
Étapes suivantes
Vous devez maintenant disposer d’une application Flutter de base connectée à un hub
de notification par le biais d’un service back-end, et qui peut envoyer et recevoir des
notifications.
Vous devrez probablement adapter à votre propre scénario l’exemple utilisé dans ce
tutoriel. L’implémentation d’une gestion des erreurs, d’une logique de nouvelle tentative
et d’une journalisation plus robustes est également recommandée.
Visual Studio App Center peut être rapidement intégré à des applications mobiles qui
fournissent des analytiques et des diagnostics pour faciliter la résolution des problèmes.
Cognitive Services aide à résoudre les
problèmes d’entreprise à l’aide de
l’intelligence artificielle
Article • 23/10/2023
Azure Cognitive Services fournit des services puissants afin que vos applications
puissent tirer parti d’algorithmes intelligents pour voir, entendre, parler, comprendre et
interpréter les besoins de votre utilisateur pour transformer votre activité avec
l’intelligence artificielle (IA). Vous pouvez rendre vos applications mobiles intelligentes,
attrayantes et contextuellement pertinentes pour vos utilisateurs. Les développeurs
peuvent utiliser les API, les Kits de développement logiciel (SDK) et les services afin
d’ajouter l’intelligence artificielle à leurs offres et de créer des applications intelligentes
sans avoir de compétences directes en IA ou en science des données.
Vision
Balisage d’image, miniatures
OCR (reconnaissance d’écriture manuscrite)
Détection des visages
Détection d’émotions
Insights vidéo
Modération des images et des vidéos
Reconnaissance d’images personnalisée
Voix
Reconnaissance vocale (transcription de la parole)
Transcription de la parole personnalisée (mots complexes, environnement bruyant)
Synthèse vocale
ID et authentification de l’orateur
Traduction vocale en temps réel
Langue
Compréhension linguistique contextuelle, analyse d’intention personnalisée
Analyse des sentiments, détection des expressions clés
Traduction de texte jusqu’à 60 langues
Modération de texte
Vérification orthographique
Décision
Modérateur de contenu
Distribution de contenu personnalisée
Détecteur d'anomalie
Recherche
Suggestions de recherche automatiques
Azure Maps offre une plateforme de localisation en mode natif dans le cloud et
fournit un portefeuille de services géospatiaux qui utilisent des données
cartographiques actualisées pour proposer un contexte géographique précis à des
applications web et mobiles. Les développeurs, entreprises et éditeurs de logiciels
indépendants peuvent utiliser Azure Maps pour créer des applications prenant en
compte la géolocalisation ainsi que des solutions d’IoT, de mobilité, de logistique et de
suivi des ressources.
Recherche cognitive Azure est un service de recherche cloud avec des fonctionnalités
d’IA intégrées. La Recherche cognitive offre aux développeurs des API et des outils
permettant d’ajouter une expérience de recherche enrichie sur du contenu privé et
hétérogène dans des applications web, mobiles et d’entreprise.
Votre client peut définir l’expérience de recherche à l’aide de la recherche cognitive. Les
requêtes s’exécutent sur un index persistant que vous créez, possédez et stockez dans
votre service.