Est-ce que quelqu'un sait s'il est possible, et comment, d'envoyer un SMS de manière programmée depuis l'iPhone, avec le SDK officiel / Cocoa Touch ?
Réponses
Trop de publicités?Restrictions
Si l'on peut envoyer un SMS à l'intérieur d'un programme sur l'iPhone, on pourra écrire des jeux qui spamment les gens en arrière-plan. Je suis sûr que vous voulez vraiment recevoir des spams de vos amis, "Essayez ce nouveau jeu ! Il roxxers mes boxxers, et les vôtres le seront aussi ! roxxersboxxers.com !!!! Si tu t'inscris maintenant, tu recevras 3 200 points RB !"
Apple impose des restrictions aux opérations automatisées (ou même partiellement automatisées) de SMS et de numérotation. (Imaginez que le jeu compose plutôt le 911 à une heure particulière de la journée)
Le mieux est d'installer un serveur intermédiaire sur Internet qui utilise un service d'envoi de SMS en ligne, et d'envoyer les SMS par cette voie si vous souhaitez une automatisation complète. (Par exemple, votre programme sur l'iPhone envoie un paquet UDP à votre serveur, qui envoie le vrai SMS).
Mise à jour d'iOS 4
Toutefois, iOS 4 propose désormais un viewcontroller que vous pouvez importer dans votre application. Vous pré-remplissez les champs SMS, puis l'utilisateur peut lancer l'envoi du SMS dans le contrôleur. Contrairement à l'utilisation du format d'url "sms :...", cette méthode permet à votre application de rester ouverte et vous permet de remplir à la fois les champs "sms :..." et "sms :...". à et le corps champs. Vous pouvez même spécifier plusieurs destinataires.
Cela empêche les applications d'envoyer des SMS automatisés sans que l'utilisateur en soit explicitement conscient. Il n'est toujours pas possible d'envoyer des SMS entièrement automatisés à partir de l'iPhone lui-même, car cela nécessite une certaine interaction avec l'utilisateur. Mais cela vous permet au moins de tout remplir, et évite de fermer l'application.
Le site MFMessageComposeViewController est bien documentée, et tutoriels montrent à quel point il est facile à mettre en œuvre.
Mise à jour d'iOS 5
iOS 5 inclut la messagerie pour les appareils iPod touch et iPad, donc bien que je ne l'ai pas encore testé moi-même, il se peut que tous les appareils iOS soient en mesure d'envoyer des SMS via MFMessageComposeViewController. Si c'est le cas, alors Apple gère un serveur SMS qui envoie des messages au nom des appareils qui ne disposent pas d'un modem cellulaire.
Mise à jour d'iOS 6
Aucun changement pour cette classe.
Mise à jour d'iOS 7
Vous pouvez désormais vérifier si le support de message que vous utilisez accepte un objet ou des pièces jointes, et quel type de pièces jointes il accepte. Vous pouvez modifier l'objet et ajouter des pièces jointes au message, si le support le permet.
Limites de cette classe
Gardez à l'esprit que cette manette ne fonctionnera pas sur les téléphones sans iOS 4, et qu'elle ne fonctionnera pas sur l'iPod touch ou l'iPad, sauf, peut-être, sous iOS 5. Vous devez détecter les limitations de l'appareil et d'iOS avant d'utiliser ce contrôleur, ou risquer de limiter 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 dès lors qu'ils disposent d'un accès à Internet, ce qui peut donc constituer une meilleure solution pour de nombreuses applications. Vous pouvez aussi utiliser les deux et ne recourir à un service SMS en ligne que lorsque l'appareil ne le prend pas en charge.
Voici un tutoriel qui fait exactement ce que vous recherchez : 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.
- vous devez ajouter MessageUI.framework à votre projet Xcode
- inclure un
#import <MessageUI/MessageUI.h>
dans votre fichier d'en-tête - Ajoutez ces délégués à votre fichier d'en-tête
MFMessageComposeViewControllerDelegate
&UINavigationControllerDelegate
- Dans votre
IBAction
déclare une instance deMFMessageComposeViewController
ditesmessageInstance
- pour vérifier si votre appareil peut envoyer du texte, utilisez
[MFMessageComposeViewController canSendText]
dans la condition if, il retournera Oui/Non -
dans le
if
l'état fait ça :-
premier corps de réglage pour votre
messageInstance
comme :messageInstance.body = @"Hello from Shah";
-
puis décide des destinataires du message comme :
messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321", nil];
-
définir un délégué à votre messageInstance en tant que :
messageInstance.messageComposeDelegate = self;
-
En dernier lieu, faites ceci
[self presentModalViewController:messageInstance animated:YES];
-
L'un des systèmes de communication interprocessus de 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 en utilisant libSystem et launchd. En fait, il s'agit d'une interface qui permet de gérer les processus via l'échange de telles structures comme le dictionnaire. Par 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 pour la communication XPC. Et je veux illustrer le travail avec le démon pour l'envoi de SMS. Cependant, il faut mentionner que cette capacité est corrigée dans iOS 6, mais est pertinente pour iOS 5.0-5.1.1. Le jailbreak, le Private Framework et d'autres outils illégaux ne sont pas nécessaires 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 permettant l'envoi de SMS dans iOS est le service système com.apple.chatkit, dont les tâches comprennent la génération, la gestion et l'envoi de messages texte courts. Pour faciliter le contrôle, il dispose du port de communication publiquement disponible com.apple.chatkit.clientcomposeserver.xpc. En utilisant le sous-système XPC, vous pouvez générer et envoyer des messages sans l'approbation de l'utilisateur.
Essayons de créer des liens.
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);
Maintenant nous avons la connexion XPC myconnection 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 an message event!");
});
xpc_connection_resume(myconnection);
La connexion est activée. À ce moment précis, iOS 6 affichera un message dans le journal du téléphone indiquant que ce type de communication est interdit. Maintenant, nous devons générer un dictionnaire similaire à xpc_dictionary avec les données requises pour l'envoi du message.
NSArray *receipements = [NSArray arrayWithObjects:@"+7 (90*) 000-00-00", nil];
NSData *ser_rec = [NSPropertyListSerialization dataWithPropertyList:receipements 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 qu'à envoyer le message au port XPC et à s'assurer qu'il est livré.
xpc_connection_send_message(myconnection, mydict);
xpc_connection_send_barrier(myconnection, ^{
NSLog(@"Message has been successfully delievered");
});
C'est tout. Les SMS sont partis.