# Notifications push VoIP

Sous iOS 8, Apple a introduit [PushKit](https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternet/Reference/PushKit_Framework/index.html), et les notifications push VoIP - un nouveau type de notifications push. En plus de la fonctionnalité de notification push standard, une notification push VoIP permet à l'application d'exécuter du code avant d'afficher la notification à l'utilisateur.

<Aside type="caution" title="Important">
Vous ne pouvez créer un certificat VoIP qu'en mode production, et non en mode développement. Par conséquent, dans la configuration de l'application iOS Pushwoosh, vous devez toujours utiliser la passerelle de **Production** pour les certificats VoIP.
</Aside>


**1.** Ajoutez le module PushwooshVoIP à votre projet.

**Swift Package Manager**
<img src="/ios-voip-1.webp" alt=""/>

<Aside type="caution" title="Important">
Les modules ```PushwooshFramework```, ```PushwooshCore```, ```PushwooshBridge``` et ```PushwooshLiveActivities``` sont **requis**.
</Aside>

**Cocoapods**
```bash
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'MyApp' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  pod 'PushwooshXCFramework'
  pod 'PushwooshFramework/PushwooshVoIP'

end
```

**2.** Dans l'onglet ```Signing & Capabilities```, ajoutez la capacité **Voice over IP** en cochant la case correspondante, comme le montre la capture d'écran ci-dessous :
<img src="/ios-voip-2.webp" alt=""/>

**3.** Initialisez le module ```PushwooshVoIP``` comme indiqué dans le code ci-dessous.

```swift
import UIKit
import PushwooshFramework
import PushwooshVoIP
import CallKit
import PushKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate, PWVoIPCallDelegate {

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        /// Initialise le module VoIP de Pushwoosh.
        ///
        /// - Paramètres :
        ///   - supportVideo : Une valeur booléenne indiquant si les appels vidéo sont pris en charge.
        ///   - ringtoneSound : Le nom du fichier audio de sonnerie personnalisé à utiliser pour les appels entrants (par ex. : `"mySound.caf"`).
        ///   - handleTypes : Le type de handle d'appel à prendre en charge. Valeurs possibles :
        ///     - `1` – Générique
        ///     - `2` – Numéro de téléphone
        ///     - `3` – Adresse e-mail
        Pushwoosh.VoIP.initializeVoIP(true, ringtoneSound: "mySound.caf", handleTypes: 1)

        // Définit le délégué pour recevoir les événements d'appel VoIP
        Pushwoosh.VoIP.delegate = self

        return true
    }

    // MARK: - Rappels PWVoIPCallDelegate requis

    func voipDidReceiveIncomingCall(payload: PushwooshVoIP.PWVoIPMessage) {
        // Gérer la notification push VoIP entrante
    }

    func pwProviderDidReset(_ provider: CXProvider) {
        // Gérer la réinitialisation du fournisseur
    }

    func pwProviderDidBegin(_ provider: CXProvider) {
        // Gérer l'activation du fournisseur
    }
}

```

**4.** Le protocole ```PWVoIPCallDelegate``` définit des rappels requis et optionnels pour gérer le cycle de vie des appels VoIP et les interactions avec CallKit.

```swift
@objc public protocol PWVoIPCallDelegate: NSObjectProtocol {

    /// Appelé lorsqu'une notification push VoIP entrante est reçue.
    @objc func voipDidReceiveIncomingCall(payload: PushwooshVoIP.PWVoIPMessage)

    /// Optionnel : Appelé lorsque l'appel entrant a été signalé avec succès à CallKit.
    @objc optional func voipDidReportIncomingCallSuccessfully(voipMessage: PushwooshVoIP.PWVoIPMessage)

    /// Optionnel : Appelé lorsque le signalement de l'appel entrant à CallKit a échoué.
    @objc optional func voipDidFailToReportIncomingCall(error: Error)

    /// Optionnel : Appelé lorsqu'un nouvel appel sortant est démarré.
    @objc optional func startCall(_ provider: CXProvider, perform action: CXStartCallAction)

    /// Optionnel : Appelé lorsqu'un appel actif est terminé.
    @objc optional func endCall(_ provider: CXProvider, perform action: CXEndCallAction, voipMessage: PushwooshVoIP.PWVoIPMessage?)

    /// Optionnel : Appelé lorsqu'un appel entrant est répondu.
    @objc optional func answerCall(_ provider: CXProvider, perform action: CXAnswerCallAction, voipMessage: PushwooshVoIP.PWVoIPMessage?)

    /// Optionnel : Appelé lorsque le son de l'appel est coupé ou rétabli.
    @objc optional func mutedCall(_ provider: CXProvider, perform action: CXSetMutedCallAction)

    /// Optionnel : Appelé lorsque l'appel est mis en attente ou repris.
    @objc optional func heldCall(_ provider: CXProvider, perform action: CXSetHeldCallAction)

    /// Optionnel : Appelé lorsqu'une tonalité DTMF est jouée.
    @objc optional func playDTMF(_ provider: CXProvider, perform action: CXPlayDTMFCallAction)

    /// Appelé lorsque le fournisseur CallKit est réinitialisé.
    @objc func pwProviderDidReset(_ provider: CXProvider)

    /// Appelé lorsque le fournisseur CallKit commence.
    @objc func pwProviderDidBegin(_ provider: CXProvider)

    /// Optionnel : Fournit l'instance du contrôleur d'appel CallKit.
    @objc optional func returnedCallController(_ controller: CXCallController)

    /// Optionnel : Fournit l'instance du fournisseur CallKit.
    @objc optional func returnedProvider(_ provider: CXProvider)

    /// Optionnel : Appelé lorsque la session audio est activée.
    @objc optional func activatedAudioSession(_ provider: CXProvider, didActivate audioSession: AVAudioSession)

    /// Optionnel : Appelé lorsque la session audio est désactivée.
    @objc optional func deactivatedAudioSession(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession)
}
```

**5.** Téléversez votre certificat VoIP sur le Control Panel de Pushwoosh conformément au [guide de configuration du certificat VoIP](/fr/developer/first-steps/connect-messaging-services/ios-configuration/ios-voip-certificate-configuration/), et choisissez la passerelle de **Production**.

C'est tout !

<Aside type="note">
Contrairement aux notifications push standard, les notifications push VoIP ne jouent pas de sons de notification et n'affichent pas d'alertes. Cependant, elles réveillent votre application en arrière-plan, ce qui vous permet de planifier une notification locale.
</Aside>

## Partagez vos commentaires avec nous

Vos commentaires nous aident à créer une meilleure expérience, nous serions donc ravis de vous entendre si vous rencontrez des problèmes lors du processus d'intégration du SDK. Si vous rencontrez des difficultés, n'hésitez pas à nous faire part de vos réflexions [via ce formulaire](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).