Come inviare a livello di codice SMS su iPhone?


526

Qualcuno sa se è possibile, e come, a livello di codice per inviare uno SMS dal iPhone, con l'SDK ufficiale / Cocoa Touch?


in Ios 4 È possibile inviare sms con il codice ma il problema è che l'applicazione verrà chiusa
Pankaj Kainthla,

Se l'utilizzo dell'SDK ufficiale non è un requisito per gli altri, ho scritto questo post per mostrare come farlo utilizzando Twilio: twilio.com/blog/2016/11/…
Megan Speir

puoi creare un foglio di calcolo di Google al di fuori di Gmail, creare i campi desiderati, quindi eseguire tools->script editore in una richiesta POST utilizzare MailApp.sendEmailapi per inviare e-mail a un numero di telefono. att's is YOURNUMBER@mms.att.net, tmobile's YOURNUMBER@tmomail.net penso (TUTTO GRATIS)
Coty Embry

Risposte:


404

restrizioni

Se potessi inviare un SMS all'interno di un programma su iPhone, sarai in grado di scrivere giochi che inviano spam in background. Sono sicuro che vorresti davvero ricevere spam dai tuoi amici, "Prova questo nuovo gioco! Roxxers i miei boxxer, e anche i tuoi saranno! Roxxersboxxers.com !!!! Se ti iscrivi ora otterrai 3.200 RB punti!!"

Apple ha restrizioni per le operazioni automatizzate (o anche parzialmente automatizzate) di SMS e di composizione. (Immagina se il gioco componesse invece il 911 in un determinato momento della giornata)

La soluzione migliore è configurare un server intermedio su Internet che utilizza un servizio di invio SMS online e inviare l'SMS tramite tale percorso se è necessaria un'automazione completa. (ad esempio, il tuo programma su iPhone invia un pacchetto UDP al tuo server, che invia il vero SMS)

Aggiornamento iOS 4

iOS 4, tuttavia, ora fornisce un viewControllerche puoi importare nella tua applicazione. Si prepopolano i campi SMS, quindi l'utente può iniziare l'invio di SMS all'interno del controller. A differenza dell'utilizzo del formato url "SMS: ...", ciò consente alla tua applicazione di rimanere aperta e ti consente di popolare sia i campi to che body . Puoi anche specificare più destinatari.

Ciò impedisce alle applicazioni di inviare SMS automatizzati senza che l'utente ne sia esplicitamente a conoscenza. Non è ancora possibile inviare SMS completamente automatizzati dall'iPhone stesso, richiede una certa interazione da parte dell'utente. Ma questo almeno ti consente di popolare tutto ed evita di chiudere l'applicazione.

La classe MFMessageComposeViewController è ben documentata e le esercitazioni mostrano quanto sia facile da implementare.

Aggiornamento iOS 5

iOS 5 include la messaggistica per dispositivi iPod touch e iPad, quindi mentre non l'ho ancora testato da solo, è possibile che tutti i dispositivi iOS siano in grado di inviare SMS tramite MFMessageComposeViewController. In tal caso, Apple esegue un server SMS che invia messaggi per conto di dispositivi che non dispongono di un modem cellulare.

Aggiornamento iOS 6

Nessuna modifica a questa classe.

Aggiornamento iOS 7

Ora puoi verificare se il supporto messaggi che stai utilizzando accetterà un oggetto o degli allegati e quale tipo di allegati accetterà. È possibile modificare l'oggetto e aggiungere allegati al messaggio, dove il supporto lo consente.

Aggiornamento iOS 8

Nessuna modifica a questa classe.

Aggiornamento iOS 9

Nessuna modifica a questa classe.

Aggiornamento iOS 10

Nessuna modifica a questa classe.

Aggiornamento iOS 11

Nessuna modifica significativa a questa classe

Limitazioni a questa classe

Tieni presente che questo non funzionerà sui telefoni senza iOS 4 e non funzionerà su iPod touch o iPad, tranne, forse, su iOS 5. Prima di utilizzare questo, devi rilevare il dispositivo e le limitazioni di iOS controller o rischi di limitare l'app a 3G, 3GS e 4 iPhone aggiornati di recente.

Tuttavia, un server intermedio che invia SMS consentirà a tutti e tutti questi dispositivi iOS di inviare SMS purché abbiano accesso a Internet, quindi potrebbe essere comunque una soluzione migliore per molte applicazioni. In alternativa, utilizzare entrambi e tornare a un servizio SMS online solo quando il dispositivo non lo supporta.


12
E se acquisti quel dominio non sarò mai più in grado di guardarti allo stesso modo.
Adam Davis,

79
Penso che sia ironico che qualcuno abbia segnalato questo post come spam. Leggi tra le righe, gente!
Randolpho,

2
-1 perché si legge come speculazione. Inoltre, vedi le risposte di Jus "Wondrin" e rydgaze su come inviare SMS in-app.
Frank Shearar,

8
@Frank - Aggiornato il mio writeup per riflettere le nuove funzionalità di iOS 4. Rimossa la formulazione wishy-washy.
Adam Davis,

13
Apprezzo molto che tu abbia aggiornato questo post per le nuove versioni di iOS. :)
Ciryon

143

Ecco un tutorial che fa esattamente quello che stai cercando: il MFMessageComposeViewController.

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

Essenzialmente:

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 un link ai documenti.

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


tuttavia, il modulo SMS deve apparire. Un modo per inviare in background?
Raptor

5
Puoi sicuramente inviare SMS in background usando un servizio come Twilio, ma se vuoi inviarlo dal numero di telefono dell'utente, devono approvare il messaggio con il metodo sopra.
Daniel Amitay,

3
chiunque usi il codice sopra potrebbe voler considerare di inserire l' MFMessageComposeViewController *controller = ...interno del blocco if. (il metodo di classe non deve avere un'istanza per eseguire il test)
non sincronizzato il

Il link http://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/dice "502 Bad Gateway" sul mio laptop. Forse il collegamento è interrotto.
Nikita Vlasenko,

99
  1. Devi aggiungere MessageUI.framework al tuo progetto Xcode
  2. Includere un #import <MessageUI/MessageUI.h>nel file di intestazione
  3. Aggiungi questi delegati al tuo file di intestazione MFMessageComposeViewControllerDelegate eUINavigationControllerDelegate
  4. Nel tuo IBActionmetodo dichiara l'istanza di MFMessageComposeViewControllerdiremessageInstance
  5. Per verificare se il dispositivo può inviare il testo [MFMessageComposeViewController canSendText]in una condizione if, verrà restituito Sì / No
  6. Nella ifcondizione fai questi:

    1. Primo set body per il tuo messageInstancecome:

      messageInstance.body = @"Hello from Shah";
    2. Quindi decidere i destinatari del messaggio come:

      messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321",         nil];
    3. Imposta un delegato sul tuo messaggio. Istanza come:

      messageInstance.messageComposeDelegate = self;
    4. Nell'ultima riga fai questo:

      [self presentModalViewController:messageInstance animated:YES];

2
Nota sulla versione: presentModalViewController:animated:è obsoleto; usa presentViewController:animated:completion:invece. Inoltre, ricorda di definire il metodo delegato - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)resultse vuoi conoscere i risultati.
Raptor

Si prega di inserire il codice per il test. @Najeebullah Shah qui o in github.

50

È possibile utilizzare un sms:[target phone number]URL per aprire l'applicazione SMS, ma non ci sono indicazioni su come precompilare un corpo SMS con il testo.


reazioni-nativo-comunicazioni utilizza il parametro & body = per precompilare il testo quando si apre sms: targetphonenumber & body = textyouwanttoprefillwith per iOS
Doug Voss,

Ho appena provato questo sul mio iPhone 8 e ha funzionato benissimo ... grazie!
Brad Parks

Devo inviare un sms a un numero specifico ma con un testo predefinito (prefill). Il testo del corpo dovrebbe essere la selezione manuale tra 4 possibili opzioni. Ad esempio, l'app si apre e pop-up "seleziona motivo". Quindi sono disponibili 4 opzioni. Successivamente l'utente seleziona una di queste 4 opzioni e quindi viene inviato un SMS automatico avente come testo corporeo la scelta dell'utente. qualche consiglio?
seralouk,

25

Uno dei sistemi di comunicazione tra processi in MacOS è XPC. Questo livello di sistema è stato sviluppato per la comunicazione tra processi basata sul trasferimento di strutture plist usando libSystem e launchd. In realtà, è un'interfaccia che consente di gestire i processi tramite lo scambio di strutture come i dizionari. A causa dell'ereditarietà, anche iOS 5 possiede questo meccanismo.

Potresti già capire cosa intendo con questa introduzione. Sì, ci sono servizi di sistema in iOS che includono strumenti per la comunicazione XPC. E voglio esemplificare il lavoro con un demone per l'invio di SMS. Tuttavia, va detto che questa capacità è stata risolta in iOS 6, ma è rilevante per iOS 5.0—5.1.1. Il jailbreak, il framework privato e altri strumenti illegali non sono necessari per il suo sfruttamento. Sono necessari solo i set di file di intestazione dalla directory / usr / include / xpc / *.

Uno degli elementi per l'invio di SMS in iOS è il servizio di sistema com.apple.chatkit, i cui compiti includono generazione, gestione e invio di brevi messaggi di testo. Per facilità di controllo, ha la porta di comunicazione disponibile al pubblico com.apple.chatkit.clientcomposerver.xpc. Utilizzando il sottosistema XPC, è possibile generare e inviare messaggi senza l'approvazione dell'utente. 

Bene, proviamo a creare una connessione.

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

Ora abbiamo la connessione XPC myConnection impostata sul servizio di invio di SMS. Tuttavia, la configurazione XPC prevede la creazione di connessioni sospese: per l'attivazione è necessario compiere un ulteriore passo.

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 connessione è attivata. In questo momento iOS 6 visualizzerà un messaggio nel registro del telefono che questo tipo di comunicazione è vietato. Ora dobbiamo generare un dizionario simile a xpc_dictionary con i dati richiesti per l'invio del messaggio.

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

Resta poco: invia il messaggio alla porta XPC e assicurati che sia consegnato.

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

È tutto. SMS inviato.


1
Non dovresti usare XPC per inviare SMS. L'app prodotta non sarà approvata da Apple. Usa invece MessageUI Framework
Raptor

Se stai usando questa tecnica per l'app che usi per la tua organizzazione e l'app non sta attraversando l'app store, non ti preoccupare.
Martin Berger,

Funziona su versioni iOS 10+?
Martin Berger,

Visualizzazione di "Errore connessione sandbox XPC: connessione non valida" su iOS 12
Martin Berger,

23

Aggiungi MessageUI.Framework e usa il seguente codice

#import <MessageUI/MessageUI.h> 

E poi:

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 il metodo delegato -

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

ehi è fantastico, ma possiamo fare questa funzionalità da sfondo?
Raj,

3
Apple non ti consentirà di inviare messaggi senza l'approvazione degli utenti. Deve inviare un messaggio / e-mail premendo manualmente il pulsante. In alternativa, puoi utilizzare un servizio personalizzato inviando e-mail / numeri al tuo back-end e quindi inviando. Anche se non puoi farlo direttamente su iPhone
Bharat Gulati,

21

Puoi usare questo approccio:

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


iOS passerà automaticamente dalla tua app alla pagina di composizione dei messaggi dell'app dei messaggi. Poiché lo schema dell'URL inizia con sms :, questo viene identificato come un tipo riconosciuto dall'app dei messaggi e lo avvia.


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

dovresti vedere questo link: blog.mugunthkumar.com/coding/… ti aiuterà
Banker Mittal

12

Seguire queste procedure

1 .Aggiungi MessageUI.Frameworkal progettoinserisci qui la descrizione dell'immagine

2 Importa #import <MessageUI/MessageUI.h>nel file .h.

3 Copia questo codice per l'invio del messaggio

 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 Implementare il delegatemetodo se lo si desidera.

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


   ///your stuff here 

    [self dismissViewControllerAnimated:YES completion:nil];
}

Corri e vai!


la pena ricordare che probabilmente si vorrà eseguire [self dismissViewControllerAnimated:YES completion:nil];all'interno messageComposeViewController: didFinishWithResult:metodo di callback. Altrimenti rimarrà lì.
SaltyNuts

5

Ecco la versione Swift del codice per inviare SMS in iOS. Si noti che funziona solo con dispositivi reali. Codice testato in iOS 7+. Puoi leggere di più qui .

1) Creare una nuova classe che eredita 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) Come usare questa 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

Esiste una classe in iOS 4 che supporta l'invio di messaggi con body e destinatari dalla tua applicazione. Funziona come l'invio di posta. Puoi trovare la documentazione qui: testo del link


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
quanto sono utili i tuoi parametri?
martinsurleweb

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

3

// chiama il metodo con nome e numero.

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

}

// Metodo per l'invio del messaggio

- (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 vuoi, puoi usare il framework privato CoreTelephonyche ha chiamato CTMessageCenterclass. Esistono alcuni metodi per inviare sms.


1
Ha specificamente chiesto se ciò fosse possibile utilizzando l'SDK ufficiale.
Quentamia

1
Potete fornire maggiori informazioni sull'API privato? Non ho problemi a usare il framework privato perché non ho bisogno di pubblicarlo su App Store.
Bagusflyer

1

Usa questo:

- (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"]] 

Questo sarebbe il modo migliore e breve per farlo.


1

Puoi presentare MFMessageComposeViewController, che può inviare SMS, ma con la richiesta dell'utente (tocca il pulsante di invio). Non c'è modo di farlo senza il permesso dell'utente. Su iOS 11, puoi creare un'estensione, che può essere come un filtro per i messaggi in arrivo, dicendo a iOS il suo spam o meno. Nulla di più con SMS non può essere fatto


La nuova risposta!
Fattie

0

È necessario utilizzare MFMessageComposeViewController se si desidera mostrare la creazione e l'invio del messaggio nella propria app.

Altrimenti, è possibile utilizzare il metodo sharedApplication .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.