【问题标题】:Send SMS Message with Twilio on iOS在 iOS 上使用 Twilio 发送 SMS 消息
【发布时间】:2011-10-13 13:01:12
【问题描述】:

如何通过 iPhone 应用程序以编程方式发送 SMS 消息?我现在正在使用 Twilio,并且可以正确设置 HTTP 请求、通过服务器进行身份验证并获得响应。

HTTP 标头一定存在一些错误配置,因为我可以从 Twilio 服务器获得响应,但从未传递正确的数据。

我当前的代码在一个通过简单的按钮调用调用的方法中。

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

【问题讨论】:

  • 我认为问题在于您应该使用 POST 字段,而不是 HTTP 标头...我会尽快验证...
  • 请注意,不建议使用 Twilio API 直接从 iOS 应用程序发送短信,因为您必须在应用程序中嵌入您的 AccountSid 和 AuthToken,这很容易被反编译而危及您的凭据。使用 Parse 或 Azure 移动服务之类的服务来托管一个简单的服务来发送消息并从您的应用程序中调用它会更加安全。
  • Devin,即使使用 Parse 或 Azure,您也必须将授权令牌放入已编译的应用程序中。
  • queued 的含义?我得到这个回应。

标签: ios objective-c swift sms twilio


【解决方案1】:

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

如您所愿,您几乎可以使用任何平台使用 Twilio 直接发送 SMS。对于 iOS,您可以使用以下 Swift 代码来访问 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

【讨论】:

  • 我正在使用您的代码在 iOS 应用程序中发送短信。但是我在发送短信时遇到了与您不同的错误。 “收件人”号码 +91********** 不是有效的电话号码(代码 21211) 我已检查我使用的号码是否已正确定义为 +(国家代码)(电话号码)。你能帮我解决这个问题吗? ——
  • NSString *kToNumber = @"+14126620408";更改为 NSString *kToNumber = @"%2B14126620408";类似的来自。
  • 谢谢!这真的节省了我的时间。
  • @steven hepting queued 的含义?我得到这个回应。
  • @PramodTapaniya 这只是意味着 Twilio 服务器已正确接收到您发送短信的请求,并且他们将代表您与运营商网络交谈以确保发送短信。跨度>
【解决方案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*
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]];
    }];

【讨论】:

  • Soory 各位格式化。我不知道如何格式化此代码。但这是 100% 工作代码。
  • queued 的含义?我得到这个回应。
【解决方案3】:

可能是这样的:

号码 +YOURNUMBER 未经验证。试用账户无法向未经验证的号码发送消息;在 twilio.com/user/account/phone-numbers/verified 验证 +YOURNUMBER,或购买 Twilio 号码以向未经验证的号码发送消息。

【讨论】:

  • queued 的含义?我得到这个回应。
【解决方案4】:

带有 Swift 2.2+AlamofireSwiftyJSON 的 Twilio -> 答案:

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

【讨论】:

    【解决方案5】:

    Xcode 8 和 Swift 3 的示例(更新)。

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

    我们不建议在客户端存储您的凭据,因此该帖子向您展示了如何使用您选择的服务器端语言和用于 HTTP 请求的 Alamofire 来避免潜在漏洞:

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

    【讨论】: