Como enviar SMS de forma programática no iPhone?


526

Alguém sabe se é possível e como enviar programaticamente um SMS do iPhoneSDK / Cocoa Touch oficial?


no iOS 4 Você pode enviar sms com o código, mas problema é a sua aplicação será fechada
— Pankaj Kainthla

Se o uso do SDK oficial não é um requisito para outras pessoas, escrevi este post para mostrar como fazer isso usando o Twilio
— Megan Speir

você pode criar uma planilha do Google fora do seu Gmail, criar os campos desejados tools->script editore, em uma solicitação POST, use a MailApp.sendEmailAPI para enviar e-mail para um número de telefone. att de é YOURNUMBER@mms.att.net, tmobile do é YOURNUMBER@tmomail.net Eu acho que (ALL FREE)
— Coty Embry

Respostas:


404

Restrições

Se você pudesse enviar um SMS em um programa no iPhone, poderá escrever jogos que enviam spam a pessoas em segundo plano. Tenho certeza de que realmente deseja receber spams de seus amigos: "Experimente este novo jogo! Roxxers meus boxxers, e o seu também será! Roxxersboxxers.com !!!! Se você se inscrever agora, receberá 3.200 RB pontos!!"

A Apple tem restrições para operações de discagem e SMS automatizadas (ou mesmo parcialmente automatizadas). (Imagine se o jogo discar 911 em uma determinada hora do dia)

Sua melhor aposta é configurar um servidor intermediário na Internet que use um serviço de envio de SMS on-line e enviar o SMS por essa rota, se você precisar de automação completa. (ou seja, seu programa no iPhone envia um pacote UDP para o servidor, que envia o SMS real)

Atualização para iOS 4

O iOS 4, no entanto, agora fornece um que viewControllervocê pode importar para o seu aplicativo. Você preenche os campos do SMS e, em seguida, o usuário pode iniciar o envio do SMS no controlador. Diferente do uso do formato de URL "SMS: ...", isso permite que seu aplicativo permaneça aberto e permite que você preencha os campos to e body . Você pode até especificar vários destinatários.

Isso impede que os aplicativos enviem SMS automatizados sem que o usuário tenha conhecimento explícito. Você ainda não pode enviar SMS totalmente automatizado do próprio iPhone, isso requer alguma interação do usuário. Mas isso pelo menos permite que você preencha tudo e evita o fechamento do aplicativo.

A classe MFMessageComposeViewController está bem documentada e os tutoriais mostram como é fácil implementar.

Atualização para iOS 5

O iOS 5 inclui mensagens para dispositivos iPod touch e iPad; portanto, embora eu ainda não tenha testado isso, pode ser que todos os dispositivos iOS possam enviar SMS via MFMessageComposeViewController. Se for esse o caso, a Apple está executando um servidor SMS que envia mensagens em nome de dispositivos que não possuem um modem celular.

Atualização para iOS 6

Nenhuma alteração nesta classe.

Atualização para iOS 7

Agora você pode verificar se o meio de mensagem que você está usando aceita um assunto ou anexos e que tipo de anexos ele aceita. Você pode editar o assunto e adicionar anexos à mensagem, onde a mídia permitir.

Atualização para iOS 8

Nenhuma alteração nesta classe.

Atualização para iOS 9

Nenhuma alteração nesta classe.

Atualização para iOS 10

Nenhuma alteração nesta classe.

Atualização do iOS 11

Nenhuma alteração significativa nesta classe

Limitações para esta classe

Lembre-se de que isso não funcionará em telefones sem o iOS 4 e não funcionará no iPod touch ou no iPad, exceto, talvez, no iOS 5. Você deve detectar o dispositivo e as limitações do iOS antes de usá-lo. controlador ou risco de restringir seu aplicativo a iPhones 3G, 3GS e 4 atualizados recentemente.

No entanto, um servidor intermediário que envia SMS permitirá que todos e quaisquer desses dispositivos iOS enviem SMS desde que tenham acesso à Internet, portanto ainda pode ser uma solução melhor para muitos aplicativos. Como alternativa, use os dois e volte a um serviço de SMS on-line quando o dispositivo não o suportar.


12
E se você comprar esse domínio, nunca mais poderei olhar para você da mesma maneira.
— Adam Davis

79
Acho irônico que alguém tenha marcado este post como spam. Leia nas entrelinhas, povos!
— Randolpho

2
-1 porque isso parece especulação. Além disso, consulte as respostas de Jus 'Wondrin' e rydgaze sobre como enviar SMS no aplicativo.
— precisa saber é o seguinte

8
@Frank - Atualizei minha redação para refletir os novos recursos do iOS 4. Removido palavras ilusórias.
— Adam Davis

13
Realmente aprecio que você mantenha este post atualizado para novas versões do iOS. :)
— Ciryon 14/03

143

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 um link para os documentos.

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


ainda assim, o formulário do SMS precisa aparecer. Alguma maneira de enviar em segundo plano?
— Raptor

5
Certamente, você pode enviar SMS em segundo plano usando um serviço como o Twilio, mas se quiser enviá-lo pelo número de telefone do usuário, ele precisará aprovar a mensagem pelo método acima.
— Daniel Amitay

3
qualquer pessoa que utilize o código acima pode considerar colocar o MFMessageComposeViewController *controller = ...interior do bloco if. (o método de classe não precisa ter uma instância para fazer o teste)
— unsynchronized

O link http://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/diz "502 Bad Gateway" no meu laptop. Talvez o link esteja quebrado.
— Nikita Vlasenko

99
  1. Você deve adicionar o MessageUI.framework ao seu projeto do Xcode
  2. Inclua um #import <MessageUI/MessageUI.h>no seu arquivo de cabeçalho
  3. Adicione esses delegados ao seu arquivo de cabeçalho MFMessageComposeViewControllerDelegate eUINavigationControllerDelegate
  4. No seu IBActionmétodo, declare a instância do MFMessageComposeViewControllersaymessageInstance
  5. Para verificar se seu dispositivo pode enviar uso de texto [MFMessageComposeViewController canSendText]em uma condição if, ele retornará Sim / Não
  6. Na ifcondição, faça o seguinte:

    1. Primeiro conjunto de corpo para o seu messageInstancecomo:

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

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

      messageInstance.messageComposeDelegate = self;
    4. Na última linha, faça o seguinte:

      [self presentModalViewController:messageInstance animated:YES];

2
Nota da versão: presentModalViewController:animated:está obsoleta; use em presentViewController:animated:completion:vez disso. Além disso, lembre-se de definir o método delegado - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)resultse quiser conhecer os resultados.
— Raptor

Por favor, coloque o código para teste. @Najeebullah Shah aqui ou no github.

50

Você pode usar um sms:[target phone number]URL para abrir o aplicativo SMS, mas não há indicações sobre como preencher um corpo do SMS com texto.


o react-native-Communications usa o parâmetro & body = para preencher o texto ao abrir o sms: targetphonenumber & body = textyouwanttoprefillcom para iOS
— Doug Voss

Eu apenas tentei isso no meu iphone 8, e funcionou muito bem ... obrigado!
— Brad Parks

Preciso enviar um sms para um número específico, mas com o corpo do texto predefinido (pré-preenchido). O texto do corpo deve ser a seleção manual entre 4 opções possíveis. Por exemplo, o aplicativo é aberto e os pop-ups "selecionam o motivo". Em seguida, 4 opções estão disponíveis. Em seguida, o usuário seleciona uma dessas 4 opções e, em seguida, um SMS automático é enviado com o corpo do texto à escolha do usuário. alguma dica?
— seralouk 28/03

25

Um dos sistemas de comunicação entre processos no MacOS é o XPC. Essa camada do sistema foi desenvolvida para comunicação entre processos com base na transferência de estruturas plist usando libSystem e launchd. De fato, é uma interface que permite gerenciar processos através da troca de estruturas como dicionários. Devido à hereditariedade, o iOS 5 também possui esse mecanismo.

Você já deve entender o que quero dizer com esta introdução. Sim, existem serviços de sistema no iOS que incluem ferramentas para comunicação XPC. E quero exemplificar o trabalho com um daemon para envio de SMS. No entanto, deve-se mencionar que essa capacidade é corrigida no iOS 6, mas é relevante para o iOS 5.0—5.1.1. Jailbreak, Private Framework e outras ferramentas ilegais não são necessárias para sua exploração. Somente o conjunto de arquivos de cabeçalho do diretório / usr / include / xpc / * é necessário.

Um dos elementos para o envio de SMS no iOS é o serviço do sistema com.apple.chatkit, cujas tarefas incluem geração, gerenciamento e envio de mensagens curtas de texto. Para facilitar o controle, ele possui a porta de comunicação disponível publicamente com.apple.chatkit.clientcomposeserver.xpc. Usando o subsistema XPC, você pode gerar e enviar mensagens sem a aprovação do usuário. 

Bem, vamos tentar criar uma conexã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 conexão XPC myConnection configurada para o serviço de envio de SMS. No entanto, a configuração XPC prevê a criação de conexões suspensas - precisamos dar mais uma etapa para a ativaçã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 conexão está ativada. Nesse momento, o iOS 6 exibirá uma mensagem no log do telefone 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 verifique se ela foi entregue.

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

Isso é tudo. SMS enviado.


1
Você não deve usar o XPC para enviar SMS. O aplicativo produzido não será aprovado pela Apple. Use o MessageUI Framework em vez disso
— Raptor

Se você estiver usando esta técnica do aplicativo que você usa para sua organização e o aplicativo não estiver passando pela loja de aplicativos, não se preocupe.
— Martin Berger

Isso funciona nas versões iOS 10+?
— Martin Berger

Obtendo "Erro de conexão da caixa de areia XPC: conexão inválida" no iOS 12
— Martin Berger

23

Adicione o MessageUI.Framework e use 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 delegado -

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

Ei, isso é ótimo, mas podemos fazer essa funcionalidade em segundo plano?
— Raj

3
A Apple não permitirá que você envie mensagens sem a aprovação dos usuários. Ele tem que enviar mensagem / email pressionando manualmente o botão. Como alternativa, você pode usar um serviço personalizado enviando e-mails / números para o seu back-end e enviando. Embora você não pode fazer isso diretamente no iPhone
— Bharat Gulati

21

Você pode usar esta abordagem:

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


O iOS navegará automaticamente do seu aplicativo para a página de composição de mensagens do aplicativo de mensagens. Como o esquema da URL começa com sms :, ele é identificado como um tipo reconhecido pelo aplicativo de mensagens e o inicia.


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

você deve ver este link: blog.mugunthkumar.com/coding/... ele vai ajudar você
— Banker Mittal

12

Siga estes procedimentos

1 .Adicionar MessageUI.Frameworkao projetoinsira a descrição da imagem aqui

2) Importar#import <MessageUI/MessageUI.h> no arquivo .h.

3) Copie este código para enviar 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 delegatemétodo, se desejar.

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


   ///your stuff here 

    [self dismissViewControllerAnimated:YES completion:nil];
}

Corra E VÁ!


vale mencionar que você provavelmente desejará executar [self dismissViewControllerAnimated:YES completion:nil];dentro do messageComposeViewController: didFinishWithResult:método de retorno de chamada. Caso contrário, ele simplesmente ficará lá.
— SaltyNuts

5

Aqui está a versão Swift do código para enviar SMS no iOS. Observe que ele funciona apenas em dispositivos reais. Código testado no iOS 7+. Você pode ler mais aqui .

1) Crie uma nova classe que herda 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 usar 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.")
    }
}

3

Há uma classe no iOS 4 que suporta o envio de mensagens com o corpo e os destinatários do seu aplicativo. Funciona da mesma forma que o envio de email. Você pode encontrar a documentação aqui: link text


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

4
quão úteis são seus parâmetros?
— martinsurleweb

[[UIApplication sharedApplication] openURL: [NSURL URLWithString: @ "sms:"]];
— Amr Angry

3

// chama o método 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 para enviar 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];
 }
}

2

Se desejar, você pode usar a estrutura privada CoreTelephonyque chamou CTMessageCenterclasse. Existem alguns métodos para enviar sms.


1
Ele perguntou especificamente se isso era possível usando o SDK oficial.
— Quentamia

1
Você pode fornecer mais informações sobre a API particular? Não tenho nenhum problema para usar a estrutura privada porque não preciso publicá-la na App Store.
— Bagusflyer

1

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

Essa seria a melhor e mais curta maneira de fazê-lo.


1

Você pode apresentar o MFMessageComposeViewController, que pode enviar SMS, mas com a solicitação do usuário (ele toca no botão enviar). Não há como fazer isso sem a permissão do usuário. No iOS 11, você pode criar extensões, que podem ser como filtros para mensagens recebidas, informando ao iOS seu spam ou não. Nada mais com o SMS não pode ser feito


A nova resposta!
— Fattie

0

Você precisa usar o MFMessageComposeViewController se desejar mostrar a criação e o envio da mensagem em seu próprio aplicativo.

Caso contrário, você pode usar o método sharedApplication .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.