Como enviar SMS programaticamente no iPhone?

Alguém sabe se é possível, e como, programaticamente enviar um SMS do iPhone, com o toque oficial SDK / cacau?

Author: Nitin Gohel, 2008-08-14

18 answers

Restrições

Se você pudesse enviar um SMS dentro de um programa no iPhone, você será capaz de escrever jogos que spam pessoas no fundo. Tenho certeza que você realmente quer ter spams de seus amigos, " experimente este novo jogo! Ele roxxers meus boxxers, e o seu será também! roxxersboxxers.com!!!! se você se inscrever agora você vai ter 3.200 pontos RB!!"

A Apple tem restrições para operações automáticas (ou mesmo parcialmente automatizadas) de SMS e de marcação. (Imagine se o jogo em vez disso ligou para o 112 a uma determinada hora do dia)

A sua melhor aposta é criar um servidor intermédio na internet que utilize um serviço de envio de SMS online e envie o SMS por essa rota, se precisar de automatização completa. (ie, o seu programa no iPhone envia um pacote UDP para o seu servidor, que envia o SMS real)

IOS 4 Update

O IOS 4, no entanto, agora fornece um {[[0]} que pode importar para a sua aplicação. Você prepopular os campos SMS, então o usuário pode iniciar o envio SMS dentro do controlador. Ao contrário de usar o " SMS:..."formato url, isto permite que a sua aplicação fique aberta, e permite-lhe preencher os campos a e body. Você pode até especificar vários destinatários.

Isto impede que as aplicações enviem SMS automatizados sem que o utilizador tenha conhecimento disso. Você ainda não pode enviar SMS totalmente automatizado do próprio iPhone, ele requer alguma interação do Usuário. Mas isto ao menos permite-te povoar tudo, e evita fechar a aplicação.

A classeMFMessageComposeViewController está bem documentada, e tutoriais mostra como é fácil implementar.

IOS 5 Update

O IOS 5 inclui mensagens para dispositivos iPod touch e iPad, por isso, embora ainda não tenha testado isto pessoalmente, pode ser que todos os dispositivos iOS sejam capazes de enviar SMS via MFMessageComposeViewController. Se este for o caso, então a Apple está executando um servidor de SMS que envia mensagens em nome de dispositivos que não têm um modem celular.

IOS 6 Update

Não há alterações nesta classe.

IOS 7 Update

Agora pode verificar se o meio de mensagem que está a usar irá aceitar um assunto ou anexos, e que tipo de anexos irá aceitar. Você pode editar o assunto e adicionar anexos à mensagem, onde o meio permite.

IOS 8 Update

Não há alterações nesta classe.

IOS 9 Update

Nada de alterações a isto. classe.

IOS 10 Update

Não há alterações nesta classe.

IOS 11 Update

Nenhuma alteração significativa nesta classe

Limitações a esta classe

Tenha em mente que isso não funcionará em telefones sem o iOS 4, e não funcionará no iPod touch ou no iPad, exceto, talvez, sob o iOS 5. Você deve detectar as limitações do dispositivo e do iOS antes de usar este controlador, ou restringir o risco do seu aplicativo para 3G, 3GS e 4 recentemente atualizados. iPhones.

No entanto, um servidor intermediário que envia SMS permitirá que qualquer e todos estes dispositivos iOS enviem SMS desde que tenham acesso à internet, por isso pode ainda ser uma solução melhor para muitas aplicações. Alternadamente, use ambos, e só voltar para um serviço de SMS on-line quando o dispositivo não o suporta.

 407
Author: Adam Davis, 2019-12-29 11:26:47

Aqui está um tutorial que faz exatamente o que você está procurando: o MFMessageComposeViewController.

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

Essencialmente:

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];
}
E uma ligação aos documentos.

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

 144
Author: Daniel Amitay, 2017-06-28 14:47:07
    Tens de adicionar o Messagui.framework para o seu projecto Xcode
  1. inclua um #import <MessageUI/MessageUI.h> no seu ficheiro de cabeçalho
  2. adicione estes delegados ao seu ficheiro de cabeçalhoMFMessageComposeViewControllerDelegate & UINavigationControllerDelegate
  3. segundo o seu método, declarar instância de MFMessageComposeViewController dizer messageInstance
  4. para verificar se o seu dispositivo pode enviar texto, use [MFMessageComposeViewController canSendText] numa condição de se, irá devolver Sim / Não
  5. Na condição if faça isto:

    1. Primeiro conjunto de corpo para o seu messageInstance como:

      messageInstance.body = @"Hello from Shah";
      
    2. Em seguida, decidir os destinatários da mensagem como:

      messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321",         nil];
      
    3. Defina um delegado para a sua messagenstance como:

      messageInstance.messageComposeDelegate = self;
      
    4. Na última linha Faz isto:

      [self presentModalViewController:messageInstance animated:YES];
      
 100
Author: Najeebullah Shah, 2015-07-17 14:28:18

Você pode usar um URL sms:[target phone number] para abrir a aplicação SMS, mas não existem indicações sobre como pré-preencher um corpo SMS com texto.

 50
Author: millenomi, 2019-06-07 06:09:04

Um dos sistemas de comunicação entre processos em MacOS é o XPC. Esta camada de sistema foi desenvolvida para comunicação entre processos com base na transferência de estruturas plist usando libSystem e launchd. Na verdade, é uma interface que permite a gestão de processos através da troca de estruturas como dicionários. Devido à hereditariedade, iOS 5 possui este mecanismo também.

Já deves compreender o que quero dizer com esta introdução. Sim, há serviços de sistema em iOS que incluem ferramentas para comunicação XPC. E eu quero exemplificar o trabalho com um daemon para o envio de SMS. No entanto, deve-se mencionar que esta capacidade é fixada em iOS 6, mas é relevante para iOS 5.0-5.1.1. A fuga da prisão, o enquadramento privado e outras ferramentas ilegais não são necessários para a sua exploração. Só é necessário o conjunto de ficheiros header do directory /usr/include/xpc/*.

Um dos elementos para o envio de SMS em iOS é o system service com.maca.chatkit, as tarefas de que incluem geração, gestão e envio de mensagens de texto curtas. Para facilitar o controlo, dispõe da comunicação port com disponível ao público.maca.chatkit.clientcomposeserver.xpc. Usando o sub-sistema XPC, você pode gerar e enviar mensagens sem a aprovação do Usuário. 

Bem, vamos tentar criar uma ligação.
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);

Agora temos a ligação XPC myConnection configurada para o serviço de envio de SMS. No entanto, a configuração do XPC prevê a criação de ligações suspensas - temos de dar mais um passo para a activação.

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

A ligação está activada. Neste momento, o iOS 6 irá mostrar uma mensagem no registo telefónico de que este tipo de comunicação é proibido. Agora precisamos gerar um dicionário semelhante ao xpc_dictionary com os dados necessários para o envio da mensagem.

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

Pouco resta: envie a mensagem para a porta XPC e certifique-se de que é entregue.

xpc_connection_send_message(myConnection, mydict);
xpc_connection_send_barrier(myConnection, ^{
NSLog(@"The message has been successfully delivered");
});
Só isso. SMS enviados.
 25
Author: isox, 2015-07-17 14:28:21

Adicione o Messagui.Framework e utilizar o seguinte código

#import <MessageUI/MessageUI.h> 

E depois:

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

E o método do delegado -

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller
             didFinishWithResult:(MessageComposeResult)result {
      [self dismissViewControllerAnimated:YES completion:nil];
 }
 24
Author: Bharat Gulati, 2015-07-17 14:14:48

Pode utilizar esta abordagem:

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


o iOS irá navegar automaticamente do seu aplicativo para a página de composição da mensagem do aplicativo Mensagens. Uma vez que o esquema da URL começa com sms:, Este é identificado como um tipo que é reconhecido pelo aplicativo Mensagens e o lança.

 21
Author: Dinesh Reddy Chennuru, 2015-07-20 19:43:56

Seguir estes procedimentos

1 .Adicionar MessageUI.Framework ao projectoenter image description here

2 . Import #import <MessageUI/MessageUI.h> in .h file.

3 . Copiar este código para enviar a mensagem

 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 o método delegate Se quiser.

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


   ///your stuff here 

    [self dismissViewControllerAnimated:YES completion:nil];
}
Corre e vai!
 13
Author: Tunvir Rahman Tusher, 2014-11-17 08:21:56
//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]; 
}
 12
Author: Rushabh, 2012-08-27 12:33:43
Aqui está a versão Swift do código para enviar SMS em iOS. Por favor, note que ele só funciona em dispositivos reais. Código testado em iOS 7+. Você pode ler mais aqui.

1) Criar uma nova classe que herde a MFMessageComposeViewControllerDelegate e 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) Como utilizar esta 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.")
    }
}
 5
Author: grandagile, 2015-05-23 07:40:59

Existe uma classe no iOS 4 que suporta o envio de mensagens com o corpo e as receitas da sua aplicação. Funciona como enviar correio. Você pode encontrar a documentação aqui: link text

 3
Author: Pankaj Kainthla, 2011-10-28 20:11:02
- (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients
{
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    UIImage *ui =resultimg.image;
    pasteboard.image = ui;
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:"]];
}
 3
Author: mandeep, 2013-09-09 11:17:09

/ / Método de chamada com nome e 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 de envio da mensagem

- (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];
 }
}
 3
Author: ALOK KUMAR, 2015-03-11 05:21:41

Se quiser, pode usar o framework privado {[[0]} que chamou a classe CTMessageCenter. Existem alguns métodos para enviar sms.

 2
Author: new soul, 2013-05-01 09:22:16

Usa isto:

- (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
Author: Rock, 2012-05-28 15:04:42
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms:number"]] 
Esta seria a melhor e curta maneira de o fazer.
 1
Author: Rinku Sadhwani, 2014-08-04 12:38:14

Pode apresentar o MFMessageComposeViewController, que pode enviar SMS, mas com o prompt do utilizador(ele tapa o botão enviar). Não há maneira de fazer isso sem a permissão do utilizador. No iOS 11, Você pode fazer extensão, que pode ser como filtro para mensagens recebidas, dizendo ao iOS ou seu spam ou não. Nada mais com SMS não pode ser feito

 1
Author: Максуд Даудов, 2017-11-26 01:33:14

Tem de usar o MFMessageComposeViewController Se quiser mostrar a criação e o envio da mensagem na sua própria aplicação.

Caso contrário, pode utilizar o método Share application.

 0
Author: parvind, 2015-07-17 14:28:09