2011-07-26 17 views
5

Come posso inviare un messaggio SMS in modo programmatico da un'app per iPhone? In questo momento sto utilizzando Twilio e posso configurare correttamente una richiesta HTTP, autenticarsi con il server e ottenere una risposta.Invia SMS con Twilio su iOS

Ci deve essere qualche errata configurazione delle intestazioni HTTP in quanto posso ottenere una risposta dai server Twilio ma non passare mai i dati corretti.

Il mio codice corrente è in un metodo che viene chiamato da una semplice pressione di un pulsante.

- (IBAction)sendButtonPressed:(id)sender { 
NSLog(@"Button pressed."); 

NSString *kYourTwillioSID = @"AC8c3...f6da3"; 
NSString *urlString = [NSString stringWithFormat:@"https://AC8c3...6da3:[email protected]/2010-04-01/Accounts/%@/SMS/Messages", kYourTwillioSID]; 
NSURL *url = [NSURL URLWithString:urlString]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setURL:url]; 
[request setValue:@"+18584334333" forHTTPHeaderField:@"From"]; 
[request setValue:@"+13063707780" forHTTPHeaderField:@"To"]; 
[request setValue:@"Hello\n" forHTTPHeaderField:@"Body"]; 

NSError *error; 
NSURLResponse *response; 
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

if (!error) { 
    NSString *response_details = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@",response_details); 

} 
NSLog(@"Request finished %@", error); 
+0

Penso che il problema è che dovresti usare i campi POST, non le intestazioni HTTP ... Verificherò che è molto veloce ... –

+0

Si tenga presente che l'utilizzo dell'API Twilio per inviare messaggi di testo direttamente da un'applicazione iOS non è consigliato in quanto è necessario incorporare AccountSid e AuthToken nell'app, che possono essere facilmente decompilati compromettendo le proprie credenziali. È molto più sicuro utilizzare un servizio come Parse o Azure Mobile Services per ospitare un semplice servizio che invia il messaggio e basta chiamarlo dalla tua app. –

+0

Devin, anche con Parse o Azure dovrai inserire il tuo token di autorizzazione nella tua app compilata. –

risposta

16

Se si sta solo cercando di inviare un messaggio SMS in iOS è possibile utilizzare lo MFMessageComposeViewController all'interno dello MessageUI.framework. Come sapete, ciò richiede l'interazione dell'utente.

Come richiesto, è possibile utilizzare Twilio per inviare SMS direttamente utilizzando quasi tutte le piattaforme. Per iOS è possibile utilizzare il seguente codice Swift per colpire l'API Twilio e inviare messaggi di testo che desideri:

func tappedSendButton() { 
    print("Tapped button") 

    // Use your own details here 
    let twilioSID = "AC8c3...6da3" 
    let twilioSecret = "bf2...b0b7" 
    let fromNumber = "4152226666" 
    let toNumber = "4153338888" 
    let message = "Hey" 

    // Build the request 
    let request = NSMutableURLRequest(URL: NSURL(string:"https://\(twilioSID):\(twilioSecret)@api.twilio.com/2010-04-01/Accounts/\(twilioSID)/SMS/Messages")!) 
    request.HTTPMethod = "POST" 
    request.HTTPBody = "From=\(fromNumber)&To=\(toNumber)&Body=\(message)".dataUsingEncoding(NSUTF8StringEncoding) 

    // Build the completion block and send the request 
    NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) in 
     print("Finished") 
     if let data = data, responseDetails = NSString(data: data, encoding: NSUTF8StringEncoding) { 
      // Success 
      print("Response: \(responseDetails)") 
     } else { 
      // Failure 
      print("Error: \(error)") 
     } 
    }).resume() 

Per ogni ulteriore interazione API è possibile controllare la documentazione ufficiale: https://www.twilio.com/docs/api/rest

+0

Sto usando il tuo codice per inviare SMS nell'applicazione iOS. Ma sto ricevendo un errore diverso da te durante l'invio degli SMS. Il numero "A" +91 ********** non è un numero di telefono valido (codice 21211). Ho controllato che il numero che sto utilizzando sia definito correttamente con + (codice paese) (numero di telefono). Puoi aiutarmi in questo problema? - – Rachit

+1

NSString * kToNumber = @ "+ 14126620408"; passare a NSString * kToNumber = @ "% 2B14126620408"; allo stesso modo per da. –

+0

Grazie! mi ha davvero salvato il tempo. –

3

Ok, penso che avevo ragione sulle intestazioni.

ho trovato questa risposta che sembra confermarlo: iOS: how to perform a HTTP POST request?

Si deve inviare i dati POST nel corpo della richiesta, non è nelle intestazioni. Twilio riceve la tua chiamata HTTP ma i dati POST sono vuoti.

Fammi sapere se funziona.

+0

Sì, avevi ragione. È necessario che le variabili siano inviate nel corpo della richiesta piuttosto che nell'intestazione HTTP. –

+0

sì..questa è la risposta corretta ... –

0

E ' potrebbe essere questo:

Il numero + YOURNUMBER non è stato verificato. Gli account di prova non possono inviare messaggi a numeri non verificati; verifica + TUO NUMERO allo twilio.com/user/account/phone-numbers/verified oppure acquista un numero Twilio per inviare messaggi a numeri non verificati.

+0

Significato di in coda? Ho capito questo in risposta. –

2

Utilizzare AFNetworking per inviare una richiesta.

NSString *kTwilioSID = @"AC73bb270.......4d418cb8"; 
NSString *kTwilioSecret = @"335199.....9"; 
NSString *kFromNumber = @"+1......1"; 
NSString *kToNumber = @"+91.......8"; 
NSString *kMessage = @"Hi"; 

NSString *urlString = [NSString 
stringWithFormat:@"https://%@:%@@api.twilio.com/2010-04-01/Accounts/%@/SMS/Messages/", 
kTwilioSID, kTwilioSecret,kTwilioSID]; 

NSDictionary* 
[email protected]{@"From":kFromNumber,@"To":kToNumber,@"Body":kMessage}; 

__block NSArray* jsonArray; 
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.responseSerializer=[AFHTTPResponseSerializer serializer]; 
manager.responseSerializer.acceptableContentTypes=[NSSet setWithObject:@"application/xml"]; 
[manager POST:urlString parameters:para success:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     NSError* err; 
     NSLog(@"success %@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]); 
     jsonArray=[NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments 
error:&err]; 
     [_del getJsonResponsePOST:jsonArray]; 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    { 
     [_del getError:[NSString stringWithFormat:@"%@",error]]; 
    }]; 
+0

Soory guys for formatting.i non so come formattare questo code.but questo è un codice funzionante al 100%. – Iya

+0

Grazie Nathan Tuggy per la corretta formulazione – Iya

+0

Significato di in coda? Ho capito questo in risposta. –

0

Twilio con Swift 2.2 +, Alamofire, SwiftyJSON -> risposta:

import Alamofire 
import SwiftyJSON 
........ 
........ 
//twillio config 
private static let TWILIO_ACCOUNT_SID = "A...7" 
private static let TWILIO_AUTH_TOKEN = "6...5" 
//end url string is .json,to get response as JSON 
static let URL_TWILIO_SMS = "https://\(TWILIO_ACCOUNT_SID):\(TWILIO_AUTH_TOKEN)@api.twilio.com/2010-04-01/Accounts/\(TWILIO_ACCOUNT_SID)/SMS/Messages.json" 


Alamofire.request(.POST, URL_TWILIO_SMS, parameters: ["To":"+880....6","From":"+1...9","Body":"Hellow Rafsun"]) 


     .responseJSON { response in 

      if let jso = response.result.value { 

       let json = JSON(jso) 

       //Twilio response 
       if let twStatus = json["status"].string,twSentMessage = json["body"].string where twStatus == "queued"{ 
       //Twilio message sent 
       }else{ 
       //Twilio message not sent 
       } 

      }else if let error = response.result.error?.localizedDescription{ 
       //parse error 
      } 
    } 
0

Un esempio (aggiornato) per Xcode 8 e Swift 3.

https://www.twilio.com/blog/2016/11/how-to-send-an-sms-from-ios-in-swift.html

Si sconsiglia di riporre il lato client e le credenziali in modo che il post che mostra come evitare una potenziale vulnerabilità utilizzando un linguaggio lato server della vostra scelta e Alamofire per le richieste HTTP:

@IBAction func sendData(sender: AnyObject) { 
    let headers = [ 
     "Content-Type": "application/x-www-form-urlencoded" 
    ] 

    let parameters: Parameters = [ 
     "To": phoneNumberField.text ?? "", 
     "Body": messageField.text ?? "" 
    ] 

    Alamofire.request("YOUR_NGROK_URL/sms", method: .post, parameters: parameters, headers: headers).response { response in 
      print(response) 

    } 
}