# VoIP-Pushes

In iOS 8 hat Apple [PushKit](https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternet/Reference/PushKit_Framework/index.html) und VoIP-Pushes eingeführt – eine neue Art von Push-Benachrichtigungen. Zusätzlich zur Standard-Push-Funktionalität ermöglicht ein VoIP-Push der App, Code auszuführen, bevor die Benachrichtigung dem Benutzer angezeigt wird.

<Aside type="caution" title="Wichtig">
Sie können ein VoIP-Zertifikat nur im Produktionsmodus erstellen, nicht im Entwicklungsmodus. Daher sollten Sie in der Pushwoosh iOS-App-Konfiguration immer das **Production**-Gateway für VoIP-Zertifikate verwenden.
</Aside>


**1.** Fügen Sie das PushwooshVoIP-Modul zu Ihrem Projekt hinzu.

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

<Aside type="caution" title="Wichtig">
Die Module ```PushwooshFramework```, ```PushwooshCore```, ```PushwooshBridge``` und ```PushwooshLiveActivities``` sind **erforderlich**.
</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.** Fügen Sie im Tab ```Signing & Capabilities``` die Fähigkeit **Voice over IP** hinzu, indem Sie das Kontrollkästchen aktivieren, wie im folgenden Screenshot gezeigt:
<img src="/ios-voip-2.webp" alt=""/>

**3.** Initialisieren Sie das ```PushwooshVoIP```-Modul wie im folgenden Code gezeigt.

```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 {

        /// Initialisiert das Pushwoosh VoIP-Modul.
        ///
        /// - Parameter:
        ///   - supportVideo: Ein boolescher Wert, der angibt, ob Videoanrufe unterstützt werden.
        ///   - ringtoneSound: Der Name der benutzerdefinierten Klingelton-Sounddatei, die für eingehende Anrufe verwendet werden soll (z. B. `"mySound.caf"`).
        ///   - handleTypes: Der Typ des zu unterstützenden Anruf-Handles. Mögliche Werte:
        ///     - `1` – Generisch
        ///     - `2` – Telefonnummer
        ///     - `3` – E-Mail-Adresse
        Pushwoosh.VoIP.initializeVoIP(true, ringtoneSound: "mySound.caf", handleTypes: 1)

        // Delegat zum Empfangen von VoIP-Anrufereignissen festlegen
        Pushwoosh.VoIP.delegate = self

        return true
    }

    // MARK: - Erforderliche PWVoIPCallDelegate-Callbacks

    func voipDidReceiveIncomingCall(payload: PushwooshVoIP.PWVoIPMessage) {
        // Eingehenden VoIP-Push behandeln
    }

    func pwProviderDidReset(_ provider: CXProvider) {
        // Provider-Reset behandeln
    }

    func pwProviderDidBegin(_ provider: CXProvider) {
        // Provider-Aktivierung behandeln
    }
}

```

**4.** Das ```PWVoIPCallDelegate```-Protokoll definiert erforderliche und optionale Callbacks zur Handhabung des VoIP-Anruflebenszyklus und der CallKit-Interaktionen.

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

    /// Wird aufgerufen, wenn ein eingehender VoIP-Push empfangen wird.
    @objc func voipDidReceiveIncomingCall(payload: PushwooshVoIP.PWVoIPMessage)

    /// Optional: Wird aufgerufen, wenn der eingehende Anruf erfolgreich an CallKit gemeldet wurde.
    @objc optional func voipDidReportIncomingCallSuccessfully(voipMessage: PushwooshVoIP.PWVoIPMessage)

    /// Optional: Wird aufgerufen, wenn das Melden des eingehenden Anrufs an CallKit fehlgeschlagen ist.
    @objc optional func voipDidFailToReportIncomingCall(error: Error)

    /// Optional: Wird aufgerufen, wenn ein neuer ausgehender Anruf gestartet wird.
    @objc optional func startCall(_ provider: CXProvider, perform action: CXStartCallAction)

    /// Optional: Wird aufgerufen, wenn ein aktiver Anruf beendet wird.
    @objc optional func endCall(_ provider: CXProvider, perform action: CXEndCallAction, voipMessage: PushwooshVoIP.PWVoIPMessage?)

    /// Optional: Wird aufgerufen, wenn ein eingehender Anruf angenommen wird.
    @objc optional func answerCall(_ provider: CXProvider, perform action: CXAnswerCallAction, voipMessage: PushwooshVoIP.PWVoIPMessage?)

    /// Optional: Wird aufgerufen, wenn der Anruf stummgeschaltet oder die Stummschaltung aufgehoben wird.
    @objc optional func mutedCall(_ provider: CXProvider, perform action: CXSetMutedCallAction)

    /// Optional: Wird aufgerufen, wenn der Anruf gehalten oder fortgesetzt wird.
    @objc optional func heldCall(_ provider: CXProvider, perform action: CXSetHeldCallAction)

    /// Optional: Wird aufgerufen, wenn ein DTMF-Ton abgespielt wird.
    @objc optional func playDTMF(_ provider: CXProvider, perform action: CXPlayDTMFCallAction)

    /// Wird aufgerufen, wenn der CallKit-Provider zurückgesetzt wird.
    @objc func pwProviderDidReset(_ provider: CXProvider)

    /// Wird aufgerufen, wenn der CallKit-Provider beginnt.
    @objc func pwProviderDidBegin(_ provider: CXProvider)

    /// Optional: Stellt die CallKit-Anrufcontroller-Instanz bereit.
    @objc optional func returnedCallController(_ controller: CXCallController)

    /// Optional: Stellt die CallKit-Provider-Instanz bereit.
    @objc optional func returnedProvider(_ provider: CXProvider)

    /// Optional: Wird aufgerufen, wenn die Audiositzung aktiviert wird.
    @objc optional func activatedAudioSession(_ provider: CXProvider, didActivate audioSession: AVAudioSession)

    /// Optional: Wird aufgerufen, wenn die Audiositzung deaktiviert wird.
    @objc optional func deactivatedAudioSession(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession)
}
```

**5.** Laden Sie Ihr VoIP-Zertifikat gemäß der [Anleitung zur Konfiguration von VoIP-Zertifikaten](/de/developer/first-steps/connect-messaging-services/ios-configuration/ios-voip-certificate-configuration/) in das Pushwoosh Control Panel hoch und wählen Sie das **Production**-Gateway.

Das war's!

<Aside type="note">
Im Gegensatz zu Standard-Pushes spielen VoIP-Pushes keine Benachrichtigungstöne ab und zeigen keine Warnmeldungen an. Sie wecken jedoch Ihre App im Hintergrund auf, was es Ihnen ermöglicht, eine lokale Benachrichtigung zu planen.
</Aside>

## Teilen Sie Ihr Feedback mit uns

Ihr Feedback hilft uns, eine bessere Erfahrung zu schaffen. Daher würden wir uns freuen, von Ihnen zu hören, wenn Sie während des SDK-Integrationsprozesses auf Probleme stoßen. Sollten Sie Schwierigkeiten haben, zögern Sie bitte nicht, uns Ihre Gedanken [über dieses Formular](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform) mitzuteilen.