簡體   English   中英

在Swift中使用Twilio發送短信

[英]Send SMS with Twilio in Swift

我嘗試使用Twilio作為服務提供者,但他們沒有我理解的Swift的例子。

我的任務是使用Swil的Twilio API向一個號碼發送短信。

我有一個Twilio.com帳戶 - 那個正在運行。 但是我如何以簡單的方式在Swift代碼中執行此操作。

Twilio確實提供了一個庫 - 但這適用於C#而不是Swift(並且使用橋接頭看起來太復雜了!)

這是C#示例,我需要一個簡單的Swift示例。

// Download the twilio-csharp library from twilio.com/docs/csharp/install
using System;
using Twilio;
class Example 
{
  static void Main(string[] args) 
  {
    // Find your Account Sid and Auth Token at twilio.com/user/account
    string AccountSid = "AC5ef8732a3c49700934481addd5ce1659";
    string AuthToken = "{{ auth_token }}";
    var twilio = new TwilioRestClient(AccountSid, AuthToken);


    var message = twilio.SendMessage("+14158141829", "+15558675309", "Jenny please?! I love you <3", new string[] {"http://www.example.com/hearts.png"});

    Console.WriteLine(message.Sid);
  }
}

Twilio福音傳教士在這里。

要從Swift發送文本消息,您只需直接向Twilios REST API發出請求即可。 也就是說,我建議從iOS應用程序(或任何其他客戶端應用程序)執行此操作,因為它要求您在應用程序中嵌入Twilio帳戶憑據,這很危險。 我建議從服務器端應用程序發送SMS。

如果您確實想從您的應用程序發送消息,我知道有幾個Swift庫可以簡化HTTP請求:

  • Alamofire - 來自AFNetworking的創建者Mattt Thompson - 用於此處的示例: https ://www.twilio.com/blog/2016/11/how-to-send-an-sms-from-ios-in-swift 。 HTML
  • SwiftRequest - 來自Twilio的Ricky Robinett

要使用SwiftRequest發出請求,它看起來像這樣:

var swiftRequest = SwiftRequest();

var data = [
    "To" : "+15555555555",
    "From" : "+15555556666",
    "Body" : "Hello World"
];

swiftRequest.post("https://api.twilio.com/2010-04-01/Accounts/[YOUR_ACCOUNT_SID]/Messages", 
    auth: ["username" : "[YOUR_ACCOUNT_SID]", "password" : "YOUR_AUTH_TOKEN"]
    data: data, 
    callback: {err, response, body in
        if err == nil {
            println("Success: \(response)")
        } else {
            println("Error: \(err)")
        }
});

希望有所幫助。

最近我經歷了Twilio文檔和很少的SO帖子。

您可以使用Swift 2.0中的以下代碼片段發送短信

func sendSMS()
    {

        let twilioSID = "your Sender ID here"
        let twilioSecret = "your token id here"

        //Note replace + = %2B , for To and From phone number
        let fromNumber = "%2B14806794445"// actual number is +14803606445
        let toNumber = "%2B919152346132"// actual number is +919152346132
        let message = "Your verification code is 2212 for signup with <app name here> "

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

如果一切順利..你應該收到這樣的消息..

在此輸入圖像描述

這是無密碼身份驗證的新Swift示例。 有關完整教程,請單擊此處

let url = "http://localhost:8000"
  var swiftRequest = SwiftRequest()
  var params:[String:String] = [
    "token" : token!.text
  ]

  swiftRequest.post(url + "/user/auth/", data: params, callback: {err, response, body in
    if( err == nil && response!.statusCode == 200) {
      if((body as NSDictionary)["success"] as Int == 1) {
        self.showAlert("User successfully authenticated!");
      } else {
        self.showAlert("That token isn't valid");
      }
    } else {
      self.showAlert("We're sorry, something went wrong");
    }
  })

如果您正在使用服務器端Swift與Perfect.org請參閱此博客http://perfecttwilio.blogspot.in

“Devin Rader”的答案是完美的。 對於像我這樣的任何其他用戶,以下是SwiftRequest for swift 3.0的完整轉換代碼。 原始代碼由Ricky Robinett提供。

如有任何錯誤,請告訴我們。

Thankx ..

//
//  SwiftRequest.swift
//  SwiftRequestTest
//
//  Created by Ricky Robinett on 6/20/14.
//  Copyright (c) 2015 Ricky Robinett. All rights reserved.
//
// ***********************************************************
//
// Modification for Swift 3.0 by Sanjay Sampat on 21.Jun.2017
//
// ***********************************************************

import Foundation

public class SwiftRequest {
    var session = URLSession.shared

    public init() {
        // we should probably be preparing something here...
    }

    // GET requests
    public func get(url: String, auth: [String: String] = [String: String](), params: [String: String] = [String: String](), callback: ((_ err: NSError?, _ response: HTTPURLResponse?, _ body: AnyObject?)->())? = nil) {
        let qs = dictToQueryString(data: params)
        request(options: ["url" : url, "auth" : auth, "querystring": qs ], callback: callback )
    }

    // POST requests
    public func post(url: String, data: [String: String] = [String: String](), auth: [String: String] = [String: String](), callback: ((_ err: NSError?, _ response: HTTPURLResponse?, _ body: AnyObject?)->())? = nil) {
        let qs = dictToQueryString(data: data)
        request(options: ["url": url, "method" : "POST", "body" : qs, "auth" : auth] , callback: callback)
    }

    // Actually make the request
    func request(options: [String: Any], callback: ((_ err: NSError?, _ response: HTTPURLResponse?, _ body: AnyObject?)->())?) {
        if( options["url"] == nil ) { return }

        var urlString = options["url"] as! String
        if( options["querystring"] != nil && (options["querystring"] as! String) != "" ) {
            let qs = options["querystring"] as! String
            urlString = "\(urlString)?\(qs)"
        }

        let url = NSURL(string:urlString)
        let urlRequest = NSMutableURLRequest(url: url! as URL)

        if( options["method"] != nil) {
            urlRequest.httpMethod = options["method"] as! String
        }

        if( options["body"] != nil && options["body"] as! String != "" ) {
            var postData = (options["body"] as! String).data(using: String.Encoding.ascii, allowLossyConversion: true)
            urlRequest.httpBody = postData
            urlRequest.setValue("\(postData!.count)", forHTTPHeaderField: "Content-length")
        }

        // is there a more efficient way to do this?
        if( options["auth"] != nil && (options["auth"] as! [String: String]).count > 0) {
            var auth = options["auth"] as! [String: String]
            if( auth["username"] != nil && auth["password"] != nil ) {
                let username = auth["username"]
                let password = auth["password"]
                var authorization = "\(username!):\(password!)"
                if let data = authorization.data(using: String.Encoding.utf8) {
                    //authorization = "Basic " + data.base64EncodedString(options: [])
                    authorization = "Basic " + data.base64EncodedString()
                }

                urlRequest.setValue(authorization, forHTTPHeaderField: "Authorization")
            }
        }

        let task = session.dataTask(with: urlRequest as URLRequest, completionHandler: {body, response, err in
            let resp = response as! HTTPURLResponse?

            if( err == nil) {
                if let gotResponse = response {
                if(gotResponse.mimeType == "text/html") {
                    let bodyStr = NSString(data: body!, encoding:String.Encoding.utf8.rawValue)
                    return callback!(err as NSError?, resp, bodyStr)
                } else if(gotResponse.mimeType == "application/xml") {
                    let bodyStr = NSString(data: body!, encoding:String.Encoding.utf8.rawValue)
                    return callback!(err as NSError?, resp, bodyStr)
                } else if(gotResponse.mimeType == "application/json") {
                    // ss pending
                    do {
                        let jsonAnyObject:AnyObject = try JSONSerialization.jsonObject(with: (body! as NSData) as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: AnyObject] as AnyObject
                        return callback!(err as NSError?, resp, jsonAnyObject as AnyObject);
                    } catch _ {
                    }
                }
            }
            }

            return callback!(err as NSError?, resp, body as AnyObject)
        })

        task.resume()
    }

    func request(url: String, callback: ((_ err: NSError?, _ response: HTTPURLResponse?, _ body: AnyObject?)->())? = nil) {
        request(options: ["url" : url ], callback: callback )
    }

    private func dictToQueryString(data: [String: String]) -> String {

        var qs = ""
        for (key, value) in data {
            let encodedKey = encode(value: key)
            let encodedValue = encode(value: value)
            qs += "\(encodedKey)=\(encodedValue)&"
        }
        return qs
    }

    private func encode(value: String) -> String {

        let queryCharacters =  NSCharacterSet(charactersIn:" =\"#%/<>?@\\^`{}[]|&+").inverted

        if let encodedValue:String = value.addingPercentEncoding(withAllowedCharacters: queryCharacters) {
            return encodedValue
        }

        //let encodedValue:String = value.stringByAddingPercentEncodingWithAllowedCharacters(queryCharacters)!

        return value
    }
}

“Devin Rader”提到的上面使用的示例代碼

    let URL = "https://api.twilio.com/2010-04-01/Accounts/\(myUserIdForBulkSmsMessageSending)/Messages"         
    var swiftRequest = SwiftRequest();

    var data = [
        "To" : "+\(replaceNumberToSendSms)",
        "From" : "+\(replaceNumberFromSendSms)",
        "Body" : message,
        "MediaUrl" : theUrlEncodedMessage
    ];
    //print( "=========VV==========" )
    //print( "URL: \(URL) " )
    //print( "data: \(String(describing: data))" )
    //print( "auth: \(myUserIdForBulkSmsMessageSending)   \(myUserPasswordForBulkSmsMessageSending)")
    //print( "=====================" )
    swiftRequest.post(url: URL,
                      data: data,
                      auth: ["username" : myUserIdForBulkSmsMessageSending, "password" : myUserPasswordForBulkSmsMessageSending],
        callback: {err, response, body in
            if err == nil {
                print("Success: \(String(describing: response))")
                if let currentBody = body {

                    // SSTODO PENDING TO HANDLE SUCCESS OF TWILLO OR ERRORS HANDLING OF TWILLO.

                    //print( "=====================" )
                    //print( " currentBody:  \(currentBody) " )
                    //print( " currentBodyString: \(String(describing: currentBody)) ")
                    //print( "=========^^==========" )
                }
            } else {
                print("Error: \(String(describing: err))")
            }
    });

Swift 3版本:

func sendSMS()
{
    print("Starting...")
    let twilioSID = "ENRET YOUR SID"
    let twilioSecret = "YOUR TOKEN"
    //Note replace + = %2B , for To and From phone number
    let fromNumber = "%29999999"// actual number is +9999999
    let toNumber = "%29999999"// actual number is +9999999
    let message = "Your verification code is 2212 for signup with"

    // Build the request
    let request = NSMutableURLRequest(url: URL(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)".data(using: .utf8)

    // Build the completion block and send the request
    URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) in
        print("Finished")
        if let data = data, let responseDetails = NSString(data: data, encoding: String.Encoding.utf8.rawValue) {
            // Success
            print("Response: \(responseDetails)")
        } else {
            // Failure
            print("Error: \(error)")
        }
    }).resume()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM