https://d226lax1qjow5r.cloudfront.net/blog/blogposts/how-to-send-sms-messages-with-swift-and-vapor-using-async-await/2fa_swift-vaporasync-1.png

Wie man mit Swift und Vapor SMS-Nachrichten mit Async/Await versendet

Zuletzt aktualisiert am November 19, 2021

Lesedauer: 4 Minuten

Swift 5.5 führt das async/await-Sprachfeature ein, um die Lesbarkeit von nebenläufigem Swift-Code zu verbessern, indem es die Notwendigkeit von Abschlusshandlern beseitigt. Dieser Beitrag ist sehr ähnlich zu Wie man SMS-Nachrichten mit Swift, Vapor und Vonage versendet in unserem Blog. Dieser Beitrag verwendet die Messages API V1 und nicht die SMS API, aber es ist eine gute Möglichkeit, die Verbesserungen durch die Verwendung von async/await zu veranschaulichen.

Wenn Sie mit dem ursprünglichen Blog-Beitrag vertraut sind, können Sie zum Abschnitt "Senden der SMS" übergehen.

Voraussetzungen

Vonage API-Konto

Um dieses Tutorial durchzuführen, benötigen Sie ein Vonage API-Konto. Wenn Sie noch keines haben, können Sie sich noch heute anmelden und mit einem kostenlosen Guthaben beginnen. Sobald Sie ein Konto haben, finden Sie Ihren API-Schlüssel und Ihr API-Geheimnis oben auf dem Vonage-API-Dashboard.

Ein Vapor-Projekt erstellen

Sie können ein Vapor-Projekt erstellen, indem Sie den Befehl new project vapor new AsyncTextMessage in Ihrem Terminal erstellen. Zuerst werden Sie gefragt, ob Sie Fluent verwenden möchten (drücken Sie n zum Überspringen) und dann, ob Sie Leaf verwenden wollen. Leaf ist eine Schablonensprache, mit der Sie dynamische HTML-Seiten erzeugen können, also drücken Sie y um sie einzubinden. Sobald der Befehl beendet ist, wechseln Sie in das Verzeichnis, das er für Sie erstellt hat, indem Sie cd AsyncTextMessage.

Sie müssen auch eine .env Datei erstellen, in der Sie die Anmeldedaten für Ihr Vonage API-Konto speichern. Verwenden Sie in Ihrem Terminal den folgenden Befehl, um die Datei zu erstellen, die X und Y durch Ihren API-Schlüssel bzw. Ihr Geheimnis:

echo "APIKEY=X \nAPISECRET=Y" > .env

Jetzt können Sie das Projekt in Xcode mit dem Befehl vapor xcode Befehl öffnen. Sobald Xcode geöffnet ist, beginnt es mit dem Herunterladen der Vapor-Abhängigkeiten mit dem Swift Package Manager (SPM). Um die Abhängigkeiten zu sehen, können Sie die Package.swift Datei öffnen.

Standardmäßig führt Xcode Ihre Anwendung aus einem zufällig ausgewählten lokalen Verzeichnis aus. Da Sie lokale Ressourcen laden werden, müssen Sie ein eigenes Arbeitsverzeichnis festlegen. Gehen Sie zu Produkt > Schema > Schema bearbeiten... und setzen Sie das Arbeitsverzeichnis auf den Stammordner Ihres Projekts.

Setting custom working directory

Drücken Sie CMD+R zum Erstellen und Ausführen. Nach der Fertigstellung finden Sie Ihre Webseite unter localhost:8080.

Eine Webseite erstellen

Nachdem Ihr Projekt nun eingerichtet ist, erstellen Sie eine Schnittstelle zur Eingabe einer Telefonnummer und einer Nachricht für die SMS. Öffnen Sie die index.leaf Datei unter Ressourcen/Ansichten und aktualisieren Sie sie:

<!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 Messages API</h1>

    #if(messageId):
      <p> Successful SMS ID: #(messageId)</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>

Der obige Code fügt ein Formular mit Eingaben für eine Telefonnummer und eine Nachricht hinzu, und sobald das Formular abgeschickt wurde, wird eine POST Anfrage an /send. Beachten Sie den Leaf-Block, der mit # beginntif(messageId):. Er prüft, ob ein Wert für die Variable messageId und fügt, wenn er gesetzt ist, den Text in die Seite ein. Wenn Sie das Programm erstellen und ausführen (CMD + R), sehen Sie jetzt Ihre aktualisierte Seite.

Erstellen Sie die Modellstrukturen

Ein Vorteil der Verwendung von Vapor ist, dass Sie sich auf die Typsicherheit der Swift-Sprache stützen können. Sie können Eingaben und Ausgaben für Ihren Server modellieren, die mit dem Codable Protokoll entsprechen; Vapor hat ein Content Protokoll für dies.

Erstellen Sie eine Struktur namens Input die konform ist mit Content am Ende der Datei routes.swift Datei:

struct Input: Content {
    let to: String
    let text: String
    let from = "SwiftText"
    let channel = "sms"
    let messageType = "text"

    private enum CodingKeys: String, CodingKey {
        case to
        case text
        case from
        case channel
        case messageType = "message_type"
    }
}

Die Vonage Messages API erwartet Felder in Snake Case, daher haben die Structs das CodingKeys Enum, um ihre Eigenschaftsnamen auf ihre Snake Case Entsprechung abzubilden. Unterhalb der Input-Struktur erstellen Sie eine weitere Struktur für die Antwort, die von der Messages API erwartet wird:

struct Response: Content {
    let messageId: String
    
    private enum CodingKeys: String, CodingKey {
        case messageId = "message_uuid"
    }
}

Senden Sie die SMS

Um die SMS zu versenden, müssen Sie die Vonage Messages API aufrufen. Dazu müssen Sie die vom Webformular verwendete /send Route definieren, die vom Webformular verwendet wird, die Formulardaten parsen und dann die Anfrage stellen. Beginnen Sie mit der Definition der neuen Route in der routes Funktion:

app.post("send") { req async throws -> View in
    do {
        let input = try req.content.decode(Input.self)
    }
}

Beachten Sie, dass die Methode Folgendes verwendet req async throws -> View in. Dies bedeutet, dass die Funktion asynchron ist und Fehler auslösen kann. Daher der do Block, der die Webformularfelder in eine Input Struktur. Der Abschluss gibt eine View. Dies unterscheidet sich von der früheren Vorgehensweise, bei der Sie eine Zukunft zurückgeben mussten, die sich schließlich in eine View.

Als nächstes werden Sie Vapors Client API von Vapor, mit der Sie externe HTTP-Aufrufe tätigen können, um die Messages API aufzurufen. Fügen Sie den Aufruf zur Send-Route hinzu:

app.post("send") { req async throws -> View in
    do {
        let input = try req.content.decode(Input.self)
        
        let clientResponse = try await req.client.post("https://api.nexmo.com/v1/messages") { req in
            try req.content.encode(input, as: .json)
            let auth = BasicAuthorization(
                username: Environment.get("APIKEY")!,
                password: Environment.get("APISECRET")!
            )
            req.headers.basicAuthorization = auth
        }
        
        let messageResponse = try clientResponse.content.decode(Response.self)
        
        return try await req.view.render(
            "index",
            ["messageId": "\(messageResponse.messageId)"]
        )
    }
}

Der obige Code wartet auf das Ergebnis des Aufrufs der Messages API, die die API-Anmeldeinformationen für die Autorisierung verwendet, und clientResponse wird mit dem Ergebnis gesetzt. So können Sie den Code so schreiben, als ob er synchron wäre. Da sich der Code außerdem in einem do Block steht, wird im Falle eines Fehlers dieser einfach ausgelöst und automatisch behandelt oder Sie können ein catch hinzufügen, um sie selbst zu behandeln.

Die folgende Zeile dekodiert die Antwort von der Messages API, die dann zum Rendern der Seite verwendet wird. Auch hier wird try awaitund wenn req.view.render abgeschlossen ist, gibt es entweder eine View Instanz zurück oder gibt einen Fehler aus.

Probieren Sie es aus

Erstellen Sie das Projekt und führen Sie es aus (CMD + R), öffnen Sie localhost:8080 in Ihrem Browser und geben Sie dann eine Telefonnummer und eine Nachricht ein.

Sending a message via the web page

Wenn Sie auf die Schaltfläche "Senden" klicken, werden die Daten an die zuvor definierte Route gesendet, die Vonage Messages API wird aufgerufen und bei Erfolg wird die Nachrichten-ID angezeigt.

The web page showing a successful message ID

Wie geht es weiter?

Sie finden das fertige Projekt auf GitHub.

Mit der Messages API können Sie noch mehr tun, z. B. Nachrichten an Whatsapp und Facebook Messenger senden. Erfahren Sie mehr darüber auf unserer Entwicklerplattform.

Teilen Sie:

https://a.storyblok.com/f/270183/400x400/19c02db2d3/abdul-ajetunmobi.png
Abdul AjetunmobiVonage Ehemaliges Teammitglied

Abdul ist ein Developer Advocate für Vonage. Er hat einen Hintergrund als iOS-Ingenieur im Bereich Verbraucherprodukte. In seiner Freizeit fährt er gerne Rad, hört Musik und berät diejenigen, die gerade ihre Reise in die Technologiebranche beginnen.