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

526

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

Nitin Gohel
fuente
en Ios 4 Puede enviar sms con código pero el problema es que su aplicación se cerrará
Pankaj Kainthla
Si usar el SDK oficial no es un requisito para otros, escribí esta publicación para mostrar cómo hacerlo usando Twilio: twilio.com/blog/2016/11/…
Megan Speir
puede crear una hoja de cálculo de Google desde su cuenta de gmail, hacer los campos que desee, luego hacer tools->script editory en una solicitud POST usar MailApp.sendEmailapi para enviar correos electrónicos a un número de teléfono. att's es [email protected], tmobile's es [email protected] Creo (TODO GRATIS)
Coty Embry

Respuestas:

404

Restricciones

Si pudieras enviar un SMS dentro de un programa en el iPhone, podrás escribir juegos que envíen spam a las personas en segundo plano. Estoy seguro de que realmente quieres recibir spam de tus amigos: "¡Prueba este nuevo juego! Roxxers mis boxxers, ¡y el tuyo también! Roxxersboxxers.com !!!! Si te registras ahora obtendrás 3.200 RB ¡¡puntos!!"

Apple tiene restricciones para las operaciones automáticas (o incluso parcialmente automatizadas) de SMS y marcado. (Imagínese si el juego marcó 911 en un momento determinado 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 el SMS a través de esa ruta si necesita una automatización completa. (es decir, su programa 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 una viewControllerque 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 con el "SMS: ..." formato de URL, lo que permite su aplicación a permanecer abierto, y permite rellenar tanto la a y la carrocería campos. Incluso puede especificar múltiples destinatarios.

Esto evita que las aplicaciones envíen SMS automáticos sin que el usuario lo sepa explícitamente. Aún no puede enviar SMS totalmente automatizados desde el iPhone mismo, requiere cierta interacción del usuario. Pero esto al menos le permite llenar todo y evita cerrar la aplicación.

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

Actualización de iOS 5

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

Actualización de iOS 6

No hay cambios en esta clase.

Actualización de iOS 7

Ahora puede verificar si el medio de mensaje que está utilizando aceptará un asunto 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

No hay cambios en esta clase.

Actualización de iOS 9

No hay cambios en esta clase.

Actualización de iOS 10

No hay cambios en esta clase.

Actualización de iOS 11

No hay cambios significativos en 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 iPad, excepto, tal vez, en iOS 5. Debe detectar el dispositivo y las limitaciones de iOS antes de usar esto controlador, o corre el riesgo de restringir su aplicación a 3G, 3GS y 4 iPhones recientemente actualizados.

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 aún puede ser una mejor solución para muchas aplicaciones. Alternativamente, use ambos, y solo recurra a un servicio de SMS en línea cuando el dispositivo no lo admita.

Adam Davis
fuente
12
Y si compras ese dominio, nunca más podré verte de la misma manera.
Adam Davis el
79
Creo que es irónico que alguien haya marcado esta publicación como spam. ¡Lee entre líneas, pueblos!
Randolpho
2
-1 porque esto se lee como especulación. Además, vea las respuestas de Jus 'Wondrin' y rydgaze sobre cómo enviar SMS en la aplicación.
Frank Shearar
8
@Frank: actualicé mi escrito para reflejar las nuevas características de iOS 4. Se eliminó la redacción borrosa.
Adam Davis
13
Realmente aprecio que mantenga esta publicación actualizada para nuevas versiones de iOS. :)
Ciryon
143

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

Daniel Amitay
fuente
aún así, el formulario de SMS tiene que aparecer. ¿Alguna forma de enviar en segundo plano?
Raptor
55
Ciertamente, puede enviar SMS en segundo plano utilizando un servicio como Twilio, pero si desea enviarlo desde el número de teléfono del usuario, tienen que aprobar el mensaje a través del método anterior.
Daniel Amitay
3
cualquier persona que use el código anterior puede considerar colocar el MFMessageComposeViewController *controller = ...bloque if dentro. (el método de clase no necesita tener una instancia para hacer la prueba)
no sincronizado el
El enlace http://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/dice "502 Bad Gateway" en mi computadora portátil. Tal vez el enlace está roto.
Nikita Vlasenko
99
  1. Debe agregar el MessageUI.framework a su proyecto Xcode
  2. Incluya un #import <MessageUI/MessageUI.h>en su archivo de encabezado
  3. Agregue estos delegados a su archivo de encabezado MFMessageComposeViewControllerDelegate yUINavigationControllerDelegate
  4. En su IBActionmétodo, declare la instancia de MFMessageComposeViewControllersaymessageInstance
  5. Para verificar si su dispositivo puede enviar mensajes de texto [MFMessageComposeViewController canSendText]en una condición if, devolverá Sí / No
  6. En la ifcondición de hacer esto:

    1. Primero establezca el cuerpo para su messageInstancecomo:

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

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

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

      [self presentModalViewController:messageInstance animated:YES];
Najeebullah Shah
fuente
2
Nota de versión: presentModalViewController:animated:está en desuso; utilizar presentViewController:animated:completion:en su lugar. Además, recuerde definir el método delegado - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)resultsi desea conocer los resultados.
Raptor
Por favor, ponga el código para la prueba. @Najeebullah Shah aquí o en github.
50

Puede usar una sms:[target phone number]URL para abrir la aplicación de SMS, pero no hay indicaciones sobre cómo rellenar un cuerpo de SMS con texto.

millenomi
fuente
react-native-communications utiliza el parámetro & body = para completar el texto al abrir el sms: targetphonenumber & body = textyouwanttoprefillwith para iOS
Doug Voss
Acabo de probar esto en mi iphone 8 y funcionó muy bien ... ¡gracias!
Brad Parks el
Necesito enviar un sms a un número específico pero con un texto de cuerpo predefinido (prefill). El texto del cuerpo debe ser la selección manual de 4 posibles opciones. Por ejemplo, la aplicación se abre y emerge "selecciona el motivo". Entonces 4 opciones están disponibles. A continuación, el usuario selecciona una de estas 4 opciones y luego se envía un SMS automático que tiene como texto del cuerpo la elección del usuario. algún consejo?
seralouk
25

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 mediante libSystem y launchd. De hecho, es una interfaz que permite gestionar procesos mediante el intercambio de estructuras tales como diccionarios. Debido a la herencia, iOS 5 también posee este mecanismo.

Es posible que 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 demonio para el envío de SMS. Sin embargo, debe mencionarse que esta capacidad se repara en iOS 6, pero es relevante para iOS 5.0—5.1.1. Jailbreak, Private Framework y otras herramientas ilegales no son necesarias 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 del sistema com.apple.chatkit, cuyas tareas incluyen la generación, gestión y envío de mensajes de texto cortos. Para facilitar el control, tiene el puerto de comunicación disponible públicamente 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 de que este tipo de comunicación está prohibida. 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!");

Queda poco: 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 enviados

isox
fuente
1
No debe usar XPC para enviar SMS. La aplicación producida no será aprobada por Apple. Utilice MessageUI Framework en su lugar
Raptor
Si está utilizando esta técnica para la aplicación que utiliza para su organización, y la aplicación no está pasando por la tienda de aplicaciones, no se preocupe.
Martin Berger
¿Funciona esto en las versiones iOS 10+?
Martin Berger
Obteniendo "Error de conexión de sandbox XPC: Conexión no válida" en iOS 12
Martin Berger
23

Agregue el MessageUI.Framework y use el siguiente código

#import <MessageUI/MessageUI.h> 

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];
 }
Bharat Gulati
fuente
oye, eso es genial, pero ¿podemos hacer esta funcionalidad desde el fondo?
Raj
3
Apple no le permitirá enviar mensajes sin la aprobación de los usuarios. Tiene que enviar un mensaje / correo presionando manualmente el botón. Alternativamente, puede usar un servicio personalizado enviando correos electrónicos / números a su backend y luego enviándolos. Aunque no puede hacer esto directamente en iPhone
Bharat Gulati
21

Puedes usar este enfoque:

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


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

Dinesh Reddy Chennuru
fuente
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]; 
}
Rushabh
fuente
deberías ver este enlace: blog.mugunthkumar.com/coding/… te ayudará
Banker Mittal
12

Sigue estos procedimientos

1. Añadir MessageUI.Frameworkal proyectoingrese la descripción de la imagen aquí

2) Importar #import <MessageUI/MessageUI.h>en archivo .h.

3) Copia este código para enviar el 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 delegatemétodo si lo desea.

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


   ///your stuff here 

    [self dismissViewControllerAnimated:YES completion:nil];
}

Corre y vete!

Tunvir Rahman Tusher
fuente
Cabe mencionar que es probable que desee ejecutar [self dismissViewControllerAnimated:YES completion:nil];en el interior messageComposeViewController: didFinishWithResult:método de devolución de llamada. De lo contrario, simplemente colgará allí.
SaltyNuts
5

Aquí está la versión de código Swift 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.")
    }
}
grandagile
fuente
3

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

Pankaj Kainthla
fuente
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:"]];
}
mandeep
fuente
44
¿Qué tan útiles son sus parámetros?
martinsurleweb
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: @ "sms:"]];
Amr enojado
3

// llama al método 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 el mensaje

- (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];
 }
}
ALOK KUMAR
fuente
2

Si lo desea, puede usar el marco privado CoreTelephonyque se llama CTMessageCenterclase. Existen algunos métodos para enviar sms.

alma nueva
fuente
1
Él preguntó específicamente si esto era posible usando el SDK oficial.
Quentamia
1
¿Puedes proporcionar más información sobre la API privada? No tengo ningún problema para usar el marco privado porque no necesito publicarlo en la App Store.
Bagusflyer
1

Utilizar este:

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

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

Rinku Sadhwani
fuente
1

Puede presentar MFMessageComposeViewController, que puede enviar SMS, pero con el aviso del usuario (toca el botón 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, diciéndole a iOS si es spam o no. No se puede hacer nada más con SMS

Максуд Даудов
fuente
La nueva respuesta!
Fattie
0

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 .

parvind
fuente