Features

Im Folgenden finden Sie die Features, die Sie im Oracle-iOS-SDK konfigurieren können.

Absolute und relative Zeitstempel

  • Feature-Flag: enableTimestamp
  • Feature-Flag: timestampMode

Sie können absolute oder relative Zeitstempel für Chatnachrichten aktivieren. Absolute Zeitstempel zeigen die genaue Zeit für jede Nachricht an. Relative Zeitstempel werden nur in der letzten Nachricht angezeigt und geben die Zeit in Bezug auf die Sekunden, Tage, Stunden, Monate oder Jahre seit der vorherigen Nachricht an. Aufgrund der durch absolute Zeitstempel gebotenen Genauigkeit sind diese ideal für Archivierungsaufgaben. Im begrenzten Kontext einer Chatsession beeinträchtigt diese Genauigkeit aber die Benutzererfahrung, da Benutzer Zeitstempel vergleichen müssen, um die Zeitspanne zwischen Nachrichten zu ermitteln. Mit relativen Zeitstempeln können Benutzer die Unterhaltung einfach durch leicht verständliche Begriffe wie Jetzt gerade und Vor wenigen Minuten verfolgen. Relative Zeitstempel verbessern die Benutzererfahrung auch auf andere Weise und vereinfachen gleichzeitig die Entwicklungsaufgaben: Da relative Zeitstempel die Nachrichten in Sekunden, Tagen, Stunden, Monaten oder Jahren kennzeichnen, müssen Sie sie nicht für andere Zeitzonen konvertieren.

Relative Zeitstempel konfigurieren

Um einen relativen Zeitstempel hinzuzufügen, muss enableTimestamp aktiviert sein (true) und die Einstellung timestampMode, die den Zeitstempelstil steuert, muss timestampMode.relative lauten. Wenn Sie timestampMode.relative festlegen, wird vor der ersten Nachricht des Tages ein absoluter Zeitstempel als Header angezeigt. Dieser Header wird angezeigt, wenn die Unterhaltung nicht gelöscht wurde und ältere Nachrichten noch in der Historie verfügbar sind.

Dieser Zeitstempel wird in folgenden regelmäßigen Intervallen (Sekunden, Minuten usw.) aktualisiert, bis eine neue Nachricht empfangen wird.
  • In den ersten 10 Sekunden
  • Zwischen 10 und 60 Sekunden
  • Jede Minute zwischen 1 und 60 Minuten
  • Jede Stunde zwischen 1 und 24 Stunden
  • Jeden Tag zwischen 1 und 30 Tagen
  • Jeden Monat zwischen 1 und 12 Monaten
  • Jedes Jahr nach dem ersten Jahr
Wenn eine neue Nachricht in den Chat geladen wird, wird der relative Zeitstempel der vorherigen Nachricht entfernt. Stattdessen wird ein neuer Zeitstempel in der neuen Nachricht angezeigt, der die Zeit relativ zur vorherigen Nachricht anzeigt. Ab dann wird der relative Zeitstempel aktualisiert, bis die nächsten Nachrichten eintreffen.

Aktionslayout

Verwenden Sie die Konfigurationseinstellungen BotsProperties.actionsLayout, um die Aktionsschaltflächen in horizontalen oder vertikalen Layouts anzuzeigen. Das Layout kann für lokale Aktionen, globale Aktionen, Kartenaktionen und Formularaktionen festgelegt werden. Der Standardwert für alle Aktionstypen ist horizontal.

BotsProperties.actionsLayout = ActionsLayout(local: .horizontal,global: .vertical,card: .horizontal,form: .horizontal)

Agent-Avatare

Für Skills, in denen Live-Agent-Unterstützung integriert ist, ermöglicht die Einstellung agentAvatar die Anzeige eines Avatarsymbols für die von den Agents gesendeten Nachrichten. Sie konfigurieren dies mit der URL des Symbols, das neben den Agent-Nachrichten angezeigt wird.

Avatare und Agent-Details dynamisch aktualisieren

Sie können die dynamische Aktualisierung der Benutzer- und Agent-Avatare zur Laufzeit mit den setUserAvatar(avatarAsset : String), getAgentDetails() und setUserAvatar(avatarAsset : String) aktivieren.

Benutzeravatar festlegen

Die setPersonAvatar(avatarAsset : String) aktiviert die dynamische Aktualisierung des Benutzeravatars zur Laufzeit. Diese Methode legt den Benutzeravatar für alle Nachrichten fest, einschließlich vorheriger Nachrichten. Folgende avatarAsset kann verwendet werden:
  • Der Name des Assets aus dem Projektordner Assets.
  • Ein externer Link zur Bildquelle, wie im folgenden Beispiel dargestellt.
BotsUIManager.shared().setPersonAvatar(avatarAsset: "https://picsum.photos/200/300")
BotsUIManager.shared().setPersonAvatar(avatarAsset: "userAvatarInAssetsFolder") 

Agent-Details festlegen

Sie können die Agent-Details mit der API setAgentDetails(agentDetails: AgentDetails) anpassen. Neben dem Agent-Namen können Sie mit dieser API auch die Textfarbe und den Avatar anpassen. Wenn kein Agent-Avatar konfiguriert wurde, kann der Avatar dynamisch mit den Agent-Nameninitialen konfiguriert werden. Sie können auch die Farbe dieser Initialen und Hintergrundfarbe anpassen. Die API getAgentDetails() ruft die aktuellen Agent-Details ab.

Obwohl diese APIs jederzeit aufgerufen werden können, wird empfohlen, sie mit den Ereignissen onReceiveMessage() oder beforeDisplay() zu verwenden.

setAgentDetails(agentDetails: AgentDetails)

Um die vom Server empfangenen Agent-Details außer Kraft zu setzen, verwenden Sie diese API wie folgt:
Hinweis

Alle Parameter des Objekts AgentDetails sind optional.
// to override avatar , name and name text colorlet agentDetails = AgentDetails(name: "Bob", avatarImage: "https://picsum.photos/200/300", nameTextColor: .red)
// to override avatar , namelet agentDetails = AgentDetails(name: "Bob", avatarImage: "https://picsum.photos/200/300")
// to override avatar, name, name text color,avatar initials color , avatar background let agentDetails = AgentDetails(name: "Bob", nameTextColor: .red,avatarTextColor: .blue,avatarBackgroundColor: .green)
BotsUIManager.shared().setAgentDetails(agentDetails: agentDetails)
Außerdem kann jede Eigenschaft des AgentDetails-Objekts geändert werden. Beispiel:
let agentDetails = AgentDetails()
agentDetails.name = "Bob"
agentDetails.avatarImage = "agentAvatar"
agentDetails.nameTextColor = .red
agentDetails.avatarBackgroundColor = .green
agentDetails.avatarTextColor = .brown
BotsUIManager.shared().setAgentDetails(agentDetails: agentDetails)

getAgentDetails()

Gibt ein Objekt mit den Agent-Details zurück.
let agentDetails = BotsUIManager.shared().getAgentDetails()

Anhangfilterung

Feature-Flag: shareMenuConfiguration

Verwenden Sie shareMenuConfiguration, um die im Popup-Menü "Teilen" verfügbaren Objekttypen einzuschränken oder zu filtern, den Grenzwert für die Dateigröße in KB für Uploads festzulegen (z.B. 1024 im folgenden Snippet) und die Symbole und Labels des Menüs anzupassen. Der Standardwert und der maximale Grenzwert sind 25 MB.
Hinweis

Bevor Sie shareMenuConfiguration konfigurieren können, müssen Sie enableAttachment auf true setzen.
botsConfiguration.shareMenuConfiguration = ([ShareMenuItem.files, ShareMenuItem.camera, ShareMenuItem.location], [ShareMenuCustomItem(types: [String(kUTTypePDF)], label: "PDF Files", maxSize: 1024), ShareMenuCustomItem(types: [String(kUTTypeText)], label: "Text Files")])
Für types müssen Sie den CFString als entsprechenden Dateityp verwenden und in String konvertieren. Eine andere Zeichenfolge ist nicht gültig. Sie können Benutzern das Hochladen aller Dateitypen ermöglichen, indem Sie types auf String(kUTTypeItem) setzen.

öffentliche Funktion shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem]))

Sie können das Popup-Fenster "Menüoptionen freigeben" dynamisch aktualisieren, indem Sie die API BotsManager.shared().shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem])) aufrufen.
BotsManager.shared().shareMenuItems([ShareMenuItem.files, ShareMenuItem.camera, ShareMenuItem.location], [ShareMenuCustomItem(types: [String(kUTTypePDF)], label: "PDF Files", maxSize: 1024), ShareMenuCustomItem(types: [String(kUTTypeText)], label: "Text Files")])

öffentliches Funkgerät shareMenuItems() -> ([ShareMenuItem], [ShareMenuCustomItem])

Sie können die Liste der Elemente im Menü "Teilen" abrufen, indem Sie die
BotsManager.shared().shareMenuItems();
API.
BotsManager.shared().shareMenuItems()

Feld automatisch weiterleiten

Wenn für ein Feld die Eigenschaft autoSubmit auf true gesetzt ist, sendet der Client eine FormSubmissionMessagePayload mit der Zuordnung submittedField, die entweder die gültigen Feldwerte enthält, die bisher eingegeben wurden. Felder, die noch nicht festgelegt sind (unabhängig davon, ob sie erforderlich sind) oder Felder, die eine clientseitige Validierung verletzen, werden nicht in die submittedField-Map aufgenommen. Wenn das automatisch weitergeleitete Feld selbst einen ungültigen Wert enthält, wird die Weiterleitungsnachricht nicht gesendet, und die Clientfehlermeldung wird für dieses Feld angezeigt. Wenn eine automatische Weiterleitung erfolgreich ist, wird die partialSubmitField in der Formularweiterleitungsnachricht auf id des Feldes autoSubmit gesetzt.

Methoden zum Verbinden, Trennen und Zerstören

Der Skill kann mit den Methoden public func destroy(), public func disconnect() und public func connect() verbunden oder getrennt werden, oder das SDK kann zerstört werden.

public func destroy()

Zerstört das SDK, indem aktive Verbindungen, Spracherkennung, Sprachsynthese, Dateiuploads geschlossen und der SDK-Ansichtscontroller entfernt wird. Nach dem Aufruf kann keine der öffentlichen API-Methoden aufgerufen werden. Sie sind erst wieder aktiv, nachdem die Methode initialize(botsConfiguration: BotsConfiguration, completionHandler: @escaping (ConnectionStatus, Error?) -> ()) erneut aufgerufen wurde, um das SDK zu initialisieren.

public func disconnect()

Alle Netzwerkverbindungen werden nach dem Aufruf der Trennmethode geschlossen.
BotsManager.shared().disconnect()

public func connect()

Die Web Socket-Verbindung wird hergestellt, wenn der Skill nicht verbunden war.
BotsManager.shared().connect()

öffentliche Funkverbindung (botsConfiguration: BotsConfiguration)

Wenn diese Methode mit einer neuen BotsConfiguration aufgerufen wird, wird die vorhandene Web-Socket-Verbindung geschlossen, und mit den neuen Kanaleigenschaften wird eine neue Verbindung hergestellt. Andere Eigenschaften, die in BotsConfiguration festgelegt sind, bleiben unverändert.
var botsConfiguration = BotsConfiguration(url: url, userId: userId, channelId: channelId)
BotsManager.shared().connect(botsConfiguration: botsConfiguration)

Standard-Clientantworten

Feature-Flag: enableDefaultClientResponse

Verwenden Sie enableDefaultClientResponse: true, um standardmäßige clientseitige Antworten mit einem Typisierungsindikator anzugeben, wenn die Skillantwort verzögert wurde oder wenn keine Skillantwort vorhanden ist. Wenn der Benutzer die erste Nachricht/Abfrage sendet, der Skill jedoch nicht mit der von defaultGreetingTimeout festgelegten Anzahl von Sekunden antwortet, kann der Skill eine Begrüßungsnachricht anzeigen, die mit dem Übersetzungsstring odais_default_greeting_message konfiguriert ist. Als Nächstes sucht der Client erneut nach der Antwort des Skills. Der Client zeigt die Antwort des Skills an, wenn sie empfangen wurde. Andernfalls zeigt der Client in durch das Flag defaultWaitMessageInterval festgelegten Intervallen eine Wartemeldung (konfiguriert mit dem odais_default_wait_message-Übersetzungsstring) an. Wenn die Wartezeit auf die Skillantwort den durch das Flag typingStatusTimeout festgelegten Schwellenwert überschreitet, zeigt der Client eine bedauernde Antwort an den Benutzer an und stoppt den Eingabeindikator. Sie können die Entschuldigungsantwort mit dem Übersetzungsstring odais_default_sorry_message konfigurieren.

Delegation

Mit dem Delegationsfeature können Sie einen Delegaten so festlegen, dass Callbacks vor bestimmten Ereignissen in der Unterhaltung empfangen werden. Um einen Delegaten festzulegen, muss eine Klasse dem BotsMessageServiceDelegate-Protokoll entsprechen und die folgenden Methoden implementieren:

public Funk beforeDisplay(message: [String: Any]?) -> [String: Any]?

Mit dieser Methode kann die Nachrichten-Payload eines Skills geändert werden, bevor sie in der Unterhaltung angezeigt wird. Die von der Methode zurückgegebene Nachrichten-Payload wird zum Anzeigen der Nachricht verwendet. Wenn die Methode nil zurückgibt, wird die Nachricht nicht angezeigt.

public Funk beforeSend(message: [String: Any]?) -> [String: Any]?

Mit dieser Methode kann die Payload einer Benutzernachricht geändert werden, bevor sie an den Chatserver gesendet wird. Die von der Methode zurückgegebene Nachrichten-Payload wird an den Skill gesendet. Wenn die Methode nil zurückgibt, wird die Nachricht nicht gesendet.

public func beforeSendPostback(action: [Zeichenfolge: Any]?) -> [Zeichenfolge: Any]?

Mit public func beforeSendPostback(action: [String: Any]?) -> [String: Any]? kann die Payload einer Postback-Aktion geändert werden, bevor sie an den Chatserver gesendet wird. Die von der Methode zurückgegebene Aktions-Payload wird an den Skill gesendet. Wenn die Methode nil zurückgibt, wird die vom Benutzer ausgewählte Postback-Aktion nicht an den Chatserver gesendet.
public class ViewController: UIViewController, BotsMessageServiceDelegate {
    func beforeSend(message: [String : Any]?) -> [String : Any]? {
        // Handle before send delegate here
    }
    
    func beforeDisplay(message: [String : Any]?) -> [String : Any]? {
        // Handle before display delegate here
    }
    
    func beforeSendPostback(action: [String : Any]?) -> [String : Any]? {
        // Handle before send postback action delegate here
    }
}
Die Instanz, die dem BotsMessageServiceDelegate-Protokoll entspricht, muss der Eigenschaft BotsManager.shared().delegate zugewiesen werden, wie im folgenden Code-Snippet zur Initialisierung des SDK dargestellt:
BotsManager.shared().delegate = self

Chat-Session beenden

Feature-Flag: enableEndConversation

Wenn enableEndConversation auf true gesetzt ist, wird der Headeransicht eine Schaltfläche "Schließen" hinzugefügt, mit der Benutzer die aktuelle Chatsession explizit beenden können. Ein Bestätigungsdialogfeld wird geöffnet, wenn Benutzer auf diese Schaltfläche "Schließen" klicken und wenn sie die Schließungsaktion bestätigen, sendet das SDK eine Ereignisnachricht an den Skill, der das Ende der Chatsession markiert. Das SDK trennt dann den Skill von der Instanz, minimiert das Chatwidget und löscht die Unterhaltungshistorie des aktuellen Benutzers. Das SDK löst auch ein chatend-Ereignis im BotsEventListener-Protokoll aus, das Sie implementieren können.

Nach dem Öffnen des Chatwidgets wird eine neue Chatsession gestartet.

Tipp:

Die Unterhaltung kann auch durch Aufrufen der Methode BotsManager.shared().endChat() beendet werden. Diese Methode können Sie verwenden, wenn das SDK im headless-Modus initialisiert wird.

Headless-SDK

Das SDK kann ohne die zugehörige UI verwendet werden. Das SDK verwaltet die Verbindung zum Server und stellt APIs für das Senden von Nachrichten, das Empfangen von Nachrichten und das Abrufen von Aktualisierungen für den Netzwerkstatus und für andere Services bereit. Mit den APIs können Sie mit dem SDK interagieren und die UI aktualisieren.

Sie können eine Nachricht mit den in der Klasse BotsManager verfügbaren send()-APIs senden. Beispiel: public func send(message: UserMessage) sendet eine Textnachricht an einen Skill oder digitalen Assistenten.

öffentliches Funkfernsehen (Nachricht: UserMessage)

Diese Funktion sendet eine Nachricht an den Skill. Der enthaltene Parameter message ist eine Instanz einer Klasse, die der Klasse UserMessage entspricht. In diesem Fall ist dies UserTextMessage.BotsManager.shared().send(message: UserTextMessage(text: "I want to order a pizza", type: .text))

BotsEventListener

Um auf die Änderung des Verbindungsstatus, eine vom Skill empfangene Nachricht und Statusereignisse zu Anhangsuploads zu horchen, kann eine Klasse das BotsEventListener-Protokoll implementieren, das dann die folgenden Methoden implementiert:
  • onStatusChange(ConnectionStatus connectionStatus): Diese Methode wird aufgerufen, wenn sich der Status der WebSocket-Verbindung ändert. Der Parameter connectionStatus ist der aktuelle Status der Verbindung. Weitere Einzelheiten zum Enum ConnectionStatus finden Sie in der API-Dokumentation, die im SDK enthalten ist.
  • onReceiveMessage(message: BotsMessage): Diese Methode wird aufgerufen, wenn eine neue Nachricht vom Skill empfangen wird. Der Parameter message ist die vom Skill empfangene Nachricht. Weitere Einzelheiten zur Klasse BotsMessage finden Sie in der API-Dokumentation, die im SDK enthalten ist.
  • onUploadAttachment(message: BotsAttachmentMessage): Diese Methode wird aufgerufen, wenn ein Anhangsupload abgeschlossen ist. Der Parameter message ist das BotsAttachmentMessage-Objekt für den hochgeladenen Anhang.
  • onDestroy(): Diese Methode wird aufgerufen, wenn die Methode destroy() aufgerufen wird.
  • onInitialize(): Diese Methode wird aufgerufen, wenn die Methode initialize(botsConfiguration: BotsConfiguration, completionHandler: @escaping (ConnectionStatus, Error?) -> ()) aufgerufen wird. Es wird der folgende Parameter verwendet:
    • newLanguage: Das Objekt SupportedLanguage für die neu festgelegte Chatsprache.
  • beforeEndConversation(): Diese Methode wird aufgerufen, wenn die Session zum Beenden der Unterhaltung initiiert wird.
  • chatEnd(): Eine Callback-Methode, die ausgelöst wird, nachdem die Unterhaltung erfolgreich beendet wurde.
extension ViewController: BotsEventListener {
    func onReceiveMessage(message: BotsMessage) {
        // Handle the messages received from skill or Digital Assistant
    }

    func onUploadAttachment(message: BotsAttachmentMessage) {
        // Handle the post attachment upload actions
    }

    func onStatusChange(connectionStatus: ConnectionStatus) {
        // Handle the connection status change
    }

    func onInitialize() {
        //Handle initialization
    }

    func onDestroy() {
        //Handle destroy
    }

    func onChatLanguageChange(newLanguage: SupportedLanguage) {
        //Handle the language change.
    }

    func beforeEndConversation(completionHandler: @escaping (EndConversationStatus) -> Void) {
        //Do the desired cleanup before session is closed.
        return completionHandler(.success) // if cleanup was successfull.
        return completionHandler(.success) // if there was en error cleaning up.
    }
    
     func chatEnd() {
        //Handle successfull session end from server before the SDK is destroyed.
     }
}
Die Instanz, die dem BotsEventListener-Protokoll entspricht, muss der BotsManager.shared().botsEventListener-Eigenschaft zugewiesen werden, wie im folgenden Code-Snippet zur Initialisierung des SDK dargestellt:
BotsManager.shared().botsEventListener = self

Webansicht im Widget

UI-Eigenschaft: LinkHandler

Sie können das Linkverhalten in Chatnachrichten konfigurieren, damit Benutzer über das Chatwidget auf Webseiten zugreifen können. Anstatt die Unterhaltung zu verlassen, um eine Seite auf einer Registerkarte oder in einem separaten Browserfenster anzuzeigen, kann ein Benutzer im Chat verbleiben, da das Chatwidget den Link in einer Webansicht öffnet.

Webansicht im Widget konfigurieren

UI-Eigenschaft: WebViewConfig

Sie können die Webansichtskonfiguration festlegen, indem Sie die Eigenschaft LinkHandler auf LinkHandlerType.webview setzen. WebViewConfig kann auf eine WebViewConfiguration-Strukturinstanz gesetzt werden.
BotsProperties.LinkHandler = LinkHandlerType.webview
//Set the properties which you want changed from the default values.
BotsProperties.WebViewConfig.webViewSize = WebViewSize.full
BotsProperties.WebViewConfig.clearButtonLabelColor = UIColor.black
Wie in diesem Code-Snippet dargestellt, können Sie die folgenden Attribute für die Webansicht festlegen.
Attribut Einstellungen
webViewSize Legt die Bildschirmgröße des Webansichtsfensters im Widget mit dem Attribut WebviewSize fest, das zwei Werte aufweist: partial (WebviewSize.partial) und full (WebviewSizeWindow.full).
clearButtonLabel Legt den Text für die Schaltfläche "Löschen"/"Schließen" in der oberen rechten Ecke der Webansicht fest. Der Standardtext wird aus der Zeichenfolge übernommen, die in der Datei Localizable.strings auf odais_done gesetzt ist.
clearButtonIcon Legt ein Symbol für die Schaltfläche "Löschen" fest, das auf der Schaltfläche linksbündig angezeigt wird. Standardmäßig ist für die Schaltfläche "Löschen" kein Symbol festgelegt. Es ist eine leere Zeichenfolge.
clearButtonLabelColor Legt die Farbe des Textes der Schaltfläche "Löschen" fest. Die Standardfarbe ist UIColor.white.
clearButtonColor Legt die Hintergrundfarbe für die Schaltfläche "Löschen" fest. Die Standardfarbe ist UIColor.clear.
webviewHeaderColor Legt die Hintergrundfarbe für den Webansichtsheader fest.
webviewTitleColor Legt die Farbe des Titels im Header fest. Der Titel ist die URL des geöffneten Weblinks.

Formatierung des Nachrichtenzeitstempels

Das Flag timestampFormat formatiert Zeitstempel, die in den Nachrichten angezeigt werden. Es kann eine Zeichenfolge akzeptieren, die aus Formattoken wie "hh:mm:ss" und anderen Formaten besteht, die von der Swift-Datumsformatierung DateFormatter unterstützt werden.

Mehrsprachiger Chat

Feature-Flag: multiLangChat

Mit der nativen Sprache des iOS-SDK kann das Chatwidget die Sprache eines Benutzers erkennen oder zulassen, dass Benutzer die Unterhaltungssprache auswählen. Benutzer können zwischen Sprachen wechseln, aber nur zwischen Unterhaltungen und nicht während einer Unterhaltung, da die Unterhaltung zurückgesetzt wird, wenn ein Benutzer eine neue Sprache wählt.

Sprachmenü aktivieren

Sie können ein Menü aktivieren, mit dem Benutzer eine bevorzugte Sprache aus einem Dropdown-Menü auswählen können, indem Sie die Eigenschaft multiLangChat mit einem Objekt definieren, das das Array supportedLanguages enthält, das aus Sprachtags (lang) und optionalen Anzeigelabels (label) besteht. Außerhalb dieses Arrays können Sie optional die Standardsprache mit der Variablen primaryLanguage festlegen (MultiLangChat(primaryLanguage: String) im folgenden Snippet).
    botsConfiguration.multiLangChat = MultiLangChat(
            supportedLanguages:[
                SupportedLanguage.init(lang: "en", label: "English"),
                SupportedLanguage.init(lang: "fr"),
                SupportedLanguage.init(lang: "fr-CA", label: "French (Canada)")
            ],
            primaryLanguage: "fr-CA"
        )
Hinweis

Um Sprach- und Regionscodes in lokalisierbaren .lproj-(Lokalisierungsprojekt-)Dateien ordnungsgemäß zu formatieren, verwenden Sie einen Bindestrich (-) als Trennzeichen und keinen Unterstrich (_). Beispiel: Verwenden Sie fr-CA, nicht fr_CA. Dies entspricht der Art und Weise, wie die .lproj-Dateien in der App erstellt werden. Wenn das SDK nach einer .lproj-Datei sucht, versucht es zuerst, eine Datei mit dem exakten languageCode-Region.lproj-Format zu suchen. Wenn eine solche Datei nicht gefunden wird, sucht das SDK nach einer languageCode.lproj-Datei. Wenn dies ebenfalls nicht gefunden wird, sucht das SDK nach einer base.lproj-Datei. Wenn keine dieser Angaben gefunden werden kann, verwendet das SDK standardmäßig Englisch (en).

Das Chatwidget zeigt die übergebenen unterstützten Sprachen in einem Dropdown-Menü im Header an. Neben den verfügbaren Sprachen enthält das Menü auch die Option Sprache ermitteln. Wenn ein Benutzer eine Sprache in diesem Menü auswählt, wird die aktuelle Unterhaltung zurückgesetzt, und eine neue Unterhaltung mit der ausgewählten Sprache wird gestartet. Die vom Benutzer ausgewählte Sprache wird in allen Sessions desselben Browsers beibehalten. So wird die vorherige Sprache des Benutzers automatisch ausgewählt, wenn der Benutzer den Skill über die Seite mit dem Chatwidget erneut öffnet.

Sie können einen Ereignis-Listener für das Ereignis onChatLanguageChange hinzufügen, der ausgelöst wird, wenn eine Chatsprache aus dem Dropdown-Menü ausgewählt oder geändert wurde.

Berücksichtigen Sie bei der Konfiguration der Unterstützung mehrerer Sprachen die folgenden Aspekte:
  • Sie müssen mindestens zwei Sprachen definieren, damit das Dropdown-Menü angezeigt werden kann.
  • Wenn Sie das Attribut primaryLanguage nicht angeben, erkennt das Widget automatisch die Sprache im Benutzerprofil und wählt die Option Sprache erkennen im Menü aus.
  • Der Schlüssel label ist für die nativ unterstützten Sprachen optional: fr wird im Menü als Französisch angezeigt, es als Spanisch usw.
  • Wenn label optional ist und Sie eine Sprache hinzugefügt haben, die nicht nativ unterstützt wird, fügen Sie ein Label zur Identifizierung des Tags hinzu. Beispiel: Wenn Sie nicht label: 'हिंदी' für lang: "hi" definieren, wird im Dropdown-Menü stattdessen hi angezeigt, was zu einer suboptimalen Benutzererfahrung führt.

Sprachmenü deaktivieren

Ab Version 21.12 können Sie die Chatsprache auch konfigurieren und aktualisieren, ohne das Dropdown-Menü für die Sprachauswahl durch Übergabe von MultiLangChat(primaryLanguage: String) konfigurieren zu müssen.

Spracherkennung

Neben den übergebenen Sprachen zeigt das Chatwidget im Dropdown-Menü auch die Option Sprache erkennen an. Bei Auswahl dieser Option erkennt der Skill die Unterhaltungssprache automatisch anhand der Nachricht des Benutzers und antwortet nach Möglichkeit in derselben Sprache.

Sie können die ausgewählte Sprache dynamisch aktualisieren, indem Sie die API BotsManager.shared().setPrimaryLanguage(primaryLanguage: String) aufrufen. Wenn der übergebene lang-Befehl mit einer der unterstützten Sprachen übereinstimmt, wird diese Sprache ausgewählt. Wenn keine Übereinstimmung gefunden werden kann, wird Sprache erkennen aktiviert. Sie können auch die Option Erkannte Sprache aktivieren, indem Sie die BotsManager.shared().setPrimaryLanguage(primaryLanguage: "und")-API aufrufen, wobei "und" "unbestimmt" angibt, oder indem Sie primaryLanguage:nil übergeben.

Sie können die Chatsprache auch dann dynamisch mit der API setPrimaryLanguage(primaryLanguage: String) aktualisieren, wenn das Dropdown-Menü nicht konfiguriert wurde.

Kurzreferenz für mehrsprachigen Chat

Gehen Sie folgendermaßen vor... ... Vorgehensweise
Zeigen Sie den Endbenutzern das Dropdown-Menü "Sprachauswahl" an. Übergeben Sie MultiLangChat(supportedLanguages: [SupportedLanguage]).
Legen Sie die Chatsprache fest, ohne den Endbenutzern das Dropdown-Menü für die Sprachauswahl anzuzeigen. Übergeben Sie MultiLangChat(primaryLanguage: String).
Standardsprache festlegen Übergeben Sie MultiLangChat(supportedLanguages: [SupportedLanguage], primaryLanguage: String).
Spracherkennung aktivieren. Übergeben Sie primaryLanguage:nil oder primaryLanguage:"und".
Chat-Sprache dynamisch aktualisieren. Rufen Sie die API setPrimaryLanguage(primaryLanguage: String) auf.

Vorheriges Eingabeformular ersetzen

Wenn der Endbenutzer das Formular weiterleitet, weil für ein Feld autosubmit auf true gesetzt ist, kann der Skill eine neue EditFormMessagePayload senden. Diese Meldung sollte die vorherige Eingabeformularnachricht ersetzen. Wenn Sie die Kanalerweiterungseigenschaft replaceMessage auf true setzen, aktivieren Sie das SDK, um die vorherige Eingabeformularnachricht durch die aktuelle Eingabeformularnachricht zu ersetzen.

Optionen für das Menü "Teilen"

Standardmäßig werden im Menü "Teilen" Optionen für die folgenden Dateitypen angezeigt:
  • Visuelle Mediendateien (Bilder und Videos)
  • Audio-Dateien
  • Allgemeine Dateien wie Dokumente, PDFs und Kalkulationstabellen
  • Speicherort
Mit der Einstellung sharePopupConfiguration können Sie die Optionen einschränken, die im Menü "Teilen" angezeigt werden. Durch Übergabe eines Tupels von Arrays an ShareMenuConfiguration -- shareMenuConfiguration = ([ShareMenuItem], [ShareMenuCustomItem]) -- können Sie den Typ der im Menü verfügbaren Elemente einschränken oder filtern, die Symbole und Labels des Menüs anpassen und die Größe von Uploaddateien einschränken. Das Tupel enthält ein Array mit Optionen für das Menü "Teilen" des Typs ShareMenuItem und ein Array von Optionen für das Menü "Teilen" des Typs ShareMenuCustomItem. Übergeben Sie die Arrays leer für alle Dateitypen.

öffentliche Funktion shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem]))

Sie können die dynamische Aktualisierung des Menüs über die Methode
shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem]))
Methode.

öffentliche Funktion shareMenuItems() -> ([ShareMenuItem], [ShareMenuCustomItem])

Diese Methode gibt die vorhandene Konfiguration von Elementen des Menüs "Teilen" zurück.

Spracherkennung

  • Feature-Flag: enableSpeechRecognition
  • Funktionskonfiguration: enableAutoSendSpeechResponse

Wenn Sie das Feature-Flag enableSpeechRecognition auf true setzen, kann die Schaltfläche "Mikrofon" anstelle der Sendeschaltfläche angezeigt werden, wenn das Benutzereingabefeld leer ist. Die Sprachdaten werden in Text umgewandelt und an den Skill oder digitalen Assistenten gesendet. Wenn die Sprachdaten teilweise erkannt werden, wird das Teilergebnis in einem Popup angezeigt, das durch Klicken auf die Mikrofonschaltfläche geöffnet wird.

Wenn Sie diese Eigenschaft auf true setzen, wird auch die von der Eigenschaft enableAutoSendSpeechResponse aktivierte Funktionalität unterstützt. Wenn diese Eigenschaft ebenfalls auf true gesetzt wird, kann die Sprachantwort des Benutzers automatisch an den Chatserver gesendet werden, während die Antwort als gesendete Nachricht im Chatfenster angezeigt wird. Sie können es Benutzern ermöglichen, die diktierten Nachrichten zunächst zu bearbeiten (oder zu löschen), bevor sie sie manuell senden. Dazu setzen Sie enableSpeechRecognitionAutoSend auf false.

Die Spracherkennung wird über die folgenden Methoden verwendet:

public func startRecording()

Startet die Aufzeichnung der Sprachnachricht des Benutzers.

öffentliche Funktion stopRecording()

Stoppt die Aufzeichnung der Nachricht des Benutzers.

public func isRecording() -> Bool

Prüft, ob die Sprachaufzeichnung gestartet wurde. Gibt true zurück, wenn die Aufzeichnung gestartet wurde. Andernfalls wird false zurückgegeben.

Mit der Funktion onSpeechResponseReceived(data: String, final: Bool) aus dem BotsEventListener-Protokoll können alle Antworten vom Sprachserver verarbeitet werden.
BotsManager.shared().startRecording()
if (BotsManager.shared().isRecording()) {
    BotsManager.shared().stopRecording() // Stop voice recording
}

Sprachsynthese

  • Feature-Flag: enableSpeechSynthesis
  • Funktionskonfiguration: speechSynthesisVoicePreferences
Das SDK wurde mit Sprachsynthese integriert, um die Nachricht des Skills vorzulesen, wenn eine neue Nachricht vom Skill empfangen wird.
  • Sie aktivieren dieses Feature, indem Sie das Feature-Flag enableSpeechSynthesis auf true setzen.
  • Sie können mit der Eigenschaft speechSynthesisVoicePreferences die bevorzugte Sprache festlegen, in der die Nachrichten des Skills vorgelesen werden. Diese Eigenschaft ermöglicht einen Fallback, wenn das Gerät die bevorzugte Sprache oder Stimme nicht unterstützt. Wenn das Gerät die bevorzugte Stimme nicht unterstützt, wird stattdessen die Standardstimme für die bevorzugte Sprache verwendet. Wenn weder die bevorzugte Stimme noch die bevorzugte Sprache unterstützt wird, werden die Standardstimme und die Standardsprache verwendet.

public func speak(text: String)

Startet das Vorlesen der Antwort des Skills. Der Parameter text ist der Text für die Skillnachricht, die vorgelesen wird.
BotsManager.shared().speak(text: "What kind of crust do you want?")

public func stopSpeech()

Stoppt das Vorlesen der Antwort des Skills.
BotsManager.shared().stopSpeech()

Speech Service-Injection

Feature-Flag: ttsService

Mit dem Feature-Flag ttsService können Sie jeden Text-to-Speech-(TTS-)Service - Ihren eigenen oder einen von einem Drittanbieter bereitgestellten - in das SDK einfügen. Um einen TTS-Service zu injizieren, müssen Sie zuerst das Feature-Flag enableSpeechSynthesis auf true setzen und dann eine Instanz der TTSService-Schnittstelle an das Flag ttsService übergeben.

Das Protokoll TTSService

Sie erstellen eine Instanz einer Klasse, die eine Implementierung der Schnittstelle TTSService ist. Es werden die folgenden Methoden implementiert:
  • speak(text: String): Diese Methode fügt den Text hinzu, der in die Äußerungswarteschlange vorgelesen werden soll. Der Parameter text ist der Text, der vorgelesen werden muss.
  • isSpeaking(): Diese Methode prüft, ob die Audioantwort vorgelesen wird. Gibt false zurück, wenn keine Audioantwort gesprochen wird.
  • stopSpeech(): Diese Methode stoppt jede laufende Sprachsynthese.
   class CustomTTSService: TTSService {

        func speak(text: String) {
            // Adds text to the utterance queue to be spoken
        }
        
        func stopSpeech() {
            // Stops any ongoing speech synthesis
        }
        
        func isSpeaking() -> Bool {
            // Checks whether the bot audio response is being spoken or not.
        }
    }

Eingabeindikator für Benutzer-Agent-Unterhaltungen

Feature-Flag: enableSendTypingStatus

Wenn dieses Flag aktiviert ist, sendet das SDK ein RESPONDING-Eingabeereignis zusammen mit dem Text, der derzeit vom Benutzer eingegeben wird, an Oracle B2C Service oder Oracle Fusion Service. Zeigt einen Tippindikator auf der Agent-Konsole an. Wenn der Benutzer die Eingabe abgeschlossen hat, sendet das SDK ein LISTENING-Ereignis an den Service. Dadurch wird die Eingabeanzeige in der Agent-Konsole ausgeblendet.

Wenn der Agent eingibt, empfängt das SDK ebenfalls ein RESPONDING-Ereignis vom Service. Nach Erhalt dieses Ereignisses zeigt das SDK dem Benutzer einen Tippindikator an. Wenn der Agent im Leerlauf ist, empfängt das SDK das Ereignis LISTENING vom Service. Nach Erhalt dieses Ereignisses blendet das SDK den Eingabeindikator aus, der dem Benutzer angezeigt wird.

Die sendUserTypingStatus-API aktiviert dasselbe Verhalten für den Headless-Modus.
 public func sendUserTypingStatus(status: TypingStatus, text: String? = nil)
  • So zeigen Sie die Eingabeanzeige auf der Agent-Konsole an:
    BotsManager.shared().sendUserTypingStatus(status: .RESPONDING, text: textToSend)
  • So blenden Sie die Eingabeanzeige auf der Agent-Konsole aus:
    BotsManager.shared().sendUserTypingStatus(status: .LISTENING)
  • Um den benutzerdefinierten Eingabeindikator zu steuern, verwenden Sie das Ereignis onReceiveMessage(). Beispiel:
        public func onReceiveMessage(message: BotsMessage) {
            if message is AgentStatusMessage {
                if let status = message.payload["status"] as? String {
                    switch status {
                    case TypingStatus.LISTENING.rawValue:
                        hideTypingIndicator()
                    case TypingStatus.RESPONDING.rawValue:
                        showTypingIndicator()
                    }
                }
            }
        }
Es gibt zwei weitere Einstellungen in BotsConfiguration, die zusätzliche Kontrolle bieten:
  • typingStatusInterval: Standardmäßig sendet das SDK das Eingabeereignis RESPONDING alle drei Sekunden an Oracle B2C Service. Verwenden Sie diesen Indikator, um dieses Ereignis zu drosseln. Der Mindestwert, der festgelegt werden kann, beträgt drei Sekunden.
  • enableAgentSneakPreview: Oracle B2C Service unterstützt die Anzeige des Benutzertextes bei der Eingabe. Wenn dieses Flag auf true gesetzt ist (Standard ist false), sendet das SDK den tatsächlichen Text. Um die Privatsphäre der Benutzer zu schützen, sendet das SDK ... anstelle des Textes an Oracle B2C Service, wenn das Flag auf false gesetzt ist.
    Hinweis

    Dieses Feature muss sowohl im SDK als auch in der Oracle B2C Service-Chatkonfiguration aktiviert sein.

Sprachvisualisierung

Wenn Sprachunterstützung aktiviert ist (botsConfiguration.enableSpeechRecognition = true), wird im Footer des Chatwidgets eine Sprachvisualisierung angezeigt. Dabei handelt es sich um ein dynamisches Visualisierungsdiagramm, das die Frequenzebene der Spracheingabe angibt. Die Visualisierung reagiert auf die Modulation der Benutzerstimme, indem sie angibt, ob der Benutzer zu leise oder zu laut spricht. Diese Visualisierung wird mit der AVAudioEngine von Swift erstellt, die in der onAudioReceived-Methode im SpeechEventListener-Protokoll zur Verwendung im Headless-Modus angegeben ist.

Das Chatwidget zeigt eine Sprachvisualisierung an, wenn Benutzer auf das Sprachsymbol klicken. Es ist ein Indikator dafür, ob der Audiopegel hoch genug ist, damit das SDK die Stimme des Benutzers erfassen kann. Die Nachricht des Benutzers wird als Text erkannt und unter der Visualisierung angezeigt.
Hinweis

Der Sprachfunktionsmodus wird durch Anzeige des Tastatursymbols angegeben.

Wenn botsConfiguration.enableSpeechAutoSendSpeechResponse = true angegeben ist, wird der erkannte Text automatisch an den Skill gesendet, nachdem der Benutzer die Nachricht diktiert hat. Anschließend wird der Modus auf die Texteingabe zurückgesetzt. Wenn botsConfiguration.enableSpeechAutoSendSpeechResponse = false angegeben ist, wird der Modus ebenfalls auf die Texteingabe zurückgesetzt. In diesem Fall können Benutzer jedoch den erkannten Text ändern, bevor sie die Nachricht an den Skill senden.