
シェア:
アブドゥルはVonageのデベロッパー・アドボケイト。iOSエンジニアとして消費者向け製品に携わった経歴を持つ。余暇には、サイクリング、音楽鑑賞、技術者としての道を歩み始めたばかりの人々の指導を楽しんでいる。
Swift、Vapor、VonageでSMSメッセージを送信する方法
はじめに
Vonageの Vonage SMS APIを使うと、プログラムでテキストメッセージを送信できます。このチュートリアルでは Vapor で Vonage SMS API を使って SMS を送信する方法を説明します。
前提条件
Xcode 12とSwift 5以上。
蒸気ツールボックス ツールボックスをインストールしてください。
ベーパープロジェクトの作成
Vaporプロジェクトを作成するには、ターミナルでnew projectコマンド vapor new SwiftTextMessageを使います。最初にFluentを使うかどうか(スキップするには nを押してスキップしてください)、次にLeafを使うかどうか尋ねられます。 Leafは動的な HTML ページを生成するために使うテンプレート言語です。 yを押します。コマンドが終了したら、ディレクトリを変更して cd SwiftTextMessage.
また .envファイルを作成する必要があります。ターミナルで、以下のコマンドを使用してファイルを作成します。 Xと Yをそれぞれ API キーとシークレットに置き換えてファイルを作成します:
これでXcodeでプロジェクトを開くには vapor xcode.Xcodeが開いたら、Swift Package Manager (SPM)を使ってVaporが依存している依存関係をダウンロードし始めます。依存関係を表示するには Package.swiftファイルを開きます。
デフォルトでは、Xcode はランダムなローカルディレクトリからアプリケーションを実行します。ローカルリソースをロードするので、カスタム作業ディレクトリを設定する必要があります。以下を実行してください Product > Scheme > Edit Scheme...で、作業ディレクトリをプロジェクトのルートフォルダに設定します。
Setting custom working directory
CMD+Rを押してビルドし、実行する。完了したら、あなたのウェブページを localhost:8080.
ウェブページの作成
プロジェクトがセットアップされたので、SMS用の電話番号とメッセージを入力するためのインターフェースを作成します。プロジェクトの index.leafファイルを リソース/ビューファイルを開き、更新します:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Send a text message</title>
</head>
<body>
<h1>Send a text message using the Vonage SMS API</h1>
#if(status):
<p> Status of the last SMS: #(status)</p>
#endif
<form action="/send" method="post">
<p>
<label>Phone number E.g. 447000000000</label><br>
<input type="text" name="to">
</p>
<p>
<label>Text message</label><br>
<textarea name="text"> </textarea>
</p>
<button type="submit">Send text</button>
</form>
</body>
</html>上記のコードでは、電話番号とメッセージを入力するフォームを追加している。 POSTリクエストを /send.で始まるリーフブロックに注目してください。 #if(status):.これはstatus変数の値をチェックし、設定されていれば追加のステータス情報を追加します。ビルドして(CMD + R)実行すると、更新されたページが表示されます。
モデル構造体を作成する
Vaporを使うことの利点は、Swift言語の型安全性を利用できることだ。プロトコルに準拠するものを使って、サーバーへの入力と出力をモデル化することができます。 Codableプロトコルに準拠した入出力をモデル化することができます。 Contentと呼ばれるプロトコルがあります。
という構造体を作る。 Inputという構造体を作成する。 Contentに準拠した routes.swiftファイルの最下部に適合する
struct Input: Content {
let to: String
let text: String
let from = "SwiftText"
var apiKey: String?
var apiSecret: String?
private enum CodingKeys: String, CodingKey {
case to
case text
case from
case apiKey = "api_key"
case apiSecret = "api_secret"
}
}Vonage SMS API はフィールドの大文字小文字を区別する必要があります。 CodingKeysenum を使ってプロパティ名を大文字小文字に対応させています。構造体の下に Input構造体の下に、SMS API が期待する応答用の別の構造体を作成します:
struct Response: Content {
let messages: [Messages]
struct Messages: Content {
let status: String
}
} SMSを送信する
SMSを送信するには、Vonage SMS APIのエンドポイントである /smsを呼び出す必要があります。そのためには /sendルートを定義し、フォームデータをパースし、そして呼び出しを行う必要があります。新しいルートを routes関数で新しいルートを定義します:
app.post("send") { req -> EventLoopFuture<View> in
var input = try req.content.decode(Input.self)
input.apiKey = Environment.get("APIKEY")
input.apiSecret = Environment.get("APISECRET")
}これは、フォーム本文を使って Input構造体を作成し、API キーとシークレットを .envファイルから追加します。これらは SMS API の必須フィールドです。次に、Vaporの クライアントAPIを使ってSMS APIを呼び出します。送信ルートに呼び出しを追加します:
app.post("send") { req -> EventLoopFuture<View> in
var input = try req.content.decode(Input.self)
input.apiKey = Environment.get("APIKEY")
input.apiSecret = Environment.get("APISECRET")
return req.client.post(URI(scheme: "https", host: "rest.nexmo.com", path: "/sms/json")) { req in
try req.content.encode(input, as: .json)
}.flatMap { response -> EventLoopFuture<View> in
let responseBody = try! response.content.decode(Response.self)
return req.view.render("index", ["status": responseBody.messages.first?.status == "0" ? "ok" : "error"])
}
}関数呼び出しは client.post関数呼び出しの戻り値の型は EventLoopFuture<ClientResponse>.型にマッピングされる。 EventLoopFuture<View>型にマップされます。map 関数は SMS API のレスポンスを受け取り、ビューレンダラが index.leafファイルで使用します。
試してみる
プロジェクトをビルドして実行(CMD + R)し、ブラウザで localhost:8080ブラウザで開き、電話番号とメッセージを入力する。
Index page of the project
をクリックする。 送信ボタンをクリックすると、先ほど定義したルートにデータが送信され、Vonage SMS APIへの呼び出しが行われ、ステータスが表示されて最初のページに戻ります。
Index page with ok status
次はどうする?
完成したプロジェクトは GitHub.
SMS APIを使用すると、サーバーがSMSを正常に配信したかどうかをチェックするなど、さらに多くのことができます。詳しくは 開発者向けプラットフォーム.