XMPP est un protocole de messagerie qui permet de développer des applications de chat robustes. À l’aide de Swift et de la bibliothèque XMPPFramework, nous allons vous montrer comment créer votre propre client XMPP sur iOS, ainsi que gérer les connexions et les Stanzas. Si vous êtes intéressé par l’équivalent sur Android, n’hésitez pas à consulter l’article Connect to an XMPP Server with Smack Android, où nous utilisons la bibliothèque Smack pour créer un petit client XMPP sur Android.
Ce que l’on va construire:
Nous allons créer un modèle capable de gérer les connexions, l’authentification, ainsi que l’envoi et la réception de messages.
Comment on va y arriver:
Nous allons utiliser la bibliothèque XMPPFramework (disponible sur GitHub à l’adresse suivante : https://github.com/robbiehanson/XMPPFramework) pour mettre en place la connexion à notre serveur.
Configuration de la bibliothèque :
Créez un nouveau projet Xcode et ajoutez la bibliothèque XMPPFramework à vos dépendances de packages.

Se connecter au serveur:
Nous allons maintenant mettre en place la connexion au serveur XMPP en procédant comme suit :
1/ Créer une nouvelle classe Swift que nous appellerons XMPPModel.
2/ Ajouter des délégués pour initialiser la connexion.
3/ Se connecter et s’authentifier sur le serveur.
1/ Création du XMPPModel:
Nous allons commencer par créer une classe XMPPModel qui hérite de NSObject et ObservableObject. Nous allons y définir quelques variables :
Un userJID et un mot de passe, car une fois connecté, vous devrez vous authentifier !
Un XMPPStream, qui représente la connexion en cours avec votre serveur.
Un nom d’hôte (hostname) et un port (généralement 5222) pour spécifier l’adresse du serveur.
class XMPPModel: NSObject, ObservableObject{
var xmppStream: XMPPStream
var hostName: String
var hostPort: UInt16
var userJID: XMPPJID
var password: String
override init(){
let Id = "you"
let userJID = XMPPJID(string: "(Id)@server.hostname.com")
self.hostName = "server.hostname.com"
self.userJID = userJID!
self.hostPort = 5222
self.password = "MyVerySecurePassword"
self.xmppStream = XMPPStream()
self.xmppStream.hostName = hostName
self.xmppStream.hostPort = hostPort
self.xmppStream.startTLSPolicy = XMPPStreamStartTLSPolicy.allowed
self.xmppStream.myJID = userJID
super.init()
// We'll define these two in the next section
self.xmppStream.addDelegate(self, delegateQueue: DispatchQueue.main)
connect()
}
}
2/ Création du delegate:
Le delegate nous permet d’effectuer certaines actions lors de la connexion, de l’authentification ou en cas d’échec d’authentification. Cela le rend particulièrement utile pour informer l’utilisateur, par exemple, s’il a saisi des identifiants invalides.
extension XMPPModel: XMPPStreamDelegate {
func xmppStreamDidConnect(_ stream: XMPPStream) {
// We managed to connect to the server, huzzah!
print("Stream: Connected")
try! stream.authenticate(withPassword: self.password)
}
func xmppStreamDidAuthenticate(_ sender: XMPPStream) {
// We managed to identify!
print("Stream: Authenticated")
}
func xmppStream(_ sender: XMPPStream, didNotAuthenticate error: DDXMLElement) {
// Handle authentication errors here!
print("Stream: Fail to Authenticate")
}
3/ Connecting to the server
Connecting to the server is easy as we’ve set most of the parameters to do so alread:
func connect() {
//Double check we're not connected or connecting already!
if xmppStream.isConnected || xmppStream.isConnecting {
print("Already connected or connecting")
return
}
do {
try xmppStream.connect(withTimeout: XMPPStreamTimeoutNone)
print("Attempting to connect...")
} catch {
print("Failed to connect:(error.localizedDescription)")
}
}
Envoyer et recevoir des messages
Nous sommes maintenant connectés et authentifiés (en tout cas, on l’espère !).
La prochaine étape consiste à pouvoir envoyer et recevoir des messages !
Envoyer un message
Pour envoyer un message, implémentez la méthode suivante dans votre code :
func sendMessage(_ messageText: String, to recipientJID: XMPPJID) async {
//You can add your own stanzaID generator here, to identify stanzas sent from the app, for example
let stanzaID = "12345"
// Create a text message adressed to the recipient
let message = XMPPMessage(type: "chat", to: recipientJID, elementID: stanzaID)
// That's where you put the subject of your message!
message.addBody(messageText)
message.addSubject("Some subject")
xmppStream.send(message)
}
Pour créer un message, vous devrez donc :
1/ Spécifier un JID destinataire (l’adresse de la personne à qui vous envoyez le message sur le serveur), au format utilisateur@serveur.com, que vous pouvez générer avec le même constructeur XMPPJID utilisé pour la connexion.
2/ Spécifier un identifiant unique de stanza pour identifier votre message (stanza).
3/ Définir un corps (body) et éventuellement un sujet (subject) pour votre message.
Recevoir un message
Comme le dit l’adage, ce qui va revient — et cela s’applique aussi aux stanzas XMPP !
Pour recevoir un message, vous devrez modifier votre Delegate et implémenter la méthode suivante :
func xmppStream(_ sender: XMPPStream, didReceive message: XMPPMessage) {
print(message.body)
}
Dans cette méthode, vous pourrez ajouter tout ce que vous souhaitez faire pour traiter le message reçu, comme mettre à jour l’interface utilisateur, l’enregistrer dans une base de données, etc.
Notes de fin
Avec ce modèle, vous avez les bases nécessaires pour créer une connexion XMPP simple et fonctionnelle dans votre application iOS.
Nous aborderons dans un prochain article des fonctionnalités plus avancées de XMPPFramework, comme l’envoi de stanzas plus complexes, la participation à des salons de discussion, et bien d’autres encore !

Leave a comment