https://d226lax1qjow5r.cloudfront.net/blog/blogposts/how-to-make-phone-calls-using-ios-and-react-native/react_inapp-call_ios_1200x600.png

Wie man mit iOS und React Native telefoniert

Zuletzt aktualisiert am April 20, 2021

Lesedauer: 11 Minuten

Dieses Tutorial zeigt Ihnen, wie Sie das Vonage Client SDK zum Erstellen einer React Native iOS-App mit der Funktionalität, eine Telefonnummer anzurufen.

Voraussetzungen

  • Xcode 12, um die App auf einem iOS-Simulator zu erstellen und auszuführen.

  • A GitHub Konto.

  • Cocoapods um das Vonage Client SDK für iOS zu installieren.

  • Unser Command Line Interface, das Sie mit npm install -g @vonage/cli.

  • Homebrew um die React Native-Abhängigkeiten zu installieren.

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.

In diesem Lernprogramm wird auch eine virtuelle Telefonnummer verwendet. Um eine zu erwerben, gehen Sie zu Rufnummern > Rufnummern kaufen und suchen Sie nach einer Nummer, die Ihren Anforderungen entspricht.

React Native einrichten

Um eine React Native-App zu erstellen und auszuführen, müssen Sie zunächst zwei Abhängigkeiten installieren: Node und Watchman. Sie können dies mit Homebrew tun, indem Sie das Folgende in Ihrem Terminal ausführen:

brew install node brew install watchman

Wenn Sie bereits Node installiert haben, vergewissern Sie sich, dass es sich um Node 12 oder eine neuere Version handelt. Weitere Informationen über die Einrichtung Ihrer Umgebung finden Sie in der React Native-Dokumentation.

Das Projekt klonen

Sie können das Projekt auf Ihren lokalen Rechner klonen, indem Sie den folgenden Befehl in Ihrem Terminal ausführen:

git clone git@github.com:Vonage-Community/sample-voice-react-native-app.git

Wechseln Sie dann in Ihrem Terminal mit folgendem Befehl in den neuen Ordner:

cd sample-voice-react-native-app

Nun, da das Projekt geklont wurde, können Sie die Projektabhängigkeiten installieren. Sie können die React Native spezifischen Abhängigkeiten installieren, indem Sie npm install. Dieser Befehl installiert die Abhängigkeiten, die in der package.json Datei aufgelistet sind. Eine Abhängigkeit, die Sie beachten sollten, ist react-native-permissionsein Open-Source-Projekt, das eine einheitliche Methode zum Anfordern von Berechtigungen für iOS und Android bietet. Sie können die iOS-Abhängigkeiten überprüfen, indem Sie sich die Datei Podfile.

Die Vonage-Anwendung

Zur Erstellung der Anwendung verwenden wir unsere Befehlszeilenschnittstelle. Wenn Sie die Befehlszeilenschnittstelle noch nicht eingerichtet haben, können Sie dies tun, indem Sie den Befehl vonage config:set --apiKey=API_KEY --apiSecret=API_SECRET in Ihrem Terminal ausführen, wobei der API-Schlüssel und das Geheimnis der API-Schlüssel und das Geheimnis sind, die Sie in Ihren Einstellungen Ihres Kontos Seite zu finden sind.

Eine Vonage-Nummer kaufen

Für die Anwendung benötigen wir eine Vonage-Nummer, die Sie über die Vonage-CLI erwerben können. Der folgende Befehl sucht nach einer verfügbaren Nummer in den USA. Geben Sie eine alternativen zweistelligen Ländercode um nach einer Nummer in einem anderen Land zu suchen.

vonage numbers:search US

Wenn Sie eine Nummer gefunden haben, können Sie sie mit diesem Befehl kaufen:

vonage numbers:buy $NUMBER US

Einen Webhook-Server erstellen

Wenn ein eingehender Anruf eingeht, stellt Vonage eine Anfrage an eine öffentlich zugängliche URL Ihrer Wahl - wir nennen dies die answer_url. Sie müssen einen Webhook-Server erstellen, der in der Lage ist, diese Anfrage zu empfangen und eine NCCO mit einer connect Aktion enthält, die den Anruf an die PSTN-Telefonnummer. Sie tun dies, indem Sie die Zielnummer aus dem to Abfrageparameter extrahieren und in Ihrer Antwort zurückgeben.

Erstellen Sie einen neuen Ordner:

mkdir vonageapp

cd vonageapp

Installieren Sie die Abhängigkeiten:

npm init -y

npm install express localtunnel --save

Erstellen Sie eine Datei namens server.js die den folgenden Code enthält:

'use strict';

const subdomain = 'SUBDOMAIN';
const vonageNumber = 'NUMBER';

const express = require('express');
const app = express();
app.use(express.json());

app.get('/voice/answer', (req, res) => {
  console.log('NCCO request:');
  console.log(`  - callee: ${req.query.to}`);
  console.log('---');
  res.json([ 
    { 
      "action": "talk", 
      "text": "Please wait while we connect you."
    },
    { 
      "action": "connect",
      "from": vonageNumber,
      "endpoint": [ 
        { "type": "phone", "number": req.query.to } 
      ]
    }
  ]);
});

app.all('/voice/event', (req, res) => {
  console.log('EVENT:');
  console.dir(req.body);
  console.log('---');
  res.sendStatus(200);
});

if(vonageNumber == "NUMBER") {
  console.log('\n\t🚨🚨🚨 Please change the NUMBER value');
  return false;
}

if(subdomain == "SUBDOMAIN") {
  console.log('\n\t🚨🚨🚨 Please change the SUBDOMAIN value');
  return false;
}
app.listen(3000);

const localtunnel = require('localtunnel');
(async () => {
  const tunnel = await localtunnel({ 
      subdomain: subdomain, 
      port: 3000
    });
  console.log(`App available at: ${tunnel.url}`);
})();

Stellen Sie sicher, dass Sie NUMBER durch Ihre Vonage-Nummer (im E.164-Format) sowie SUBDOMAIN durch einen aktuellen Wert. Der SUBDOMAIN Wert wird Teil der URLs, die Sie im nächsten Schritt als Webhooks festlegen. Starten Sie dann den Server:

node server.js

Das Terminal gibt zum Beispiel die URL Ihres Servers aus:

App available at: https://SUBDOMAIN.loca.lt

Erstellen einer Vonage-Anwendung

Als nächstes erstellen Sie eine Vonage Anwendung indem Sie den unten stehenden Befehl kopieren und in das Terminal einfügen. Vergewissern Sie sich, dass Sie die Werte von --voice_answer_url und --voice_event_url Argumente zu ändern, indem Sie SUBDOMAIN durch den im vorherigen Schritt verwendeten Wert ersetzen:

vonage apps:create "Vonage Tutorial" --voice_answer_url=https://SUBDOMAIN.loca.lt/voice/answer --voice_event_url=https://SUBDOMAIN.loca.lt/voice/event

Eine Datei namens vonage_app.json wird in Ihrem Projektverzeichnis erstellt und enthält die neu erstellte Vonage-Anwendungs-ID und den privaten Schlüssel. Eine private Schlüsseldatei mit dem Namen vonage_tutorial.key wird ebenfalls erstellt.

Verknüpfen Sie schließlich die zuvor erworbene Nummer mit Ihrer Vonage-Anwendung:

vonage apps:link APPLICATION_ID --number=YOUR_VONAGE_NUMBER

Ein JWT erstellen

Das Client SDK verwendet JWTs zur Authentifizierung. Das JWT identifiziert den Benutzernamen, die zugehörige Anwendungs-ID und die dem Benutzer gewährten Berechtigungen. Es wird mit Ihrem privaten Schlüssel signiert, um zu beweisen, dass es ein gültiges Token ist. Erstellen Sie einen Benutzer für Ihre Anwendung, indem Sie in Ihrem Terminal den folgenden Befehl ausführen: vonage apps:users:create Alice um einen Benutzer namens Alice zu erstellen. Erstellen Sie dann ein JWT für den Benutzer Alice, indem Sie den folgenden Befehl ausführen und dabei APP_ID durch Ihre Anwendungs-ID von vorhin:

vonage jwt \ --app_id=APP_ID \ --subject=Alice \ --key_file=./phone_to_app_tutorial.key \ --acl='{ "paths": { "/*/users/**": {}, "/*/conversations/**": {}, "/*/sessions/**": {}, "/*/devices/**": {}, "/*/image/**": {}, "/*/media/**": {}, "/*/push/**": {}, "/*/knocking/**": {}, "/*/legs/**": {} } }''

Das Projekt ausführen

Nachdem Sie alle Abhängigkeiten installiert haben, können Sie das Projekt nun starten. Starten Sie zuerst Metro mit npx react-native start. Öffnen Sie dann ein neues Terminalfenster im gleichen Verzeichnis und führen Sie npx react-native run-ios. Mit diesem Befehl wird das iOS-Projekt in einem iOS-Simulator erstellt und ausgeführt. Wenn die App geladen wird, werden Sie aufgefordert, die Mikrofonberechtigung zuzulassen, und dann wird die App angezeigt. Sie besteht aus einem Label, das den Verbindungsstatus anzeigt, einem Label, das den Anrufstatus anzeigt, und einer Aktionsschaltfläche.

iOS app UIiOS app UI

Wenn Sie den Ordner App.tsx Ordner öffnen, können Sie sich ansehen, wie dies in der render Funktion:

render() {
    return (
      <SafeAreaView>
        <View style={styles.status}>
          <Text>
            {this.state.status}
          </Text>

          <View style={styles.container}>
            <Text style={styles.callState}>
              Call Status: {this.state.callState}
            </Text>
            <Pressable
              style={styles.button}
              onPress={this.state.callAction}>
              <Text style={styles.buttonText}>{this.state.button}</Text>
            </Pressable>
          </View>
        </View>
      </SafeAreaView>
    );
}

Wenn Sie bereits mit React gearbeitet haben, wird Ihnen diese Syntax vertraut sein. A Text Komponente wird für die Beschriftungen verwendet, eine Pressable Komponente für die Schaltfläche, zusammen mit dem Styling-CSS am oberen Rand. Alle drei Komponenten machen Gebrauch von Zustand. Zustandsdaten sind Parameter für Komponenten, die sich im Laufe der Zeit ändern. Der Status wird am Anfang der App Klasse im Konstruktor mit Standardinformationen initialisiert. Sie können die JWT, die Sie im vorherigen Schritt erstellt haben, einfügen und die Datei speichern (CMD + S). Der Simulator wird neu geladen, und wenn Sie nun die Anmeldetaste drücken, stellt das Client SDK eine Verbindung her. Sie können nun einen Anruf tätigen.

iOS app UI logged iniOS app UI logged in

Wie man mit nativem Code kommuniziert

Berechtigungen

Wie bereits erwähnt, verwendet das Projekt die react-native-permissions Bibliothek, um die Arbeit mit Berechtigungen auf verschiedenen Plattformen zu erleichtern. In der componentDidMount Funktion können Sie sehen, wie viel Code in JavaScript erforderlich ist, um Berechtigungen anzufordern:

if (Platform.OS === 'ios') {
  request(PERMISSIONS.IOS.MICROPHONE);
} else if (Platform.OS === 'android') {
  requestMultiple([PERMISSIONS.ANDROID.RECORD_AUDIO, PERMISSIONS.ANDROID.READ_PHONE_STATE]);
}

Neben der Installation des zugehörigen iOS-Codes, der im Podfilebenötigt wird, muss auch die Verwendungsbeschreibung in die info.plist Datei hinzugefügt werden.

Das Client-SDK

Das Client SDK ist eine systemeigene Abhängigkeit, daher muss es eine Möglichkeit geben, zwischen dem JavaScript-Code auf App.tsx und dem nativen iOS-Code zu kommunizieren. Es gibt zwei Möglichkeiten, dies zu tun, abhängig von der Richtung der Informationen. NativeModules Exponieren Sie native Klassen in JavaScript, damit Sie nativen Code ausführen können. Die NativeEventEmitter API ermöglicht es nativem Code, Signale an JavaScript-Code zu senden. Sehen Sie sich die componentDidMount Funktion in der App Klasse. Sie können sehen, dass der JavaScript-Code auf zwei verschiedene Signale wartet, onStatusChange und onCallStateChangedie die Benutzeroberfläche und die Aktion, die die Schaltfläche ausführt, aktualisieren.

eventEmitter.addListener('onStatusChange', (data) => {
...
});

eventEmitter.addListener('onCallStateChange', (data) => {
...
});

diagram showing the flow between javascript code and native codediagram showing the flow between javascript code and native code

Wenn Sie das Verzeichnis ios Verzeichnis des Projekts öffnen, sehen Sie eine Klasse namens EventEmitter (ios/RNAppToPhone/EventEmitter.m). Die Klasse EventEmitter Klasse exportiert die unterstützten Ereignisse und hat zwei Funktionen, die Signale an den JavaScript-Code senden.

- (NSArray<NSString *> *)supportedEvents {
  return @[@"onStatusChange", @"onCallStateChange"];
}

- (void)sendStatusEventWith:(nonnull NSString *)status {
  if (_hasListeners) {
    [self sendEventWithName:@"onStatusChange" body:@{ @"status": status }];
  }
}

- (void)sendCallStateEventWith:(nonnull NSString *)state {
  if (_hasListeners) {
    [self sendEventWithName:@"onCallStateChange" body:@{ @"state": state }];
  }
}

Diese Funktionen werden von der ClientManager Klasse (ios/RNAppToPhone/ClientManager.m). Die ClientManager Klasse ist ein Wrapper um das Client SDK. Beide Klassen enthalten das RCT_EXPORT_MODULE Makro, das die nativen Modulklassen exportiert und bei React Native registriert, so dass sie verwendet werden können als NativeModules. ClientManager.m macht Gebrauch von einem zusätzlichen Makro, RCT_EXPORT_METHOD. Mit diesem Makro kann die Methode von JavaScript aus aufgerufen werden. Hier ist zum Beispiel die Login-Funktion, die Sie früher verwendet haben:

RCT_EXPORT_METHOD(login:(NSString *)jwt) {
  [ClientManager.shared.client createSession:jwt
                                    callback:^(NSError * _Nullable error, NSString * _Nullable sessionId) {
    if (error != nil) {
      [ClientManager.shared.eventEmitter sendStatusEventWith:@"Error"];
      return;
    } else {
      [ClientManager.shared.eventEmitter sendStatusEventWith:@"Connected"];
    }
  }];
}

So würde sie in JavaScript aufgerufen werden:

ClientManager.login("ALICE_JWT")

Wie geht es weiter?

In diesem Tutorial haben wir gelernt, wie man eine iOS-App mit dem React Native Framework erstellt. Außerdem haben wir eine Funktion hinzugefügt, um einen Anruf an eine physische Telefonnummer zu tätigen. Das komplette Projekt finden Sie auf GitHubund die Android-Version dieses Blogs auf learn.vonage.com.

Nachfolgend finden Sie einige andere Tutorials oder Dokumentationen, die sich auf das Client SDK beziehen:

Wie immer, wenn Sie Fragen, Ratschläge oder Ideen haben, die Sie mit der Community teilen möchten, können Sie sich gerne in unserem Slack-Arbeitsbereich der Community. Ich würde gerne hören, wie ihr mit diesem Tutorial zurechtgekommen seid und wie euer Projekt funktioniert.

Share:

https://a.storyblok.com/f/270183/400x400/19c02db2d3/abdul-ajetunmobi.png
Abdul AjetunmobiSenior Advocate für Entwickler

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.