Recursos

Aqui estão os recursos que você pode configurar no Oracle iOS SDK.

Timestamps Absolutos e Relativos

  • Flag do recurso: enableTimestamp
  • Flag do recurso: timestampMode

Você pode ativar timestamps absolutos ou relativos para mensagens de chat. Os timestamps absolutos exibem a hora exata de cada mensagem. Os timestamps relativos só são exibidos na mensagem mais recente e expressam o tempo em termos de segundos, dias, horas, meses ou anos atrás em relação à mensagem anterior. A precisão fornecida por timestamps absolutos os torna ideais para tarefas de arquivamento, mas dentro do contexto limitado de uma sessão de chat, essa precisão é extraída da experiência do usuário porque os usuários devem comparar os timestamps para descobrir a passagem de tempo entre as mensagens. Os timestamps relativos permitem que os usuários rastreiem a conversa facilmente por meio de termos como Há Pouco e Há alguns momentos que podem ser imediatamente compreendidos. Os timestamps relativos melhoram a experiência do usuário de outra forma, além de também simplificar suas tarefas de desenvolvimento: como os timestamps relativos marcam as mensagens em termos de segundos, dias, horas, meses ou anos atrás, você não precisa convertê-las em fusos horários.

Configurar Timestamps Relativos

Para adicionar um timestamp relativo, enableTimestamp deve ser ativado (true) e timestampMode, que controla o estilo de timestamp, deve ser timestampMode.relative. Ao definir timestampMode.relative, um timestamp absoluto é exibido antes da primeira mensagem do dia como cabeçalho. Esse cabeçalho é exibido quando a conversa não foi limpa e mensagens mais antigas ainda estão disponíveis no histórico.

Esse timestamp é atualizado nos seguintes intervalos regulares (segundos, minutos etc.) até que uma nova mensagem seja recebida.
  • Nos primeiros 10s
  • Entre 10s e 60s
  • Cada minuto entre 1m e 60m
  • Cada hora entre 1hr e 24hr
  • Cada dia entre 1d e 30d
  • Cada mês entre 1m e 12m
  • Todo ano após o primeiro ano
Quando uma nova mensagem é carregada no chat, o timestamp relativo na mensagem anterior é removido e um novo timestamp aparece na nova mensagem exibindo a hora relativa à mensagem anterior. Nesse ponto, o timestamp relativo é atualizado até que a próxima mensagem chegue.

Layout de Ações

Use as definições de configuração BotsProperties.actionsLayout para exibir os botões de ação em layouts horizontais ou verticais. O layout pode ser definido para ações locais, ações globais, ações de cartão e ações de formulário. O valor padrão é horizontal para todos os tipos de ação.

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

Avatars do Agente

Para habilidades integradas ao suporte ao agente ao vivo, a definição agentAvatar permite a exibição de um ícone de avatar para as mensagens enviadas pelos agentes. é possível configura isso com o URL do ícone que é exibido ao lado das mensagens do agente.

Atualizar Dinamicamente Avatares e Detalhes do Agente

Você pode ativar os avatares do usuário e do agente para serem atualizados dinamicamente no runtime usando setUserAvatar(avatarAsset : String), getAgentDetails() e setUserAvatar(avatarAsset : String).

Definir o Avatar do Usuário

O setPersonAvatar(avatarAsset : String) permite a atualização dinâmica do avatar do usuário no runtime. Este método define o avatar do usuário para todas as mensagens, incluindo mensagens anteriores. O avatarAsset pode ser:
  • O nome do ativo da pasta Assets do projeto.
  • Um link externo para a origem da imagem, conforme mostrado no exemplo a seguir.
BotsUIManager.shared().setPersonAvatar(avatarAsset: "https://picsum.photos/200/300")
BotsUIManager.shared().setPersonAvatar(avatarAsset: "userAvatarInAssetsFolder") 

Definir os Detalhes do Agente

Você pode personalizar os detalhes do agente usando a API setAgentDetails(agentDetails: AgentDetails). Juntamente com o nome do agente, os outros atributos que você pode usar essa API para personalizar são a cor do texto e o avatar. Se nenhum avatar do agente tiver sido configurado, o avatar poderá ser configurado dinamicamente com as iniciais do nome do agente. Você também pode personalizar a cor dessas iniciais e cores de fundo. A API getAgentDetails() recupera os detalhes atuais do agente.

Embora essas APIs possam ser chamadas a qualquer momento, recomendamos usá-las com os eventos onReceiveMessage() ou beforeDisplay().

setAgentDetails(agentDetails: AgentDetails)

Para substituir os detalhes do agente recebidos do servidor, use esta API da seguinte forma:
Observação

Todos os parâmetros do objeto AgentDetails são opcionais.
// 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)
Além disso, cada propriedade do objeto AgentDetails pode ser modificada. Por exemplo :
let agentDetails = AgentDetails()
agentDetails.name = "Bob"
agentDetails.avatarImage = "agentAvatar"
agentDetails.nameTextColor = .red
agentDetails.avatarBackgroundColor = .green
agentDetails.avatarTextColor = .brown
BotsUIManager.shared().setAgentDetails(agentDetails: agentDetails)

getAgentDetails()

Retorna um objeto contendo os detalhes do agente.
let agentDetails = BotsUIManager.shared().getAgentDetails()

Filtragem de Anexo

Flag do recurso: shareMenuConfiguration

Use shareMenuConfiguration para restringir ou filtrar os tipos de item disponíveis no pop-up do menu de compartilhamento, definir o limite de tamanho do arquivo em KB para uploads (como 1024 no trecho de código a seguir) e personalizar os ícones e rótulos do menu. O limite padrão e máximo é 25 MB.
Observação

Para poder configurar shareMenuConfiguration, defina enableAttachment como true.
botsConfiguration.shareMenuConfiguration = ([ShareMenuItem.files, ShareMenuItem.camera, ShareMenuItem.location], [ShareMenuCustomItem(types: [String(kUTTypePDF)], label: "PDF Files", maxSize: 1024), ShareMenuCustomItem(types: [String(kUTTypeText)], label: "Text Files")])
Para o types, você precisa usar o CFString para o tipo de arquivo correspondente e convertê-lo em String. Qualquer outra string não será válida. Você pode permitir que os usuários façam upload de todos os tipos de arquivo, definindo types como String(kUTTypeItem).

public func shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem]))

Você pode atualizar dinamicamente o pop-up de itens do menu de compartilhamento chamando a API BotsManager.shared().shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem])).
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")])

public func shareMenuItems() -> ([ShareMenuItem], [ShareMenuCustomItem])

Você pode obter a lista de itens de menu de compartilhamento chamando a
BotsManager.shared().shareMenuItems();
API.
BotsManager.shared().shareMenuItems()

Envio automático de um campo

Quando um campo tem a propriedade autoSubmit definida como true, o cliente envia um FormSubmissionMessagePayload com o mapa submittedField contendo os valores de campo válidos que foram informados até o momento. Todos os campos que ainda não foram definidos (independentemente de serem obrigatórios) ou campos que violam uma validação do cliente não são incluídos no mapa submittedField. Se o próprio campo enviado automaticamente contiver um valor que não seja válido, a mensagem de envio não será enviada e a mensagem de erro do cliente será exibida para esse campo específico. Quando um envio automático for bem-sucedido, o partialSubmitField na mensagem de envio do formulário será definido como id do campo autoSubmit.

Conectar, Desconectar e Destruir Métodos

A habilidade pode ser conectada ou desconectada, ou o SDK pode ser destruído, usando os métodos public func destroy(), public func disconnect() e public func connect().

func público destroy()

Destrói o SDK fechando qualquer conexão ativa, reconhecimento de voz, síntese de fala, uploads de arquivos e removendo o controlador de exibição do SDK. Uma vez chamados, nenhum dos métodos de API pública pode ser chamado. Eles só estarão ativos novamente depois que o método initialize(botsConfiguration: BotsConfiguration, completionHandler: @escaping (ConnectionStatus, Error?) -> ()) for chamado novamente para inicializar o SDK.

func público disconnect()

Todas as conexões de rede são fechadas após chamar o método de desconexão.
BotsManager.shared().disconnect()

função pública connect()

A conexão de soquete Web será estabelecida se a habilidade estiver em um estado desconectado.
BotsManager.shared().connect()

public func connect(botsConfiguration: BotsConfiguration)

Quando esse método é chamado com um novo BotsConfiguration, a conexão de soquete Web existente é fechada e uma nova conexão é estabelecida usando as novas propriedades de canal. Outras propriedades definidas em BotsConfiguration permanecem como estão.
var botsConfiguration = BotsConfiguration(url: url, userId: userId, channelId: channelId)
BotsManager.shared().connect(botsConfiguration: botsConfiguration)

Respostas Padrão do Cliente

Flag do recurso: enableDefaultClientResponse

Use enableDefaultClientResponse: true para fornecer respostas padrão do cliente acompanhadas por um indicador de digitação quando a resposta da habilidade tiver sido atrasada ou quando não houver resposta da habilidade. Se o usuário enviar a primeira mensagem/consulta, mas a habilidade não responder com o número de segundos definido por defaultGreetingTimeout, a habilidade poderá exibir uma mensagem de saudação configurada usando a string de tradução odais_default_greeting_message. Em seguida, o cliente verifica novamente a resposta da habilidade. O cliente exibirá a resposta da habilidade se ela tiver sido recebida, mas se não tiver sido recebida, o cliente exibirá uma mensagem de espera (configurada com a string de tradução odais_default_wait_message) em intervalos definidos pelo flag defaultWaitMessageInterval. Quando a espera pela resposta da habilidade excede o limite definido pelo flag typingStatusTimeout, o cliente exibe uma resposta lamentável ao usuário e interrompe o indicador de digitação. Você pode configurar a resposta de desculpas usando a string de tradução odais_default_sorry_message.

Delegação

O recurso de delegação permite que você defina um delegado para receber callbacks antes de determinados eventos na conversa. Para definir um delegado, uma classe deve estar de acordo com o protocolo BotsMessageServiceDelegate e implementar os seguintes métodos:

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

Este método permite que o payload de mensagem de uma habilidade seja modificado antes de ser exibido na conversa. O payload de mensagem retornado pelo método é usado para exibir a mensagem. Se ele retornar nil, a mensagem não será exibida.

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

Este método permite que um payload de mensagem do usuário seja modificado antes de ser enviado ao servidor de chat. O payload da mensagem retornado pelo método é enviado para a habilidade. Se ele retornar nil, a mensagem não será enviada.

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

O public func beforeSendPostback(action: [String: Any]?) -> [String: Any]? permite que um payload de ação de postback seja modificado antes de ser enviado ao servidor de chat. O payload de ação retornado pelo método é enviado para a habilidade. Se ele retornar nil, a ação de postback selecionada pelo usuário não será enviada ao servidor de chat.
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
    }
}
A instância, que está em conformidade com o protocolo BotsMessageServiceDelegate, deve ser designada à propriedade BotsManager.shared().delegate, conforme mostrado no trecho de código a seguir para inicializar o SDK:
BotsManager.shared().delegate = self

Encerrar a Sessão de Chat

Flag do recurso: enableEndConversation

enableEndConversation, quando definido como true, adiciona um botão de fechamento à view de cabeçalho que permite aos usuários encerrar explicitamente a sessão de chat atual. Uma caixa de diálogo de prompt de confirmação é aberta quando os usuários clicam nesse botão de fechamento e, quando confirmam a ação de fechamento, o SDK envia uma mensagem de evento para a habilidade que marca o fim da sessão de chat. O SDK, em seguida, desconecta a habilidade da instância, recolhe o widget de chat e apaga o histórico de conversas do usuário atual. O SDK também gera um evento chatend no protocolo BotsEventListener que você pode implementar.

A abertura do widget de chat inicia uma nova sessão de chat.

Dica:

A conversa também pode ser encerrada chamando o método BotsManager.shared().endChat(), que você pode usar quando o SDK é inicializado no modo sem interface do usuário.

SDK sem Interface do Usuário

O SDK pode ser usado sem sua interface de usuário. O SDK mantém a conexão com o servidor e fornece APIs para enviar mensagens, receber mensagens e obter atualizações para o status da rede e para outros serviços. Você pode usar as APIs para interagir com o SDK e atualizar a interface do usuário.

Você pode enviar uma mensagem usando qualquer uma das APIs send() disponíveis na classe BotsManager. Por exemplo, public func send(message: UserMessage) envia uma mensagem de texto para a habilidade ou o assistente digital.

public func send(message: UserMessage)

Esta função envia uma mensagem para a habilidade. Seu parâmetro message é uma instância de uma classe que está em conformidade com a classe UserMessage. Nesse caso, é UserTextMessage.BotsManager.shared().send(message: UserTextMessage(text: "I want to order a pizza", type: .text))

BotsEventListener

Para fazer listening da alteração do status da conexão, uma mensagem recebida dos eventos de status de upload de habilidades e anexos, uma classe pode implementar o protocolo BotsEventListener que implementa os seguintes métodos:
  • onStatusChange(ConnectionStatus connectionStatus) – Este método é chamado quando o status da conexão WebSocket é alterado. Seu parâmetro connectionStatus é o status atual da conexão. Consulte os documentos da API incluídos no SDK para obter mais detalhes sobre a enumeração ConnectionStatus.
  • onReceiveMessage(message: BotsMessage) – Este método é chamado quando uma nova mensagem é recebida da habilidade. Seu parâmetro message é a mensagem recebida da habilidade. Consulte os documentos da API incluídos no SDK para obter mais detalhes sobre a classe BotsMessage.
  • onUploadAttachment(message: BotsAttachmentMessage) – Este método é chamado quando um upload de anexo é concluído. Seu parâmetro message é o objeto BotsAttachmentMessage do anexo submetido a upload.
  • onDestroy() - Este método é chamado quando o método destroy() é chamado.
  • onInitialize() - Este método é chamado quando o método initialize(botsConfiguration: BotsConfiguration, completionHandler: @escaping (ConnectionStatus, Error?) -> ()) é chamado. É necessário o seguinte parâmetro:
    • newLanguage - O objeto SupportedLanguage para a linguagem de chat recém-definida.
  • beforeEndConversation() - Este método é chamado quando a sessão de conversa final é iniciada.
  • chatEnd() - Um método de callback acionado após o término da conversa com sucesso.
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.
     }
}
A instância, que está em conformidade com o protocolo BotsEventListener deve ser designada à propriedade BotsManager.shared().botsEventListener conforme ilustrado no trecho de código a seguir para inicializar o SDK:
BotsManager.shared().botsEventListener = self

Webview In-Widget

Propriedade da IU: LinkHandler

Você pode configurar o comportamento do link em mensagens de chat para permitir que os usuários acessem páginas web dentro do widget de chat. Em vez de ter que alternar da conversa para exibir uma página em uma guia ou em outra janela do browser, um usuário pode permanecer no chat porque o widget de chat abre o link em uma webview.

Configurar o Webview In-Widget

Propriedade da IU: WebViewConfig

Você pode definir a configuração da webview definindo a propriedade LinkHandler como LinkHandlerType.webview. WebViewConfig pode ser definido como instância de estrutura WebViewConfiguration.
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
Como ilustrado neste trecho de código, você pode definir os atributos a seguir para a webview.
Atributo Definições
webViewSize Define o tamanho da tela da janela da webview in-widget com o atributo WebviewSize, que tem dois valores: parial (WebviewSize.partial) e full (WebviewSizeWindow.full).
clearButtonLabel Define o texto usado para o botão limpar/fechar no canto superior direito da webview. O texto padrão é obtido da string definida como odais_done no arquivo Localizable.strings.
clearButtonIcon Define um ícone para o botão Limpar, que aparece alinhado à esquerda dentro do botão. Por padrão, não há ícone definido para o botão Limpar. É uma string vazia.
clearButtonLabelColor Define a cor do texto do label do botão Limpar. A cor padrão é UIColor.white.
clearButtonColor Define a cor do plano de fundo do botão Limpar. A cor padrão é UIColor.clear.
webviewHeaderColor Define a cor do plano de fundo do cabeçalho da webview.
webviewTitleColor Define a cor do título no cabeçalho. O título é o URL do link web que foi aberto.

Formatação de Timestamp da Mensagem

O flag timestampFormat formata timestamps que são exibidos nas mensagens. Ela pode aceitar uma string que consiste em tokens de formato como "hh:mm:ss" e outros formatos suportados pelo Swift DateFormatter.

Chat multilíngue

Flag do recurso: multiLangChat

O idioma nativo do iOS SDK permite que o widget de chat detecte o idioma de um usuário ou permita que os usuários selecionem o idioma da conversa. Os usuários podem alternar entre os idiomas, mas apenas entre as conversas, não durante, porque a conversa é redefinida sempre que um usuário seleciona um novo idioma.

Ativar o menu Language

Você pode ativar um menu que permite aos usuários selecionar um idioma preferencial em um menu drop-down definindo a propriedade multiLangChat com um objeto que contém o array supportedLanguages, que é composto por tags de idioma (lang) e labels de exibição opcionais (label). Fora desse array, você pode definir opcionalmente o idioma padrão com a variável primaryLanguage (MultiLangChat(primaryLanguage: String) no trecho de código a seguir).
    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"
        )
Observação

Para formatar corretamente os códigos de idioma e região em arquivos .lproj (projeto de localização) localizáveis, use um traço (-) como separador, e não um sublinhado (_). Por exemplo, use fr-CA, não fr_CA. Isso se alinha à forma como os arquivos .lproj são criados no aplicativo. Quando o SDK procura um arquivo .lproj, ele primeiro tenta localizar um com o formato exato languageCode-Region.lproj. Se ele não conseguir localizar esse arquivo, o SDK procurará um arquivo languageCode.lproj. Se isso também não for encontrado, o SDK procurará um arquivo base.lproj. Quando nenhum deles pode ser localizado, o SDK usa o inglês como padrão (en).

Em um menu drop-down localizado no cabeçalho, o widget de chat exibe os idiomas suportados transmitidos. Além dos idiomas disponíveis, o menu também inclui uma opção Detectar Idioma. Quando um usuário seleciona um idioma nesse menu, a conversa atual é redefinida e uma nova conversa é iniciada com o idioma selecionado. O idioma selecionado pelo usuário persiste entre as sessões no mesmo browser; por isso, o idioma anterior do usuário é selecionado automaticamente quando o usuário visita de novo a habilidade por meio da página que contém o widget de chat.

Você pode adicionar um listener de eventos para o evento onChatLanguageChange, que é acionado quando um idioma de bate-papo é selecionado no menu suspenso ou foi alterado.

Veja o que você deve ter em mente ao configurar o suporte a vários idiomas:
  • Defina no mínimo dois idiomas para permitir a exibição do menu drop-down.
  • Se você omitir o atributo primaryLanguage, o widget detectará automaticamente o idioma no perfil do usuário e selecionará a opção Detect Language no menu.
  • A chave label é opcional para os idiomas suportados nativamente: fr é exibido como Francês no menu, es é exibido como Espanhol e assim por diante.
  • Embora label seja opcional, se você tiver adicionado um idioma que não seja um dos suportados nativamente, adicione um rótulo para identificar a tag. Por exemplo, se você não definir label: 'हिंदी', para lang: "hi", o menu drop-down exibirá hi, contribuindo para uma experiência de usuário abaixo do ideal.

Desativar Menu de Idioma

A partir da Versão 21.12, você também pode configurar e atualizar o idioma de bate-papo sem precisar também configurar o menu suspenso de seleção de idioma informando MultiLangChat(primaryLanguage: String).

Detecção de Idioma

Além dos idiomas informados, o widget de chat exibe uma opção Detectar Idioma no menu drop-down. A seleção dessa opção instrui a habilidade a detectar automaticamente o idioma da conversa da mensagem do usuário e, quando possível, responder no mesmo idioma.

Você pode atualizar dinamicamente o idioma selecionado chamando a API BotsManager.shared().setPrimaryLanguage(primaryLanguage: String). Se o lang informado corresponder a um dos idiomas suportados, esse idioma será selecionado. Quando nenhuma correspondência for encontrada, Detectar Idioma será ativado. Você também pode ativar a opção Idioma Detectado chamando a API BotsManager.shared().setPrimaryLanguage(primaryLanguage: "und"), em que "und" indica indeterminado ou informando primaryLanguage:nil.

Você pode atualizar o idioma de bate-papo dinamicamente usando a API setPrimaryLanguage(primaryLanguage: String) mesmo quando o menu suspenso não tiver sido configurado.

Referência Rápida de Chat Multilingual

Para isso... ... Faça isto
Exibe o menu suspenso de seleção de idioma para usuários finais. Informe MultiLangChat(supportedLanguages: [SupportedLanguage]).
Defina o idioma do bate-papo sem exibir o menu suspenso de seleção de idioma para os usuários finais. Informe MultiLangChat(primaryLanguage: String).
Definir um idioma padrão. Informe MultiLangChat(supportedLanguages: [SupportedLanguage], primaryLanguage: String).
Ativar detecção de idioma. Informe primaryLanguage:nil ou primaryLanguage:"und".
Atualize dinamicamente o idioma do chat. Chame a API setPrimaryLanguage(primaryLanguage: String).

Substituindo um formulário de entrada anterior

Quando o usuário final envia o formulário, porque um campo tem autosubmit definido como true, a habilidade pode enviar um novo EditFormMessagePayload. Essa mensagem deve substituir a mensagem anterior do formulário de entrada. Definindo a propriedade de extensão do canal replaceMessage como true, você ativa o SDK para substituir a mensagem anterior do form de entrada pela mensagem atual do form de entrada.

Opções do Menu Compartilhar

Por padrão, o menu de compartilhamento exibe opções para os seguintes tipos de arquivo:
  • arquivos de mídia visual (imagens e vídeos)
  • arquivos de áudio
  • arquivos gerais, como documentos, PDFs e planilhas
  • localização
A definição sharePopupConfiguration permite restringir os itens exibidos no menu de compartilhamento. Ao especificar uma tupla de arrays para ShareMenuConfiguration -- shareMenuConfiguration = ([ShareMenuItem], [ShareMenuCustomItem]) -- você pode restringir, ou filtrar, o tipo de itens disponíveis no menu, personalizar os ícones e os labels do menu e limitar o tamanho do arquivo de upload. A tupla tem um array de opções de menu de compartilhamento do tipo ShareMenuItem e um array de opções de menu de compartilhamento do tipo ShareMenuCustomItem. Informe um array vazio para todos os tipos de arquivo.

public func shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem]))

Você pode ativar a atualização dinâmica do menu usando o
shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem]))
método.

public func shareMenuItems() -> ([ShareMenuItem], [ShareMenuCustomItem])

Esse método retorna a configuração existente dos itens de menu de compartilhamento.

Reconhecimento de Fala

  • Flag do recurso: enableSpeechRecognition
  • Configuração da funcionalidade: enableAutoSendSpeechResponse

A definição do flag do recurso enableSpeechRecognition como true permite que o botão de microfone seja exibido no lugar do botão Enviar sempre que o campo de entrada do usuário estiver vazio. A fala é convertida em texto e enviada para a habilidade ou o assistente digital. Se a fala for parcialmente reconhecida, o resultado parcial será exibido em um pop-up que é aberto clicando no botão de microfone.

A definição dessa propriedade como true também suporta a funcionalidade ativada pela propriedade enableAutoSendSpeechResponse, que quando também está definida como true, permite que a resposta de fala do usuário seja enviada ao servidor de chat automaticamente enquanto exibe a resposta como uma mensagem enviada na janela de chat. Você pode permitir que os usuários editem (ou excluam) primeiro suas mensagens ditadas antes de enviá-las manualmente, definindo enableSpeechRecognitionAutoSend como false.

O reconhecimento de fala é utilizado pelos seguintes métodos:

public func startRecording()

Inicia a gravação da mensagem de voz do usuário.

public func stopRecording()

Interrompe a gravação da mensagem do usuário.

public func isRecording() -> Bool

Verifica se a gravação de voz foi iniciada ou não. Retorna true se a gravação tiver sido iniciada. Caso contrário, retorna false.

A função onSpeechResponseReceived(data: String, final: Bool) do protocolo BotsEventListener pode ser usada para tratar todas as respostas do servidor de fala.
BotsManager.shared().startRecording()
if (BotsManager.shared().isRecording()) {
    BotsManager.shared().stopRecording() // Stop voice recording
}

Síntese de Fala

  • Flag do recurso: enableSpeechSynthesis
  • Configuração da funcionalidade: speechSynthesisVoicePreferences
O SDK foi integrado à síntese de fala para ler a mensagem da habilidade em voz alta quando uma nova mensagem é recebida da habilidade.
  • Você habilita esse recurso definindo o flag do recurso enableSpeechSynthesis como true.
  • Você pode definir o idioma preferencial que lê as mensagens da habilidade em voz alta com a propriedade speechSynthesisVoicePreferences. Esta propriedade ativa um fallback quando o dispositivo não suporta o idioma ou a voz preferenciais. Se o dispositivo não suportar a voz preferencial, será usada a voz padrão do idioma preferencial. Quando não há suporte nem para a voz nem para o idioma preferenciais, a voz e o idioma padrão são usados.

public func speaking(text: String)

Inicia a leitura da respostas da habilidade em voz alta. Seu parâmetro text é o texto da mensagem da habilidade que é lida em voz alta.
BotsManager.shared().speak(text: "What kind of crust do you want?")

public func stopSpeech()

Interrompe a leitura da resposta da habilidade em voz alta.
BotsManager.shared().stopSpeech()

Injeção de Serviço de Fala

Flag do recurso: ttsService

O flag do recurso ttsService permite que você injete qualquer serviço de conversão de texto em fala (TTS) - seu próprio serviço ou fornecido por um fornecedor de terceiros - no SDK. Para injetar um serviço TTS, primeiro defina o flag do recurso enableSpeechSynthesis como true e, em seguida, informe uma instância da interface TTSService para o flag ttsService.

O Protocolo TTSService

Você cria uma instância de uma classe que é uma implementação da interface TTSService. Ele implementa os seguintes métodos:
  • speak(text: String) - Este método adiciona o texto a ser falado para a fila de declarações. Seu parâmetro text é o texto a ser falado.
  • isSpeaking() - Este método verifica se a resposta de áudio está ou não sendo falada. Ele retornará false se nenhuma resposta de áudio estiver sendo falada.
  • stopSpeech() - Este método interrompe qualquer síntese de fala em andamento.
   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.
        }
    }

Indicador de Digitação para Conversas do Agente do Usuário

Flag do recurso: enableSendTypingStatus

Quando esse flag está ativado, o SDK envia um evento de digitação RESPONDING junto com o texto que está sendo digitado no momento pelo usuário para o Oracle B2C Service ou o Oracle Fusion Service. Isso mostra um indicador de digitação no console do agente. Quando o usuário terminar de digitar, o SDK enviará um evento LISTENING ao serviço. Isso oculta o indicador de digitação no console do agente.

Da mesma forma, quando o agente está digitando, o SDK recebe um evento RESPONDING do serviço. Ao receber este evento, o SDK mostra um indicador de digitação para o usuário. Quando o agente está ocioso, o SDK recebe o evento LISTENING do serviço. Ao receber este evento, o SDK oculta o indicador de digitação mostrado ao usuário.

A API sendUserTypingStatus permite o mesmo comportamento para o modo sem interface do usuário.
 public func sendUserTypingStatus(status: TypingStatus, text: String? = nil)
  • Para mostrar o indicador de digitação no console do agente:
    BotsManager.shared().sendUserTypingStatus(status: .RESPONDING, text: textToSend)
  • Para ocultar o indicador de digitação no console do agente:
    BotsManager.shared().sendUserTypingStatus(status: .LISTENING)
  • Para controlar o indicador de digitação do lado do usuário, use o evento onReceiveMessage(). Por exemplo :
        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()
                    }
                }
            }
        }
Há mais duas definições em BotsConfiguration que fornecem controle adicional:
  • typingStatusInterval – Por padrão, o SDK envia o evento de digitação RESPONDING a cada três segundos para o Oracle B2C Service. Use este flag para acelerar este evento. O valor mínimo que pode ser definido é três segundos.
  • enableAgentSneakPreview - O Oracle B2C Service suporta mostrar o texto do usuário à medida que ele é informado. Se esse flag for definido como true (o padrão é false), o SDK enviará o texto real. Para proteger a privacidade do usuário, o SDK envia ... em vez do texto para o Oracle B2C Service quando o flag é definido como false.
    Observação

    Esse recurso deve ser ativado no SDK e na configuração de chat do Oracle B2C Service.

Visualizador de Voz

Quando o suporte a voz está ativado (botsConfiguration.enableSpeechRecognition = true), o rodapé do widget de chat exibe um visualizador de voz, um gráfico de visualizador dinâmico que indica o nível de frequência da entrada de voz. O visualizador responde à modulação da voz do usuário, indicando se o usuário está falando muito baixo ou muito alto. Este visualizador é criado usando o AVAudioEngine do Swift que é exposto no método onAudioReceived no protocolo SpeechEventListener para uso no modo sem interface do usuário.

O widget de chat exibe um visualizador de voz quando os usuários clicam no ícone de voz. É um indicador de se o nível de áudio é suficientemente alto o suficiente para o SDK capturar a voz do usuário. A mensagem do usuário, como é reconhecida como texto, é exibida abaixo do visualizador.
Observação

O modo de voz é indicado quando o ícone de teclado aparece.

Quando botsConfiguration.enableSpeechAutoSendSpeechResponse = true, o texto reconhecido é enviado automaticamente para a habilidade depois que o usuário termina de ditar a mensagem. Em seguida, o modo é revertido para entrada de texto. Quando botsConfiguration.enableSpeechAutoSendSpeechResponse = false, o modo também é revertido para entrada de texto, mas nesse caso, os usuários podem modificar o texto reconhecido antes de enviar a mensagem para a habilidade.