Recommandations pour les applications mobiles — iOS

Cette rubrique aborde les points à prendre en compte lors du développement d'une application pour un appareil iOS :

Gestion de l'état d'arrière-plan

iOS prend en charge le multitâche pour toutes les applications ; toutefois, les développeurs doivent suivre quelques étapes pour que le SDK OpenTok pour iOS fonctionne correctement avec les différents états de l'application. Ce document présente un ensemble de bonnes pratiques qui, d'après notre expérience, fonctionnent bien avec la plupart des applications OpenTok. Il ne remplace toutefois pas la lecture de la Documentation Apple à ce sujet — en particulier les sections intitulées « Stratégies de gestion des transitions d'état des applications », « Exécution en arrière-plan » et « Conseils pour le développement d'une application VoIP ». Bien qu’Apple ne considère pas la plupart des applications OpenTok comme des applications VoIP, les informations relatives à la configuration des sessions audio et à la configuration des sockets sont pertinentes et utiles pour la compréhension de ce document.

Démarrage rapide - réglage des autorisations d'utilisation

Pour que l'application continue à enregistrer de l'audio en arrière-plan, sélectionnez la cible de l'application dans Xcode et sélectionnez l'option Signing & Capabilities onglet. Cliquez ensuite sur le bouton + Capacité et ajoutez la capacité Modes d'arrière-plan au projet. Sélectionnez ensuite l'option Audio, Airplay, and Picture in Picture (option de suspension). Ce paramètre empêchera également l'application de passer à un état suspendu lors de la lecture et de l'enregistrement audio en arrière-plan.

Si votre application a besoin de notifications push hautement prioritaires qui réveillent l'application en cas d'appels entrants, en utilisant l'interface utilisateur native de l'application téléphonique, ou qui sont notifiées d'événements de mise en attente, sélectionnez l'option Voice over IP dans XCode.

Ce qu'OpenTok peut (et ne peut pas) faire en arrière-plan

Grâce au SDK OpenTok, une application peut effectuer chacune des opérations suivantes lorsqu'il se trouve en arrière-plan :

  • Maintenez une session OpenTok active.
  • Soutenir une session audio uniquement.
  • Définir les drapeaux audio/vidéo pour les éditeurs et les abonnés. Par exemple, l'activation de l'indicateur OTPublisher.publishAudio à la propriété YES est autorisée.
  • Publier avec une implémentation de capture vidéo personnalisée qui n'acquiert pas la caméra (par exemple, publier à partir d'un fichier ou d'une source vidéo synthétisée).

Une application peut reprendre l'utilisation de la caméra dès qu'elle revient à l'état actif.

Cependant, les applications ne peut pas effectuer les opérations suivantes lorsqu'il se trouve en arrière-plan :

  • Utiliser l'appareil photo comme source vidéo pour un éditeur.
  • Configurez de nouvelles vues à partir des flux vidéo OpenTok.
  • Maintenir une session audio active si un appel téléphonique ou FaceTime est reçu.
  • Empêcher d'autres applications d'acquérir des ressources audio du système.
  • Maintenir une connexion à une session OpenTok sans éditeur ni abonné actif.

Sessions OpenTok actives en arrière-plan

La configuration décrite ci-dessus permet aux applications de maintenir une session OpenTok active même lorsqu'elles sont en arrière-plan, probablement lorsque l'utilisateur appuie sur le bouton d'accueil, verrouille l'écran ou ouvre un lien URL dans un autre processus. Le audio Cette autorisation permet au processus de l'application de rester actif en arrière-plan lorsqu'une session audio est en cours. Cela signifie que la capture et la restitution audio peuvent se poursuivre dans votre session OpenTok, tant qu'aucun autre processus ne sollicite les ressources audio.

Lorsqu'il est correctement configuré, iOS indique que votre application fonctionne en arrière-plan avec une session audio active. Cela se traduit par un fond rouge dans la barre d'état, ainsi que par une barre supplémentaire indiquant le nom de l'application qui détient la session audio active - dans ce cas, il s'agit de votre application.

Les Voice over IP est destinée à maintenir des connexions de signalisation de longue durée avec un serveur d'application.

Si vous sélectionnez l'option Voice over IP Si vous sélectionnez cette option dans la section « Capacités » de Xcode, votre application doit proposer des fonctionnalités justifiant cette capacité ; dans le cas contraire, votre application risque d'être rejetée lors de l'examen par l'App Store. Cette capacité ne doit pas être utilisée pour maintenir l'application en exécution en arrière-plan pour des raisons autres que les communications audio ou vidéo.

Si votre application a besoin d'être notifiée pour des événements d'application, nous vous recommandons d'utiliser Notifications push d'Apple avec votre serveur d'application pour réveiller l'application et exécuter un flux de travail. Si votre application met en œuvre des appels entrants, nous vous recommandons d'utiliser la fonction Notifications push VoIP.

CallKit

CallKit est un framework qui permet aux applications iOS d'améliorer leur intégration avec le système d'exploitation, ce qui leur permet de :

  • Notifier les appels entrants ou sortants au système d'exploitation
  • Lancer l'application avec une notification VoIP push (uniquement si vous souhaitez afficher l'interface utilisateur de l'appel entrant)
  • Gérer le routage audio
  • Coordonne les sessions audio entre toutes les applications en cours d'exécution
  • Augmente les niveaux de sortie audio
  • Affiche les commandes d'appel dans une notification et dans une interface utilisateur d'appel native

OpenTok propose deux méthodes d'intégration avec CallKit :

  • Mettre en place un CustomAudioDevice qui contrôle le AudioSession activations. Voir aussi cet échantillon.
  • Activez le mode services d'appel en utilisant OTAudioDeviceManager.currentAudioSessionManager(). L'instance renvoyée par le gestionnaire de session audio doit être utilisée pour configurer la session audio et notifier au SDK les activations et désactivations de la session audio. Voir cet échantillon.

Si votre application doit recevoir des notifications concernant des événements liés à l'application, tels que les appels entrants, il incombe au développeur de mettre en œuvre cette fonctionnalité. Nous vous recommandons d'utiliser le PushKit cadre et Notifications push VoIP. À titre de référence, voir cet échantillon.

L'intégration native d'OpenTok nécessite que le développeur active le mode « services d'appel » dès le début du lancement de l'application. Les notifications push VoIP nécessitent un appel vers CXProvider.reportNewIncomingCall dans les 3 secondes, faute de quoi l'application peut se bloquer. Dans ce laps de temps, l'application doit configurer la prise en charge du SDK CallKit avant que la fonction CXAnswerCallAction est exécuté.

Pour activer le mode "services d'appel", appelez le code suivant dans la page d'accueil de votre application application:didFinishLaunchingWithOptions: méthode.

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

Configurer le AVAudioSession dans le CXStartCallAction ou CXAnswerCallAction CXProvider rappels.

Utilisez le mode « chat vidéo » pour les appels vidéo, ou le mode « chat vocal » pour les appels audio uniquement.

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

Notifie au gestionnaire de session les activations et désactivations de sessions audio.

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

Vérifier le Documentation pour les développeurs CallKit pour plus d'informations.

Perdre le contrôle

Les appels téléphoniques et FaceTime entrants sont probablement les premiers événements que vous verrez qui interrompent complètement votre application. Dans ce cas, votre application sera suspendue, qu'il y ait ou non une session audio active.

Si votre application est suspendue parce que la session audio a cédé la place à un autre processus, aucune logique supplémentaire n'est nécessaire pour gérer cette situation. Si l'application reste suspendue pendant une longue période, la connexion à la session OpenTok sera interrompue. Les autres clients connectés à la session recevront connectionDestroyed pour la connexion de l'appareil, et un nettoyage éventuel sera nécessaire une fois que l'application ne sera plus suspendue. Tant que votre contrôleur traite les événements délégués d'erreur et de déconnexion pour la session, cela ne devrait pas être différent d'un flux de travail de déconnexion volontaire ou autre. Les clients peuvent se reconnecter dès que le nettoyage de la déconnexion est effectué.

Paramètres du manifeste de confidentialité

Les versions 2.27.3, 2.26.3 et 2.25.5 du SDK iOS Vonage Video prennent désormais en charge la manifeste de confidentialité requis par l'App Store d'Apple. Avec ces versions du SDK, les paramètres requis en matière de confidentialité sont automatiquement ajoutés lorsque vous créer le rapport de confidentialité de votre application. Si vous devez utiliser une version antérieure du SDK Vonage Video pour React Native, vous pouvez ajouter manuellement les paramètres de confidentialité requis en vous basant sur les paramètres contenus dans ce fichier dans le fichier de déclaration de confidentialité de votre application.

Les changements de réseau d'iOS 14 affectent les sessions relayées

Avec iOS 14, Apple introduit la confidentialité du réseau local (voir cette vidéo).

À partir d'iOS 14, le système d'exploitation demandera l'autorisation de l'utilisateur lorsqu'une application tentera de s'abonner à des clients situés sur le même réseau local dans un session relayée. Le texte par défaut de la notification indique que l'application « souhaite rechercher des appareils sur votre réseau local et s'y connecter ».

Lors d'une session relayée, la Video API vonage utilise le réseau local pour détecter les participants à la visioconférence présents sur ce réseau et s'y connecter, dans la mesure du possible. Si les clients ne parviennent pas à se connecter au réseau local, l'application utilise le serveur TURN d'OpenTok pour relayer les flux audio et vidéo.

Si l'utilisateur refuse l'autorisation, la tentative d'abonnement peut échouer si le client ne parvient pas à se connecter au serveur TURN d'OpenTok. Dans ce cas, une fois l'autorisation refusée, toute tentative ultérieure d'abonnement pour des clients situés sur le même réseau échouera également, à moins que l'utilisateur ne modifie l'autorisation dans les Réglages. Malheureusement, iOS ne fournit pas d’API permettant à une application de déterminer si l’utilisateur a accepté ou refusé cette autorisation.

Il est important de noter que cela ne s'applique pas aux sessions vidéo qui utilisent le Routeur multimédia OpenTok, car les données multimédias sont transmises via Internet plutôt que via le réseau local.

Si votre application utilise une session relayée, nous vous recommandons d'ajouter une chaîne de texte personnalisée et descriptive afin d'expliquer à l'utilisateur pourquoi l'application a besoin de cette autorisation :

  1. Dans Xcode, ouvrez le fichier info.plist de votre application.
  2. Dans l'éditeur info.plist, cliquez avec le bouton droit de la souris sur la colonne de gauche et sélectionnez Ajouter une rangée (ou cliquez sur +) pour ajouter un paramètre pour Vie privée - Utilisation du réseau local Description.
  3. Modifiez la valeur de cette chaîne pour décrire comment votre application utilise cette autorisation. Par exemple, ajoutez : « Cette application utilise le réseau local pour détecter les participants à la visioconférence se trouvant sur le même réseau et se connecter à eux lorsque cela est possible. »

L'invite adressée à l'utilisateur comprendra cette description.

Pour les applications qui ne peuvent pas utiliser de sessions acheminées et pour lesquelles vous ne souhaitez pas que l'utilisateur soit invité à autoriser l'accès au réseau local, vous pouvez utiliser l'une des options décrites dans les sections suivantes.

Sauter les vérifications du réseau local pour établir la connectivité des médias

Vous pouvez régler la OTSessionICEConfig.filterOutLanCandidates propriété permettant d'empêcher l'application d'utiliser le réseau local pour établir une connexion, comme dans le code suivant.

Objectif-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)

Remarque : Les OTSessionICEConfig.filterOutLanCandidates Cette fonctionnalité est disponible dans le SDK iOS d'OpenTok à partir de la version 2.30.0.

Utiliser les serveurs TURN

Vous pouvez régler la OTSessionICEConfig.transportPolicy pour forcer l'application à utiliser des serveurs TURN afin d'établir la connexion, comme dans le code suivant.

Objectif-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)

Plus d'informations

Pour plus d'informations, consultez :