2011-07-26 75 views
5

如何从iPhone应用程序以编程方式发送短信?我现在正在使用Twilio,并且可以正确设置HTTP请求,与服务器进行身份验证并获得响应。在iOS上发送短信与Twilio

由于我可以从Twilio服务器获得响应,但是从不传递正确的数据,所以必须存在HTTP头的某些配置错误。

我目前的代码是在一个简单的按钮按下的方法。

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

我认为问题在于你应该使用POST字段,而不是HTTP标题......我将验证那真的很快...... –

+0

请注意,不建议使用Twilio API直接从iOS应用程序发送短信,因为您必须在应用程序中嵌入您的AccountSid和AuthToken,该应用程序可以很容易地反编译妥协您的凭据。使用Parse或Azure移动服务等服务来托管一个简单的服务来发送消息并从您的应用程序调用该服务会更安全。 –

+0

Devin,即使使用Parse或Azure,您也必须将您的授权令牌放入已编译的应用程序中。 –

回答

16

如果您只是想在iOS发送短信,您可以使用MessageUI.framework中的MFMessageComposeViewController。如你所知,这需要用户交互。

正如您所要求的,您可以使用Twilio直接使用几乎任何平台发送短信。在iOS设备上,你可以使用下面的代码斯威夫特打Twilio API和发送任何短信你想:

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

任何进一步API互动,你可以检查出的官方文档:https://www.twilio.com/docs/api/rest

+0

我使用你的代码在iOS应用程序中发送短信。但是,在发送短信时,我收到了与您不同的错误。 '收件人'号码+91 **********不是有效的电话号码(代码21211)我检查了我使用的号码是否正确地用+(国家代码)(电话号码)定义。你能帮我解决这个问题吗? - – Rachit

+1

NSString * kToNumber = @“+ 14126620408”; 更改为NSString * kToNumber = @“%2B14126620408”; 同样适用于。 –

+0

谢谢!那真的节省了我的时间。 –

3

好的,我认为我是正确的头。

我发现这个答案似乎确认:iOS: how to perform a HTTP POST request?

你要发送POST数据请求的身体,而不是在头部。 Twilio正在获取您的HTTP呼叫,但POST数据为空。

让我知道这是否有效。

+0

是的,你是对的。它需要在请求的主体中发送变量,而不是HTTP头。 –

+0

是的..这是正确的答案... –

0

它可能是这样的:

该号码+ YOURNUMBER未验证。试用帐户不能将邮件发送给未经验证的号码;请在twilio.com/user/account/phone-numbers/verified处验证+ YOURNUMBER,或购买Twilio号码以将邮件发送给未经验证的号码。

+0

排队的含义?我得到这个回应。 –

2

使用AFNetworking发送请求。

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不知道如何格式化此代码,但这是100%的工作代码。 – Iya

+0

谢谢Nathan Tuggy正确的格式化 – Iya

+0

排队的的含义?我得到这个回应。 –

0

Twilio与夫特2.2+AlamofireSwiftyJSON - >答案:

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

为Xcode的8和夫特3一个例子(更新)。

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

我们不建议您保存凭据客户端等岗位说明如何使用您的选择和Alamofire的服务器端语言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) 

    } 
}