Diretrizes para dispositivos móveis — iOS

Este tópico aborda as considerações a serem levadas em conta ao desenvolver aplicativos para dispositivos iOS:

Gerenciamento de estado em segundo plano

O iOS oferece suporte à multitarefa para todos os aplicativos; no entanto, há algumas etapas que o desenvolvedor deve seguir para que o SDK do OpenTok para iOS funcione corretamente nos diferentes estados do aplicativo. Este documento aborda um conjunto de práticas que, segundo nossa experiência, funcionam bem com a maioria dos aplicativos OpenTok. No entanto, ele não substitui a leitura do Documentação da Apple sobre o assunto — especificamente as seções sobre “Estratégias para lidar com transições de estado de aplicativos”, “Execução em segundo plano” e “Dicas para desenvolver um aplicativo de VoIP”. Embora a Apple não considere a maioria dos aplicativos OpenTok como aplicativos de VoIP, o conteúdo sobre a configuração de sessões de áudio e de soquetes é relevante e útil para a compreensão deste documento.

Introdução rápida — como definir permissões de aplicativos

Para que o aplicativo continue gravando áudio em segundo plano, selecione o destino do aplicativo no Xcode e selecione o Signing & Capabilities guia. Em seguida, clique no botão + Funcionalidade e adicione a funcionalidade “Modos de fundo” ao projeto. Depois, selecione o Audio, Airplay, and Picture in Picture opção. Essa configuração também impedirá que o aplicativo entre em estado de suspensão enquanto estiver reproduzindo e gravando áudio em segundo plano.

Se o seu aplicativo precisar de notificações push de alta prioridade que ativem o aplicativo para chamadas recebidas, utilizando a interface do usuário do aplicativo nativo do telefone, ou que notifiquem sobre eventos de espera, selecione o Voice over IP recurso no XCode.

O que o OpenTok pode (e não pode) fazer em segundo plano

Usando o SDK do OpenTok, um aplicativo pode executar cada uma das seguintes ações enquanto estiver no estado de segundo plano:

  • Mantenha uma sessão do OpenTok ativa.
  • Manter uma sessão apenas com áudio.
  • Defina sinalizadores de áudio/vídeo para emissores e receptores. Por exemplo, ao definir o OTPublisher.publishAudio propriedade para YES é permitido.
  • Publique usando uma implementação personalizada de captura de vídeo que não acesse a câmera (por exemplo, publicando a partir de um arquivo ou de uma fonte de vídeo sintetizado).

Um aplicativo pode retomar o uso da câmera assim que voltar ao estado ativo.

No entanto, os aplicativos não pode faça o seguinte enquanto estiver no estado de segundo plano:

  • Use a câmera como fonte de vídeo para um editor.
  • Configure novas visualizações com vídeos provenientes de transmissões do OpenTok.
  • Mantenha uma sessão de áudio ativa caso receba uma ligação telefônica ou pelo FaceTime.
  • Impedir que outros aplicativos acessem os recursos de áudio do sistema.
  • Manter uma conexão com uma sessão do OpenTok sem um emissor ou assinante ativo.

Sessões ativas do OpenTok em segundo plano

A configuração descrita acima permite que os aplicativos mantenham uma sessão ativa do OpenTok mesmo quando o aplicativo está em segundo plano, provavelmente porque o usuário final pressionou o botão “Home”, bloqueou a tela ou abriu um conteúdo de URL em outro processo. O audio Essa permissão permite que o processo do aplicativo permaneça ativo enquanto estiver em segundo plano, caso haja uma sessão de áudio ativa. Isso significa que a captura e a reprodução de áudio podem continuar na sua sessão do OpenTok, desde que nenhum outro processo solicite recursos de áudio.

Quando configurado corretamente, o iOS exibe um indicador de que seu aplicativo está em execução em segundo plano com uma sessão de áudio ativa. Isso é visível por meio de um fundo vermelho na barra de status, bem como por uma barra adicional que indica o nome do aplicativo que mantém a sessão de áudio ativa — neste caso, o seu aplicativo.

O Voice over IP Essa funcionalidade destina-se a manter conexões de sinalização de longa duração com um servidor de aplicativos.

Se você selecionar o Voice over IP Se você selecionar essa opção na seção “Recursos” do Xcode, seu aplicativo deverá implementar funcionalidades que justifiquem esse recurso; caso contrário, a revisão da App Store poderá rejeitar seu aplicativo. Esse recurso não deve ser usado para manter o aplicativo em execução em segundo plano por motivos que não estejam relacionados a comunicações de áudio ou vídeo.

Se seu aplicativo precisar ser notificado sobre eventos do aplicativo, recomendamos usar Notificações Push da Apple com seu servidor de aplicativos para ativar o aplicativo e executar um fluxo de trabalho. Se o seu aplicativo processar chamadas recebidas, recomendamos usar o Notificações push de VoIP.

CallKit

O CallKit é uma estrutura que permite que os aplicativos iOS aprimorem a integração com o sistema operacional, possibilitando que o aplicativo:

  • Notificar o sistema operacional sobre chamadas recebidas ou realizadas
  • Inicie o aplicativo com uma notificação push de VoIP (somente se você quiser exibir a interface de chamada recebida)
  • Gerenciar o roteamento de áudio
  • Coordena as sessões de áudio entre todos os aplicativos em execução
  • Aumenta os níveis de saída de áudio
  • Exibe os controles de chamada em uma notificação e na interface de usuário nativa da chamada

A OpenTok oferece duas formas de integração com o CallKit:

  • Configurar um CustomAudioDevice que controla o AudioSession ativações. Veja esta amostra.
  • Ative o modo de serviços de chamada usando OTAudioDeviceManager.currentAudioSessionManager(). A instância retornada pelo gerenciador de sessões de áudio deve ser usada para configurar a sessão de áudio e notificar o SDK sobre as ativações e desativações da sessão de áudio. Consulte esta amostra.

Se o seu aplicativo precisar ser notificado sobre eventos do aplicativo, como chamadas recebidas, cabe ao desenvolvedor implementar essa funcionalidade. Recomendamos usar o PushKit estrutura e Notificações push de VoIP. Para referência, consulte esta amostra.

A integração nativa com o OpenTok exige que o desenvolvedor habilite o modo de serviços de chamada logo no início da inicialização do aplicativo. As notificações push de VoIP exigem uma chamada para CXProvider.reportNewIncomingCall em até 3 segundos; caso contrário, o aplicativo pode travar. Nesse intervalo de tempo, o aplicativo deve configurar o suporte ao SDK CallKit antes que o CXAnswerCallAction A função de retorno de chamada é executada.

Para ativar o modo de serviços de chamada, chame o código a seguir no seu aplicativo application:didFinishLaunchingWithOptions: método.

let sessionManager = OTAudioDeviceManager.currentSessionManager()
sessionManager?.enableCallingServicesMode()

Configure o AVAudioSession no CXStartCallAction ou CXAnswerCallAction CXProvider callbacks.

Use o modo de videochamada para chamadas com vídeo ou o modo de chamada de voz para chamadas apenas com áudio.

sessionManager?.preconfigureAudioSessionForCall(withMode: .videoChat)
sessionManager?.preconfigureAudioSessionForCall(withMode: .voiceChat)

Notificar o gerenciador de sessões sobre as ativações e desativações das sessões de áudio.

func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
	sessionManager?.audioSessionDidActivate(audioSession)
}
func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) {
	sessionManager?.audioSessionDidDeactivate(audioSession)
}

Verifique o Documentação para desenvolvedores do CallKit para obter mais informações.

Perder o controle

Chamadas telefônicas e do FaceTime recebidas são provavelmente os primeiros eventos que você observará e que interromperão completamente o funcionamento do seu aplicativo. Quando isso acontecer, seu aplicativo será suspenso, independentemente de haver ou não uma sessão de áudio ativa.

Se seu aplicativo for suspenso porque a sessão de áudio cedeu prioridade a outro processo, não há necessidade de lógica adicional para lidar com isso. Se o aplicativo ficar suspenso por um longo período, a conexão com a sessão do OpenTok será encerrada. Outros clientes conectados à sessão receberão connectionDestroyed eventos relacionados à conexão do dispositivo, e será necessária uma eventual limpeza assim que o aplicativo sair do estado de suspensão. Desde que seu controlador esteja processando os eventos de erro e de desconexão delegados para a sessão, isso não deve ser diferente de um fluxo de trabalho de desconexão voluntária ou de qualquer outro tipo. Os clientes poderão se reconectar assim que a limpeza pós-desconexão for processada.

Configurações do manifesto de privacidade

As versões 2.27.3, 2.26.3 e 2.25.5 do SDK do Vonage Video para iOS adicionam suporte para o manifesto de privacidade exigido pela App Store da Apple. Ao usar essas versões do SDK, as configurações necessárias relacionadas à privacidade são adicionadas automaticamente quando você Crie o relatório de privacidade do seu aplicativo. Se você precisar usar uma versão mais antiga do SDK do Vonage Video para React Native, poderá adicionar manualmente as configurações de privacidade necessárias com base em as configurações neste arquivo ao arquivo de manifesto de privacidade do seu próprio aplicativo.

Alterações na rede do iOS 14 que afetam as sessões retransmitidas

Com o iOS 14, a Apple apresenta a privacidade na rede local (veja esse vídeo).

A partir do iOS 14, o sistema operacional solicitará permissão ao usuário quando uma aplicação tentar se inscrever para receber notificações de clientes na mesma rede local em um sessão retransmitida. O texto padrão da notificação informa que o aplicativo “gostaria de localizar e se conectar a dispositivos na sua rede local”.

Em uma sessão retransmitida, a Video API da Vonage utiliza a rede local para identificar e se conectar aos participantes de vídeo na sua rede local, sempre que possível. Caso os clientes não consigam se conectar na rede local, o aplicativo utilizará o servidor TURN da OpenTok para retransmitir os fluxos de áudio e vídeo.

Se o usuário rejeitar a permissão, a tentativa de inscrição poderá falhar caso o cliente não consiga se conectar ao servidor TURN da OpenTok. Nesse caso, após a rejeição da permissão, quaisquer tentativas futuras de inscrição de clientes na mesma rede também falharão, a menos que o usuário altere a permissão em “Configurações”. Infelizmente, o iOS não oferece uma API para que uma aplicação determine se o usuário aceitou ou rejeitou essa permissão.

É importante observar que isso não se aplica às sessões de vídeo que utilizam o Roteador de mídia OpenTok, já que os dados são transmitidos pela internet, e não pela rede local.

Se o seu aplicativo utiliza uma sessão retransmitida, recomendamos que você adicione uma mensagem descritiva personalizada para informar ao usuário por que o aplicativo precisa dessa permissão:

  1. No Xcode, abra o arquivo info.plist do seu aplicativo.
  2. No editor do info.plist, clique com o botão direito do mouse na coluna da esquerda e selecione Adicionar linha (ou clique em +) para adicionar uma configuração para Privacidade - Descrição do uso da rede local.
  3. Edite o valor desta string para descrever como seu aplicativo utiliza essa permissão. Por exemplo, adicione “Este aplicativo usa a rede local para detectar e se conectar a participantes de vídeo na mesma rede, sempre que possível.”

A mensagem exibida ao usuário incluirá essa descrição.

Para applications que não podem utilizar sessões roteadas e nos quais não se deseja que o usuário seja solicitado a autorizar o acesso à rede local, é possível utilizar qualquer uma das opções apresentadas nas seções a seguir.

Ignorar as verificações da rede local para estabelecer a conectividade com a mídia

Você pode definir o OTSessionICEConfig.filterOutLanCandidates propriedade para forçar o aplicativo a não usar a rede local para estabelecer conectividade, conforme mostrado no código a seguir.

Objective-C

OTSessionSettings *settings = [[OTSessionSettings alloc] init];
OTSessionICEConfig *myICEServerConfiguration = [[OTSessionICEConfig alloc] init];
myICEServerConfiguration.filterOutLanCandidates = YES;
settings.iceConfig = myICEServerConfiguration;
session = [[OTSession alloc] initWithApiKey:kApiKey
                                   sessionId:kSessionId
                                    delegate:self settings:settings];

Swift

let settings = OTSessionSettings()
let myICEServerConfiguration = OTSessionICEConfig()
myICEServerConfiguration.filterOutLanCandidates = true
settings.iceConfig = myICEServerConfiguration
let session = OTSession(apiKey: apiKey, sessionId: sessionId, delegate: self,
                        settings: settings)

Observação: O OTSessionICEConfig.filterOutLanCandidates A propriedade está disponível no SDK do OpentTok para iOS, versão 2.30.0 e posteriores.

Utilizar servidores TURN

Você pode definir o OTSessionICEConfig.transportPolicy para forçar o aplicativo a usar servidores TURN para estabelecer a conexão, conforme mostrado no código a seguir.

Objective-C

OTSessionSettings *settings = [[OTSessionSettings alloc] init];
OTSessionICEConfig *myICEServerConfiguration = [[OTSessionICEConfig alloc] init];
myICEServerConfiguration.transportPolicy = OTSessionICETransportRelay;
settings.iceConfig = myICEServerConfiguration;
session = [[OTSession alloc] initWithApiKey:kApiKey
                                   sessionId:kSessionId
                                    delegate:self settings:settings];

Swift

let settings = OTSessionSettings()
let myICEServerConfiguration = OTSessionICEConfig()
myICEServerConfiguration.transportPolicy = .relay
settings.iceConfig = myICEServerConfiguration
let session = OTSession(apiKey: apiKey, sessionId: sessionId, delegate: self,
                        settings: settings)

Mais informações

Para obter mais informações, consulte: