Comment envoyer par SMS des SMS sur l'iPhone?


526

Est-ce que quelqu'un sait s'il est possible, et comment, d'envoyer par SMS un SMS depuis le iPhone, avec le SDK / Cocoa Touch officiel?


dans Ios 4 Vous pouvez envoyer des sms avec du code mais le problème est que votre application sera fermée
Pankaj Kainthla

Si l'utilisation du SDK officiel n'est pas une exigence pour les autres, j'ai écrit ce post pour montrer comment le faire en utilisant Twilio: twilio.com/blog/2016/11/…
Megan Speir

vous pouvez créer une feuille de calcul google à partir de votre gmail, créer les champs que vous souhaitez, puis faire tools->script editoret dans une demande POST utiliser l' MailApp.sendEmailapi pour envoyer un e-mail à un numéro de téléphone. att est YOURNUMBER@mms.att.net, tmobile est YOURNUMBER@tmomail.net je pense (TOUT GRATUIT)
Coty Embry

Réponses:


404

Restrictions

Si vous pouviez envoyer un SMS dans un programme sur l'iPhone, vous pourrez écrire des jeux qui spamment les gens en arrière-plan. Je suis sûr que vous voulez vraiment avoir des spams de vos amis, "Essayez ce nouveau jeu! Il roxxers mes boxxers, et le vôtre aussi! Roxxersboxxers.com !!!! Si vous vous inscrivez maintenant, vous obtiendrez 3200 RB points!!"

Apple a des restrictions pour les opérations automatisées (ou même partiellement automatisées) de SMS et de numérotation. (Imaginez si le jeu composait plutôt le 911 à une heure particulière de la journée)

Votre meilleur pari est de mettre en place un serveur intermédiaire sur Internet qui utilise un service d'envoi de SMS en ligne et d'envoyer le SMS via cette route si vous avez besoin d'une automatisation complète. (c'est-à-dire que votre programme sur l'iPhone envoie un paquet UDP à votre serveur, qui envoie le vrai SMS)

Mise à jour iOS 4

Cependant, iOS 4 propose désormais un outil que viewControllervous pouvez importer dans votre application. Vous préremplissez les champs SMS, puis l'utilisateur peut lancer l'envoi de SMS dans le contrôleur. Contrairement à l'utilisation du format d'URL "SMS: ...", cela permet à votre application de rester ouverte et de remplir à la fois les champs to et body . Vous pouvez même spécifier plusieurs destinataires.

Cela empêche les applications d'envoyer des SMS automatisés sans que l'utilisateur ne le sache explicitement. Vous ne pouvez toujours pas envoyer de SMS entièrement automatisé depuis l'iPhone lui-même, cela nécessite une certaine interaction de l'utilisateur. Mais cela vous permet au moins de tout remplir et évite de fermer l'application.

La classe MFMessageComposeViewController est bien documentée et les didacticiels montrent à quel point il est facile à implémenter.

Mise à jour iOS 5

iOS 5 inclut la messagerie pour les appareils iPod touch et iPad, donc même si je n'ai pas encore testé cela moi-même, il se peut que tous les appareils iOS puissent envoyer des SMS via MFMessageComposeViewController. Si tel est le cas, Apple exécute un serveur SMS qui envoie des messages au nom d'appareils qui ne disposent pas d'un modem cellulaire.

Mise à jour iOS 6

Aucun changement à cette classe.

Mise à jour iOS 7

Vous pouvez maintenant vérifier si le support de message que vous utilisez acceptera un objet ou des pièces jointes, et quel type de pièces jointes il acceptera. Vous pouvez modifier le sujet et ajouter des pièces jointes au message, lorsque le support le permet.

Mise à jour iOS 8

Aucun changement à cette classe.

Mise à jour iOS 9

Aucun changement à cette classe.

Mise à jour iOS 10

Aucun changement à cette classe.

Mise à jour iOS 11

Aucun changement significatif à cette classe

Limitations de cette classe

Gardez à l'esprit que cela ne fonctionnera pas sur les téléphones sans iOS 4 et ne fonctionnera pas sur l'iPod touch ou l'iPad, sauf, peut-être, sous iOS 5. Vous devez soit détecter l'appareil et les limitations iOS avant d'utiliser ce contrôleur, ou risquez de restreindre votre application aux iPhones 3G, 3GS et 4 récemment mis à niveau.

Cependant, un serveur intermédiaire qui envoie des SMS permettra à tous ces appareils iOS d'envoyer des SMS tant qu'ils auront accès à Internet, ce qui peut donc être une meilleure solution pour de nombreuses applications. Vous pouvez également utiliser les deux et ne recourir à un service SMS en ligne que lorsque l'appareil ne le prend pas en charge.


12
Et si vous achetez ce domaine, je ne pourrai plus jamais vous regarder de la même façon.
Adam Davis,

79
Je pense qu'il est ironique que quelqu'un ait signalé ce message comme spam. Lisez entre les lignes, peuples!
Randolpho le

2
-1 car cela se lit comme une spéculation. Voir également les réponses de Jus 'Wondrin' et rydgaze sur la façon d'envoyer des SMS intégrés à l'application.
Frank Shearar

8
@Frank - Mise à jour de mon écriture pour refléter les nouvelles fonctionnalités iOS 4. Suppression du libellé insipide.
Adam Davis,

13
J'apprécie vraiment que vous gardiez ce post mis à jour pour les nouvelles versions iOS. :)
Ciryon

143

Voici un tutoriel qui fait exactement ce que vous cherchez: le MFMessageComposeViewController.

http://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/

Essentiellement:

MFMessageComposeViewController *controller = [[[MFMessageComposeViewController alloc] init] autorelease];
if([MFMessageComposeViewController canSendText])
{
    controller.body = @"SMS message here";
    controller.recipients = [NSArray arrayWithObjects:@"1(234)567-8910", nil];
    controller.messageComposeDelegate = self;
    [self presentModalViewController:controller animated:YES];
}

Et un lien vers les documents.

https://developer.apple.com/documentation/messageui/mfmessagecomposeviewcontroller


encore, le formulaire SMS doit apparaître. Une façon d'envoyer en arrière-plan?
Raptor

5
Vous pouvez certainement envoyer des SMS en arrière-plan en utilisant un service tel que Twilio, mais si vous souhaitez l'envoyer à partir du numéro de téléphone de l'utilisateur, il doit approuver le message via la méthode ci-dessus.
Daniel Amitay

3
toute personne utilisant le code ci-dessus peut envisager de mettre l' MFMessageComposeViewController *controller = ...intérieur du bloc if. (la méthode de classe n'a pas besoin d'avoir une instance pour faire le test)
non synchronisé

Le lien http://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/indique "502 Bad Gateway" sur mon ordinateur portable. Peut-être que le lien est rompu.
Nikita Vlasenko

99
  1. Vous devez ajouter le MessageUI.framework à votre projet Xcode
  2. Inclure un #import <MessageUI/MessageUI.h>dans votre fichier d'en-tête
  3. Ajoutez ces délégués à votre fichier d'en-tête MFMessageComposeViewControllerDelegate &UINavigationControllerDelegate
  4. Dans votre IBActionméthode, déclarez l'instance de MFMessageComposeViewControllersaymessageInstance
  5. Pour vérifier si votre appareil peut envoyer du texte [MFMessageComposeViewController canSendText]dans un état if, il retournera Oui / Non
  6. Dans la ifcondition, faites-les:

    1. Premier corps défini pour votre en messageInstancetant que:

      messageInstance.body = @"Hello from Shah";
    2. Choisissez ensuite les destinataires du message comme:

      messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321",         nil];
    3. Définissez un délégué à votre messageInstance comme:

      messageInstance.messageComposeDelegate = self;
    4. Dans la dernière ligne, procédez comme suit:

      [self presentModalViewController:messageInstance animated:YES];

2
Remarque sur la version: presentModalViewController:animated:est obsolète; utiliser à la presentViewController:animated:completion:place. N'oubliez pas non plus de définir la méthode déléguée - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)resultsi vous souhaitez connaître les résultats.
Raptor

Veuillez mettre le code pour le test. @Najeebullah Shah ici ou dans github.

50

Vous pouvez utiliser une sms:[target phone number]URL pour ouvrir l'application SMS, mais rien n'indique comment préremplir un corps SMS avec du texte.


react-native-communications utilise le paramètre & body = pour préremplir le texte lors de l'ouverture des sms: targetphonenumber & body = textyouwanttoprefillwith pour iOS
Doug Voss

Je viens d'essayer cela sur mon iphone 8, et cela a très bien fonctionné ... merci!
Brad Parks

J'ai besoin d'envoyer un sms à un numéro spécifique mais avec un corps de texte prédéfini (prérempli). Le corps du texte doit être la sélection manuelle parmi 4 options possibles. Par exemple, l'application s'ouvre et des fenêtres contextuelles "sélectionnez la raison". Ensuite, 4 options sont disponibles. L'utilisateur sélectionne ensuite l'une de ces 4 options puis un SMS automatique est envoyé avec comme corps de texte le choix de l'utilisateur. une astuce?
seralouk

25

L'un des systèmes de communication inter-processus sous MacOS est XPC. Cette couche système a été développée pour la communication inter-processus basée sur le transfert de structures plist à l'aide de libSystem et launchd. En fait, c'est une interface qui permet de gérer des processus via l'échange de structures telles que des dictionnaires. En raison de l'hérédité, iOS 5 possède également ce mécanisme.

Vous comprenez peut-être déjà ce que je veux dire par cette introduction. Oui, il existe des services système dans iOS qui incluent des outils de communication XPC. Et je veux illustrer le travail avec un démon pour l'envoi de SMS. Cependant, il convient de mentionner que cette capacité est corrigée dans iOS 6, mais est pertinente pour iOS 5.0—5.1.1. Jailbreak, Private Framework et autres outils illégaux ne sont pas requis pour son exploitation. Seul l'ensemble des fichiers d'en-tête du répertoire / usr / include / xpc / * est nécessaire.

L'un des éléments de l'envoi de SMS dans iOS est le service système com.apple.chatkit, dont les tâches incluent la génération, la gestion et l'envoi de courts messages texte. Pour la facilité de contrôle, il dispose du port de communication accessible au public com.apple.chatkit.clientcomposeserver.xpc. À l'aide du sous-système XPC, vous pouvez générer et envoyer des messages sans l'approbation de l'utilisateur. 

Eh bien, essayons de créer une connexion.

xpc_connection_t myConnection;

dispatch_queue_t queue = dispatch_queue_create("com.apple.chatkit.clientcomposeserver.xpc", DISPATCH_QUEUE_CONCURRENT);

myConnection = xpc_connection_create_mach_service("com.apple.chatkit.clientcomposeserver.xpc", queue, XPC_CONNECTION_MACH_SERVICE_PRIVILEGED);

Nous avons maintenant la connexion XPC myConnection définie au service d'envoi de SMS. Cependant, la configuration XPC prévoit la création de connexions suspendues - nous devons faire un pas de plus pour l'activation.

xpc_connection_set_event_handler(myConnection, ^(xpc_object_t event){
xpc_type_t xtype = xpc_get_type(event);
if(XPC_TYPE_ERROR == xtype)
{
NSLog(@"XPC sandbox connection error: %s\n", xpc_dictionary_get_string(event, XPC_ERROR_KEY_DESCRIPTION));
}
// Always set an event handler. More on this later.

NSLog(@"Received a message event!");

});

xpc_connection_resume(myConnection);

La connexion est activée. À ce moment, iOS 6 affichera un message dans le journal téléphonique indiquant que ce type de communication est interdit. Nous devons maintenant générer un dictionnaire similaire à xpc_dictionary avec les données requises pour l'envoi du message.

NSArray *recipient = [NSArray arrayWithObjects:@"+7 (90*) 000-00-00", nil];

NSData *ser_rec = [NSPropertyListSerialization dataWithPropertyList:recipient format:200 options:0 error:NULL];

xpc_object_t mydict = xpc_dictionary_create(0, 0, 0);
xpc_dictionary_set_int64(mydict, "message-type", 0);
xpc_dictionary_set_data(mydict, "recipients", [ser_rec bytes], [ser_rec length]);
xpc_dictionary_set_string(mydict, "text", "hello from your application!");

Il ne reste plus grand chose: envoyez le message au port XPC et assurez-vous qu'il est bien livré.

xpc_connection_send_message(myConnection, mydict);
xpc_connection_send_barrier(myConnection, ^{
NSLog(@"The message has been successfully delivered");
});

C'est tout. SMS envoyé.


1
Vous ne devez pas utiliser XPC pour envoyer des SMS. L'application produite ne sera pas approuvée par Apple. Utilisez plutôt MessageUI Framework
Raptor

Si vous utilisez cette technologie pour l'application que vous utilisez pour votre organisation et que l'application ne passe pas par l'App Store, vous n'avez aucun souci.
Martin Berger

Est-ce que cela fonctionne sur les versions iOS 10+?
Martin Berger

Obtenir "Erreur de connexion au bac à sable XPC: connexion non valide" sur iOS 12
Martin Berger

23

Ajoutez le MessageUI.Framework et utilisez le code suivant

#import <MessageUI/MessageUI.h> 

Et alors:

if ([MFMessageComposeViewController canSendText]) {
  MFMessageComposeViewController *messageComposer =
  [[MFMessageComposeViewController alloc] init];
  NSString *message = @"Your Message here";
  [messageComposer setBody:message];
  messageComposer.messageComposeDelegate = self;
  [self presentViewController:messageComposer animated:YES completion:nil];
}

et la méthode déléguée -

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller
             didFinishWithResult:(MessageComposeResult)result {
      [self dismissViewControllerAnimated:YES completion:nil];
 }

Hé c'est très bien, mais pouvons-nous faire cette fonctionnalité en arrière-plan?
Raj

3
Apple ne vous autorisera pas à envoyer de message sans l'approbation des utilisateurs. Il doit envoyer un message / mail en appuyant manuellement sur le bouton. Alternativement, vous pouvez utiliser un service personnalisé en envoyant des e-mails / numéros à votre backend, puis en envoyant. Bien que vous ne puissiez pas le faire directement sur iPhone
Bharat Gulati

21

Vous pouvez utiliser cette approche:

[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms:MobileNumber"]]


iOS naviguera automatiquement de votre application vers la page de composition des messages de l'application Messages. Étant donné que le schéma de l'URL commence par sms :, celui-ci est identifié comme un type reconnu par l'application de messages et le lance.


12
//Add the Framework in .h file

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

//Set the delegate methods

UIViewController<UINavigationControllerDelegate,MFMessageComposeViewControllerDelegate>

//add the below code in .m file


- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    MFMessageComposeViewController *controller = 
    [[[MFMessageComposeViewController alloc] init] autorelease];

    if([MFMessageComposeViewController canSendText])
    { 
        NSString *str= @"Hello";
        controller.body = str;
        controller.recipients = [NSArray arrayWithObjects:
                                 @"", nil];
        controller.delegate = self;
        [self presentModalViewController:controller animated:YES];  
    }


}

- (void)messageComposeViewController:
(MFMessageComposeViewController *)controller
                 didFinishWithResult:(MessageComposeResult)result 
{
    switch (result)
    {
        case MessageComposeResultCancelled:  
            NSLog(@"Cancelled");    
            break; 
        case MessageComposeResultFailed:
            NSLog(@"Failed");
            break;   
        case MessageComposeResultSent:      
            break; 
        default:  
            break;  
    }  
    [self dismissModalViewControllerAnimated:YES]; 
}

vous devriez voir ce lien: blog.mugunthkumar.com/coding/… cela vous aidera
Banker Mittal

12

Suivez ces procédures

1 .Ajouter MessageUI.Frameworkau projetentrez la description de l'image ici

2. Importez #import <MessageUI/MessageUI.h>dans un fichier .h.

3. Copiez ce code pour envoyer un message

 if ([MFMessageComposeViewController canSendText]) {
    MFMessageComposeViewController *messageComposer =
    [[MFMessageComposeViewController alloc] init];
    NSString *message = @"Message!!!";
    [messageComposer setBody:message];
    messageComposer.messageComposeDelegate = self;
    [self presentViewController:messageComposer animated:YES completion:nil];
}

4. Implémentez la delegateméthode si vous le souhaitez.

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{


   ///your stuff here 

    [self dismissViewControllerAnimated:YES completion:nil];
}

Courez et partez!


il convient de mentionner que vous voudrez probablement exécuter la méthode de rappel à l' [self dismissViewControllerAnimated:YES completion:nil];intérieur messageComposeViewController: didFinishWithResult:. Sinon, il y restera.
SaltyNuts

5

Voici la version Swift du code pour envoyer des SMS dans iOS. Veuillez noter que cela ne fonctionne que sur des appareils réels. Code testé dans iOS 7+. Vous pouvez en lire plus ici .

1) Créez une nouvelle classe qui hérite de MFMessageComposeViewControllerDelegate et NSObject:

import Foundation
import MessageUI

class MessageComposer: NSObject, MFMessageComposeViewControllerDelegate {
    // A wrapper function to indicate whether or not a text message can be sent from the user's device
    func canSendText() -> Bool {
        return MFMessageComposeViewController.canSendText()
    }

    // Configures and returns a MFMessageComposeViewController instance
    func configuredMessageComposeViewController(textMessageRecipients:[String] ,textBody body:String) -> MFMessageComposeViewController {
        let messageComposeVC = MFMessageComposeViewController()
        messageComposeVC.messageComposeDelegate = self  //  Make sure to set this property to self, so that the controller can be dismissed!
        messageComposeVC.recipients = textMessageRecipients
        messageComposeVC.body = body
        return messageComposeVC
    }

    // MFMessageComposeViewControllerDelegate callback - dismisses the view controller when the user is finished with it
    func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) {
        controller.dismissViewControllerAnimated(true, completion: nil)
        }
}

2) Comment utiliser cette classe:

func openMessageComposerHelper(sender:AnyObject ,withIndexPath indexPath: NSIndexPath) {
    var recipients = [String]()

    //modify your recipients here

    if (messageComposer.canSendText()) {
        println("can send text")
        // Obtain a configured MFMessageComposeViewController
        let body = Utility.createInvitationMessageText()

        let messageComposeVC = messageComposer.configuredMessageComposeViewController(recipients, textBody: body)

        // Present the configured MFMessageComposeViewController instance
        // Note that the dismissal of the VC will be handled by the messageComposer instance,
        // since it implements the appropriate delegate call-back
        presentViewController(messageComposeVC, animated: true, completion: nil)
    } else {
        // Let the user know if his/her device isn't able to send text messages
        self.displayAlerViewWithTitle("Cannot Send Text Message", andMessage: "Your device is not able to send text messages.")
    }
}

3

Il existe une classe dans iOS 4 qui prend en charge l'envoi de messages avec le corps et les destinataires de votre application. Cela fonctionne de la même manière que l'envoi de courrier. Vous pouvez trouver la documentation ici: texte du lien


3
- (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients
{
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    UIImage *ui =resultimg.image;
    pasteboard.image = ui;
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:"]];
}

4
Quelle est l'utilité de vos paramètres?
martinsurleweb

[[UIApplication sharedApplication] openURL: [NSURL URLWithString: @ "sms:"]]];
Amr Angry

3

// méthode d'appel avec nom et numéro.

-(void)openMessageViewWithName:(NSString*)contactName withPhone:(NSString *)phone{

CTTelephonyNetworkInfo *networkInfo=[[CTTelephonyNetworkInfo alloc]init];

CTCarrier *carrier=networkInfo.subscriberCellularProvider;

NSString *Countrycode = carrier.isoCountryCode;

if ([Countrycode length]>0)     //Check If Sim Inserted
{

    [self sendSMS:msg recipientList:[NSMutableArray arrayWithObject:phone]];
}
else
{

    [AlertHelper showAlert:@"Message" withMessage:@"No sim card inserted"];
}

}

// Méthode d'envoi du message

- (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSMutableArray *)recipients{  
 MFMessageComposeViewController *controller1 = [[MFMessageComposeViewController alloc] init] ;
 controller1 = [[MFMessageComposeViewController alloc] init] ;
 if([MFMessageComposeViewController canSendText])
{
    controller1.body = bodyOfMessage;
    controller1.recipients = recipients;
    controller1.messageComposeDelegate = self;
    [self presentViewController:controller1 animated:YES completion:Nil];
 }
}

2

Si vous le souhaitez, vous pouvez utiliser le framework privé CoreTelephonyqui a appelé la CTMessageCenterclasse. Il existe plusieurs méthodes pour envoyer des SMS.


1
Il a spécifiquement demandé si cela était possible en utilisant le SDK officiel.
Quentamia

1
Pouvez-vous fournir plus d'informations sur l'API privée? Je n'ai aucun problème à utiliser un framework privé car je n'ai pas besoin de le publier sur l'App Store.
Bagusflyer

1

Utilisez ceci:

- (void)showSMSPicker
{
    Class messageClass = (NSClassFromString(@"MFMessageComposeViewController"));

    if (messageClass != nil) {          
        // Check whether the current device is configured for sending SMS messages
        if ([messageClass canSendText]) {
           [self displaySMSComposerSheet];
        }   
    }
}

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{       
    //feedbackMsg.hidden = NO;
    // Notifies users about errors associated with the interface
    switch (result)
    {
        case MessageComposeResultCancelled:
        {   
            UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"Message" message:@"SMS sending canceled!!!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
            [alert1 show];
            [alert1 release];
        }   

        // feedbackMsg.text = @"Result: SMS sending canceled";
        break;

        case MessageComposeResultSent:
        {
            UIAlertView *alert2 = [[UIAlertView alloc] initWithTitle:@"Message" message:@"SMS sent!!!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
            [alert2 show];
            [alert2 release];
        }   

        // feedbackMsg.text = @"Result: SMS sent";
        break;

        case MessageComposeResultFailed:
        {   
            UIAlertView *alert3 = [[UIAlertView alloc] initWithTitle:@"Message" message:@"SMS sending failed!!!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
            [alert3 show];
            [alert3 release];
        }   

        // feedbackMsg.text = @"Result: SMS sending failed";
        break;

        default:
        {   
            UIAlertView *alert4 = [[UIAlertView alloc] initWithTitle:@"Message" message:@"SMS not sent!!!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
            [alert4 show];
            [alert4 release];
        }   

        // feedbackMsg.text = @"Result: SMS not sent";
        break;
    }

    [self dismissModalViewControllerAnimated: YES];
}

1
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms:number"]] 

Ce serait le meilleur et le plus court moyen de le faire.


1

Vous pouvez présenter MFMessageComposeViewController, qui peut envoyer des SMS, mais avec une invite de l'utilisateur (il appuie sur le bouton Envoyer). Aucun moyen de le faire sans l'autorisation de l'utilisateur. Sur iOS 11, vous pouvez créer une extension, qui peut être comme un filtre pour les messages entrants, indiquant à iOS son spam ou non. Rien de plus avec SMS ne peut pas être fait


La nouvelle réponse!
Fattie

0

Vous devez utiliser le MFMessageComposeViewController si vous souhaitez montrer la création et l'envoi du message dans votre propre application.

Sinon, vous pouvez utiliser la méthode sharedApplication .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.