Enviar post de text con Twilio en iOS

¿Cómo puedo enviar un post SMS de forma progtwigda desde una aplicación de iPhone? Estoy usando Twilio en este momento, y puedo configurar correctamente una request HTTP, autenticar con el server y get una respuesta.

Debe haber alguna configuration incorrecta de los encabezados HTTP ya que puedo get una respuesta de los serveres Twilio pero nunca pasa los datos correctos.

Mi código actual está en un método al que se llama mediante un simple button presionar.

- (IBAction)sendButtonPressed:(id)sender { NSLog(@"Button pressed."); NSString *kYourTwillioSID = @"AC8c3...f6da3"; NSString *urlString = [NSString stringWithFormat:@"https://AC8c3...6da3:bf...0b7@api.twilio.com/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); 

Si solo está buscando enviar un post SMS en iOS, puede usar MFMessageComposeViewController dentro de MessageUI.framework . Sin embargo, como usted sabe, esto requiere interacción del usuario.

Como lo solicitó, puede usar Twilio para enviar SMS directamente con casi cualquier plataforma. Para iOS, puede usar el siguiente código Swift para acceder a Twilio API y enviar los posts de text que desee:

 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.shanetworkingSession().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() 

Para cualquier interacción API adicional, puede consultar los documentos oficiales: https://www.twilio.com/docs/api/rest

Ok, creo que tenía razón sobre los encabezados.

Encontré esta respuesta que parece confirmarlo: iOS: ¿cómo realizar una request HTTP POST?

Debe enviar los datos POST en el cuerpo de la request, no en los encabezados. Twilio está recibiendo su llamada HTTP pero los datos POST están vacíos.

Avísame si eso funciona.

Utilice AFNetworking para enviar la request.

 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* dic=@{@"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]]; }]; 

Podría ser esto:

El número + SU NÚMERO no está verificado. Las counts de testing no pueden enviar posts a numbers no verificados; verifique + SU NÚMERO en twilio.com/user/account/phone-numbers/verified , o compre un número Twilio para enviar posts a numbers no verificados.

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

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

Un ejemplo (actualizado) para Xcode 8 y Swift 3 .

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

No recomendamos save el lado del cliente de sus cnetworkingenciales y, por lo tanto, la publicación muestra cómo evitar una vulnerabilidad potencial utilizando un lenguaje del lado del server de su elección y Alamofire para requestes 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) } }