

# Mise en route avec le kit SDK de diffusion iOS d’IVS \$1 Diffusion à faible latence
<a name="broadcast-ios-getting-started"></a>

Ce document vous présente les étapes à suivre pour commencer à utiliser le kit SDK de diffusion iOS à faible latence d’Amazon IVS.

## Installer la bibliothèque
<a name="broadcast-ios-install"></a>

Nous vous recommandons d’intégrer le kit SDK de diffusion via Swift Package Manager. (Vous pouvez également ajouter manuellement le cadre à votre projet.)

### Recommandé : intégrer le kit SDK de diffusion (Swift Package Manager)
<a name="broadcast-ios-install-swift"></a>

1. Téléchargez le fichier Package.swift depuis [https://broadcast.live-video.net/1.40.0/Package.swift](https://broadcast.live-video.net/1.40.0/Package.swift).

1. Dans votre projet, créez un nouveau répertoire nommé AmazonIVSBroadcast et ajoutez-le au contrôle de version.

1. Placez le fichier Package.swift téléchargé dans le nouveau répertoire.

1. Dans Xcode, accédez à **Fichier > Ajouter des dépendances de package** et sélectionnez **Ajouter un fichier local...**

1. Accédez au répertoire AmazonIVSBroadcast que vous avez créé, sélectionnez-le, puis sélectionnez **Ajouter un package**.

1. Lorsque vous êtes invité à **choisir les produits du package pour AmazonIVSBroadcast**, sélectionnez **AmazonIVSBroadcast** comme **Produit du package** en définissant la cible de votre application dans la section **Ajouter à la cible**.

1. Sélectionnez **Ajouter un package**.

### Autre approche : installer manuellement le cadre
<a name="broadcast-ios-install-manual"></a>

1. Téléchargez la dernière version depuis [https://broadcast.live-video.net/1.40.0/AmazonIVSBroadcast.xcframework.zip](https://broadcast.live-video.net/1.40.0/AmazonIVSBroadcast.xcframework.zip).

1. Extrayez le contenu de l’archive. `AmazonIVSBroadcast.xcframework` contient le kit SDK pour l’appareil et le simulateur.

1. Intégrez `AmazonIVSBroadcast.xcframework` en le faisant glisser dans la section **Frameworks, Libraries, and Embedded Content** (Cadre, bibliothèques et contenu intégré) de l’onglet **General** (Général) de votre cible d’application.  
![\[La section Frameworks, Libraries, and Embedded Content (Cadre, bibliothèques et contenu intégré) de l’onglet General (Général) de votre cible d’application.\]](http://docs.aws.amazon.com/fr_fr/ivs/latest/LowLatencyUserGuide/images/iOS_Broadcast_SDK_Guide_xcframework.png)

## Implémenter IVSBroadcastSession.Delegate
<a name="broadcast-ios-implement-ivsbroadcastsessiondelegate"></a>

Implémentez `IVSBroadcastSession.Delegate`, qui vous permet de recevoir des mises à jour d’état et des notifications de modification de périphérique :

```
extension ViewController : IVSBroadcastSession.Delegate {
   func broadcastSession(_ session: IVSBroadcastSession,
                         didChange state: IVSBroadcastSession.State) {
      print("IVSBroadcastSession did change state \(state)")
   }

   func broadcastSession(_ session: IVSBroadcastSession,
                         didEmitError error: Error) {
      print("IVSBroadcastSession did emit error \(error)")
   }
}
```

## Demander des autorisations
<a name="broadcast-ios-permissions"></a>

Votre appli doit demander l’autorisation d’accéder à la caméra et au micro de l’utilisateur. (Ce n’est pas spécifique à Amazon IVS ; cette autorisation est requise pour toute application devant accéder aux caméras et aux micros.)

Ici, nous vérifions si l’utilisateur a déjà accordé des autorisations et, dans le cas contraire, nous les demandons :

```
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .authorized: // permission already granted.
case .notDetermined:
   AVCaptureDevice.requestAccess(for: .video) { granted in
       // permission granted based on granted bool.
   }
case .denied, .restricted: // permission denied.
@unknown default: // permissions unknown.
}
```

Vous devez demander des autorisations pour les types de médias `.video` et `.audio` si vous souhaitez accéder aux caméras et aux microphones, respectivement.

Vous devez également ajouter des entrées pour `NSCameraUsageDescription` et `NSMicrophoneUsageDescription` à votre `Info.plist`. Sinon, votre application se bloquera lorsque vous essayerez de demander des autorisations.

## Désactiver le minuteur d’inactivité de l’application
<a name="broadcast-ios-disable-idle-timer"></a>

Cette action est facultative, mais recommandée. Elle empêche votre appareil de se mettre en veille lors de l’utilisation du kit SDK de diffusion, ce qui pourrait interrompre la diffusion.

```
override func viewDidAppear(_ animated: Bool) {
   super.viewDidAppear(animated)
   UIApplication.shared.isIdleTimerDisabled = true
}
override func viewDidDisappear(_ animated: Bool) {
   super.viewDidDisappear(animated)
   UIApplication.shared.isIdleTimerDisabled = false
}
```

## (Facultatif) Configurer AVAudioSession
<a name="broadcast-ios-setup-avaudiosession"></a>

Par défaut, le kit SDK de diffusion configurera la de votre application `AVAudioSession`. Si vous voulez gérer cela vous-même, définissez `IVSBroadcastSession.applicationAudioSessionStrategy` sur `noAction`. Sans le contrôle de la `AVAudioSession`, le kit SDK de diffusion ne peut pas gérer les microphones en interne. Pour utiliser des microphones avec le `noAction`, vous pouvez créer un `IVSCustomAudioSource` et fournissez vos propres échantillons via un `AVCaptureSession`, `AVAudioEngine` ou un autre outil qui fournit des échantillons audio PCM.

Si vous configurez manuellement votre `AVAudioSession`, vous devez au moins définir la catégorie comme `.record` ou `.playbackAndRecord`, et la définir sur `active`. Si vous souhaitez enregistrer l’audio à partir de périphériques Bluetooth, vous devez aussi spécifier l’ `.allowBluetooth` option :

```
do {
   try AVAudioSession.sharedInstance().setCategory(.record, options: .allowBluetooth)
   try AVAudioSession.sharedInstance().setActive(true)
} catch {
   print("Error configuring AVAudioSession")
}
```

Nous vous recommandons de laisser le kit SDK gérer cela pour vous. Sinon, si vous souhaitez choisir entre différents périphériques audio, vous devrez gérer manuellement les ports.

## Créer la session de diffusion
<a name="broadcast-ios-create-session"></a>

L’interface de diffusion est `IVSBroadcastSession`. Initialisez-le comme indiqué ci-dessous :

```
let broadcastSession = try IVSBroadcastSession(
   configuration: IVSPresets.configurations().standardLandscape(),
   descriptors: IVSPresets.devices().frontCamera(),
   delegate: self)
```

Voir aussi [Créer la session de diffusion (version avancée)](broadcast-ios-use-cases.md#broadcast-ios-create-session-advanced)

## Définir IVSImagePreviewView pour la prévisualisation
<a name="broadcast-ios-set-imagepreviewview"></a>

Si vous souhaitez afficher une prévisualisation pour une caméra active, ajoutez la prévisualisation `IVSImagePreviewView` pour le périphérique à votre hiérarchie de vues :

```
// If the session was just created, execute the following 
// code in the callback of IVSBroadcastSession.awaitDeviceChanges 
// to ensure all devices have been attached.
if let devicePreview = try broadcastSession.listAttachedDevices()
   .compactMap({ $0 as? IVSImageDevice })
   .first?
   .previewView()
{
   previewView.addSubview(devicePreview)
}
```

## Démarrer une diffusion
<a name="broadcast-ios-start"></a>

Le nom d’hôte que vous recevez dans le champ de réponse `ingestEndpoint` de l’opération `GetChannel` doit avoir `rtmps://` comme préfixe et `/app` comme suffixe. L’URL complète doit être au format suivant : `rtmps://{{ ingestEndpoint }}/app`

```
try broadcastSession.start(with: IVS_RTMPS_URL, streamKey: IVS_STREAMKEY)
```

 Le kit SDK de diffusion iOS prend en charge uniquement l’ingestion RTMPS (et non l’ingestion RTMP non sécurisée). 

## Arrêter une diffusion
<a name="broadcast-ios-stop"></a>

```
broadcastSession.stop()
```

## Gérer les événements de cycle de vie
<a name="broadcast-ios-lifecycle-events"></a>

### Interruptions audio
<a name="broadcast-ios-audio-interruptions"></a>

Il existe plusieurs scénarios où le kit SDK de diffusion n’aura pas un accès exclusif au matériel d’entrée audio. Voici quelques exemples de scénarios que vous devez gérer :
+ L’utilisateur reçoit un appel téléphonique ou un appel FaceTime
+ L’utilisateur active Siri

Apple facilite la réponse à ces événements en s’abonnant à `AVAudioSession.interruptionNotification` :

```
NotificationCenter.default.addObserver(
   self,
   selector: #selector(audioSessionInterrupted(_:)),
   name: AVAudioSession.interruptionNotification,
   object: nil)
```

Ensuite, vous pouvez gérer l’événement avec quelque chose comme ceci :

```
// This assumes you have a variable `isRunning` which tracks if the broadcast is currently live, and another variable `wasRunningBeforeInterruption` which tracks whether the broadcast was active before this interruption to determine if it should resume after the interruption has ended.

@objc
private func audioSessionInterrupted(_ notification: Notification) {
   guard let userInfo = notification.userInfo,
         let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,
         let type = AVAudioSession.InterruptionType(rawValue: typeValue)
   else {
      return
   }
   switch type {
   case .began:
      wasRunningBeforeInterruption = isRunning
      if isRunning {
         broadcastSession.stop()
      }
   case .ended:
      defer {
         wasRunningBeforeInterruption = false
      }
      guard let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else { return }
      let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)
      if options.contains(.shouldResume) && wasRunningBeforeInterruption {
         try broadcastSession.start(
            with: IVS_RTMPS_URL,
            streamKey: IVS_STREAMKEY)
      }
   @unknown default: break
   }
}
```

### Appli passant en arrière-plan
<a name="broadcast-ios-app-to-background"></a>

Les applications standard sur iOS ne sont pas autorisées à utiliser des caméras en arrière-plan. Il y a aussi des restrictions concernant l’encodage vidéo en arrière-plan : comme les encodeurs matériels sont limités, seules les applications de premier plan ont accès. Pour cette raison, le kit SDK de diffusion met automatiquement fin à sa séance et définit sa `isReady` propriété sur `false`. Lorsque votre application est sur le point de saisir à nouveau au premier plan, le kit SDK de diffusion réattache tous les périphériques à leur entrées `IVSMixerSlotConfiguration` d’origine.

Le kit SDK de diffusion le fait en répondant à `UIApplication.didEnterBackgroundNotification` et à `UIApplication.willEnterForegroundNotification`.

Si vous fournissez des sources d’image personnalisées, vous devez être prêt à gérer ces notifications. Vous devrez peut-être prendre des mesures supplémentaires pour les arrêter avant que le flux ne soit interrompu.

Voir [Utiliser la vidéo en arrière-plan](broadcast-ios-use-cases.md#broadcast-ios-background-video) pour une solution de contournement qui permet le streaming lorsque votre application est en arrière-plan.

### Services multimédias perdus
<a name="broadcast-ios-media-services-lost"></a>

Dans de très rares cas, l’ensemble du sous-système multimédia sur un appareil iOS va se bloquer. Dans ce scénario, nous ne pouvons plus diffuser. Il appartient à votre application de répondre à ces notifications de manière appropriée. Abonnez-vous au moins à ces notifications :
+ [mediaServicesWerelostNotification](https://developer.apple.com/documentation/avfaudio/avaudiosession/1616457-mediaserviceswerelostnotificatio) : répond en arrêtant votre diffusion et en libérant complètement votre `IVSBroadcastSession`. Tous les composants internes utilisés par la session de diffusion seront invalidés.
+ [mediaServicesWereResetNotification](https://developer.apple.com/documentation/avfaudio/avaudiosession/1616540-mediaserviceswereresetnotificati) : répond en informant vos utilisateurs qu’ils peuvent diffuser à nouveau. En fonction de votre cas d’utilisation, vous pourrez peut-être reprendre automatiquement la diffusion à ce stade.