2011-07-26 57 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) 

    } 
}