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?

Nitin Gohel
fonte
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 é [email protected], tmobile do é [email protected] 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.

Adam Davis
fonte
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

Daniel Amitay
fonte
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];
Najeebullah Shah
fonte
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.

millenomi
fonte
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.

isox
fonte
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];
 }
Bharat Gulati
fonte
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.

Dinesh Reddy Chennuru
fonte
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
fonte
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Á!

Tunvir Rahman Tusher
fonte
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.")
    }
}
grandagile
fonte
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

Pankaj Kainthla
fonte
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:"]];
}
mandíbula
fonte
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];
 }
}
ALOK KUMAR
fonte
2

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

nova alma
fonte
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];
}
Rocha
fonte
1
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms:number"]] 

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

Rinku Sadhwani
fonte
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

Максуд Даудов
fonte
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 .

parvind
fonte