¿Cómo enviar SMS mediante progtwigción en el iPhone?

¿Alguien sabe si es posible, y cómo, enviar un SMS desde el iPhone , con el SDK / Cocoa Touch oficial?

Restricciones

Si puede enviar un SMS dentro de un progtwig en el iPhone, podrá escribir juegos que envíen spam a las personas en segundo plano. Estoy seguro de que realmente quieres tener spams de tus amigos, “¡Prueba este nuevo juego! ¡Roxxers my boxxers, y el tuyo también! Roxxersboxxers.com !!!! Si te registras ahora obtendrás 3,200 RB ¡¡puntos!!”

Apple tiene restricciones para las operaciones automatizadas (o incluso parcialmente automáticas) de SMS y marcado. (Imagínese si el juego marcó el 911 en un momento particular del día)

Su mejor opción es configurar un servidor intermedio en Internet que utilice un servicio de envío de SMS en línea y enviar los SMS a través de esa ruta si necesita una automatización completa. (es decir, su progtwig en el iPhone envía un paquete UDP a su servidor, que envía el SMS real)

Actualización de iOS 4

iOS 4, sin embargo, ahora proporciona un controlador de vista que puede importar a su aplicación. Usted rellena previamente los campos de SMS, luego el usuario puede iniciar el envío de SMS dentro del controlador. A diferencia del uso del formato url “sms: …”, esto permite que su aplicación permanezca abierta y le permite completar los campos a y cuerpo . Incluso puede especificar múltiples destinatarios.

Esto evita que las aplicaciones envíen mensajes SMS automáticos sin que el usuario tenga conocimiento explícito de ello. Aún no puede enviar SMS totalmente automatizados desde el iPhone, requiere cierta interacción del usuario. Pero al menos esto le permite completar todo y evita cerrar la aplicación.

La clase MFMessageComposeViewController está bien documentada y los tutoriales muestran cuán fácil es implementarla.

Actualización de iOS 5

iOS 5 incluye mensajería para iPod touch y dispositivos iPad, por lo que aunque aún no lo he probado, es posible que todos los dispositivos iOS puedan enviar SMS a través de MFMessageComposeViewController. Si este es el caso, entonces Apple está ejecutando un servidor de SMS que envía mensajes en nombre de dispositivos que no tienen un módem celular.

Actualización de iOS 6

Sin cambios a esta clase

Actualización iOS 7

Ahora puede verificar si el medio de mensaje que está utilizando aceptará un tema o archivos adjuntos, y qué tipo de archivos adjuntos aceptará. Puede editar el asunto y agregar archivos adjuntos al mensaje, donde el medio lo permita.

Actualización de iOS 8

Sin cambios a esta clase

Actualización de iOS 9

Sin cambios a esta clase

Actualización de iOS 10

Sin cambios a esta clase

Actualización de iOS 11

Sin cambios significativos a esta clase

Limitaciones a esta clase

Tenga en cuenta que esto no funcionará en teléfonos sin iOS 4, y no funcionará en el iPod touch o el iPad, excepto, tal vez, en iOS 5. Debe detectar las limitaciones del dispositivo y iOS antes de usar este controlador, o se arriesga a restringir su aplicación a 3G, 3GS y 4 iPhones actualizados recientemente.

Sin embargo, un servidor intermedio que envía SMS permitirá que todos y cada uno de estos dispositivos iOS envíen SMS siempre que tengan acceso a Internet, por lo que puede ser una solución mejor para muchas aplicaciones. De forma alternativa, use ambos, y solo recurra a un servicio de SMS en línea cuando el dispositivo no lo admita.

Aquí hay un tutorial que hace exactamente lo que está buscando: el MFMessageComposeViewController .

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

Esencialmente:

 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]; } 

Y un enlace a los documentos.

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

  1. Debe agregar MessageUI.framework a su proyecto de Xcode
  2. Incluye un #import en tu archivo de cabecera
  3. Agregue estos delegates a su archivo de encabezado MFMessageComposeViewControllerDelegate & UINavigationControllerDelegate
  4. En su método IBAction , declare la instancia de MFMessageComposeViewController say messageInstance
  5. Para verificar si su dispositivo puede enviar texto use [MFMessageComposeViewController canSendText] en una condición if, devolverá Yes / No
  6. En la condición if , haga esto:

    1. Primer conjunto de cuerpo para su messageInstance como:

       messageInstance.body = @"Hello from Shah"; 
    2. Luego, decida los destinatarios del mensaje como:

       messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321", nil]; 
    3. Establezca un delegado en su mensajeInstance como:

       messageInstance.messageComposeDelegate = self; 
    4. En la última línea haz esto:

       [self presentModalViewController:messageInstance animated:YES]; 

Puede usar una URL de sms:[target phone number] para abrir la aplicación de SMS, pero no hay indicaciones sobre cómo rellenar previamente un cuerpo de SMS con texto (consulte esta publicación en los foros de desarrolladores de Apple).

Uno de los sistemas de comunicación entre procesos en MacOS es XPC. Esta capa del sistema se ha desarrollado para la comunicación entre procesos basada en la transferencia de estructuras plist usando libSystem y launchd. De hecho, es una interfaz que permite gestionar procesos mediante el intercambio de tales estructuras como diccionarios. Debido a la herencia, iOS 5 posee este mecanismo también.

Quizás ya entiendas lo que quiero decir con esta introducción. Sí, hay servicios de sistema en iOS que incluyen herramientas para la comunicación XPC. Y quiero ejemplificar el trabajo con un daemon para el envío de SMS. Sin embargo, debe mencionarse que esta capacidad está solucionada en iOS 6, pero es relevante para iOS 5.0-5.1.1. Jailbreak, Private Framework y otras herramientas ilegales no son necesarios para su explotación. Solo se necesita el conjunto de archivos de encabezado del directorio / usr / include / xpc / *.

Uno de los elementos para el envío de SMS en iOS es el servicio de sistema com.apple.chatkit, cuyas tareas incluyen generación, administración y envío de mensajes cortos de texto. Para facilitar el control, tiene el puerto de comunicación públicamente disponible com.apple.chatkit.clientcomposeserver.xpc. Usando el subsistema XPC, puede generar y enviar mensajes sin la aprobación del usuario.

Bueno, intentemos crear una conexión.

 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); 

Ahora tenemos la conexión XPC myConnection configurada para el servicio de envío de SMS. Sin embargo, la configuración de XPC proporciona la creación de conexiones suspendidas, debemos dar un paso más para la activación.

 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 conexión está activada. Justo en este momento, iOS 6 mostrará un mensaje en el registro telefónico que prohíbe este tipo de comunicación. Ahora necesitamos generar un diccionario similar a xpc_dictionary con los datos requeridos para el envío del mensaje.

 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!"); 

Poco queda: envíe el mensaje al puerto XPC y asegúrese de que se entregue.

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

Eso es todo. SMS enviado.

Agregue MessageUI.Framework y use el siguiente código

 #import  

Y entonces:

 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]; } 

y el método delegado –

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

Puedes usar este enfoque:

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

iOS navegará automáticamente desde su aplicación a la página de composición de mensajes de la aplicación de mensajes. Como el esquema de la URL comienza con sms :, se identifica como un tipo que reconoce la aplicación de mensajes y lo inicia.

Sigue estos procedimientos

1. MessageUI.Framework para proyectar enter image description here

2. Importar #import en archivo .h.

3. Copia este código para enviar un mensaje

  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. Implemente el método de delegate si lo desea.

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

¡Corre Y VAYA!

 //Add the Framework in .h file #import  #import  //Set the delegate methods UIViewController //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]; } 

Aquí está la versión Swift de código para enviar SMS en iOS. Tenga en cuenta que solo funciona en dispositivos reales. Código probado en iOS 7+. Puedes leer más aquí .

1) Cree una nueva Clase que herede MFMessageComposeViewControllerDelegate y 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) Cómo usar esta clase:

 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.") } } 

Hay una clase en iOS 4 que admite el envío de mensajes con cuerpo y recipents desde su aplicación. Funciona igual que enviar correo. Puede encontrar la documentación aquí: enlace de texto

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

// método de llamada con nombre y número.

 -(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étodo para enviar mensajes

 - (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]; } } 

Si lo desea, puede usar el marco privado CoreTelephony que llamó a la clase CTMessageCenter . Hay algunos métodos para enviar sms.

Utilizar esta:

 - (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]; } 
 [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms:number"]] 

Esta sería la mejor y más corta forma de hacerlo.

Puede presentar MFMessageComposeViewController, que puede enviar SMS, pero con el aviso del usuario (toca el botón de enviar). No hay forma de hacerlo sin el permiso del usuario. En iOS 11, puede hacer una extensión, que puede ser como un filtro para los mensajes entrantes, y le dice a iOS que es spam o no. Nada más con SMS no se puede hacer

Debe usar MFMessageComposeViewController si desea mostrar la creación y el envío del mensaje en su propia aplicación.

De lo contrario, puede usar el método sharedApplication .

Muchas respuestas, pero si realmente necesitas SmS automáticamente y no usar el compositor, simplemente puedes llamar a twilio api.

Y aquí hay una lista con más de 50 api para enviar sms de casi cualquier aplicación.