VoIP pushes
In iOS 8 Apple introduced PushKit, and VoIP pushes - a new type of push notifications. On top of the standard push functionality, a VoIP push allows the app to execute code before displaying the notification to the user.
1. Add the PushwooshVoIP module to your project.
Swift Package Manager

Cocoapods
# 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. In the Signing & Capabilities
tab, add the Voice over IP capability by checking the checkbox, as shown in the screenshot below:

3. Initialize the PushwooshVoIP
module as shown in the code below.
import UIKitimport PushwooshFrameworkimport PushwooshVoIPimport CallKitimport PushKit
@mainclass AppDelegate: UIResponder, UIApplicationDelegate, PWVoIPCallDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
/// Initializes the Pushwoosh VoIP module. /// /// - Parameters: /// - supportVideo: A Boolean value indicating whether video calls are supported. /// - ringtoneSound: The name of the custom ringtone sound file to be used for incoming calls (e.g. `"mySound.caf"`). /// - handleTypes: The type of call handle to support. Possible values: /// - `1` – Generic /// - `2` – Phone number /// - `3` – Email address Pushwoosh.VoIP.initializeVoIP(true, ringtoneSound: "mySound.caf", handleTypes: 1)
// Set delegate to receive VoIP call events Pushwoosh.VoIP.delegate = self
return true }
// MARK: - Required PWVoIPCallDelegate Callbacks
func voipDidReceiveIncomingCall(payload: PushwooshVoIP.PWVoIPMessage) { // Handle incoming VoIP push }
func pwProviderDidReset(_ provider: CXProvider) { // Handle provider reset }
func pwProviderDidBegin(_ provider: CXProvider) { // Handle provider activation }}
4. The PWVoIPCallDelegate
protocol defines required and optional callbacks for handling the VoIP call lifecycle and CallKit interactions.
@objc public protocol PWVoIPCallDelegate: NSObjectProtocol {
/// Called when an incoming VoIP push is received. @objc func voipDidReceiveIncomingCall(payload: PushwooshVoIP.PWVoIPMessage)
/// Optional: Called when the incoming call was successfully reported to CallKit. @objc optional func voipDidReportIncomingCallSuccessfully(voipMessage: PushwooshVoIP.PWVoIPMessage)
/// Optional: Called when reporting the incoming call to CallKit failed. @objc optional func voipDidFailToReportIncomingCall(error: Error)
/// Optional: Called when a new outgoing call is started. @objc optional func startCall(_ provider: CXProvider, perform action: CXStartCallAction)
/// Optional: Called when an active call is ended. @objc optional func endCall(_ provider: CXProvider, perform action: CXEndCallAction, voipMessage: PushwooshVoIP.PWVoIPMessage?)
/// Optional: Called when an incoming call is answered. @objc optional func answerCall(_ provider: CXProvider, perform action: CXAnswerCallAction, voipMessage: PushwooshVoIP.PWVoIPMessage?)
/// Optional: Called when the call is muted or unmuted. @objc optional func mutedCall(_ provider: CXProvider, perform action: CXSetMutedCallAction)
/// Optional: Called when the call is held or unheld. @objc optional func heldCall(_ provider: CXProvider, perform action: CXSetHeldCallAction)
/// Optional: Called when a DTMF tone is played. @objc optional func playDTMF(_ provider: CXProvider, perform action: CXPlayDTMFCallAction)
/// Called when the CallKit provider is reset. @objc func pwProviderDidReset(_ provider: CXProvider)
/// Called when the CallKit provider begins. @objc func pwProviderDidBegin(_ provider: CXProvider)
/// Optional: Provides the CallKit call controller instance. @objc optional func returnedCallController(_ controller: CXCallController)
/// Optional: Provides the CallKit provider instance. @objc optional func returnedProvider(_ provider: CXProvider)
/// Optional: Called when the audio session is activated. @objc optional func activatedAudioSession(_ provider: CXProvider, didActivate audioSession: AVAudioSession)
/// Optional: Called when the audio session is deactivated. @objc optional func deactivatedAudioSession(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession)}
5. Upload your VoIP certificate to Pushwoosh Control Panel according to Configuration Guide, and choose the Production gateway.
That’s it!
Share your feedback with us
Section titled “Share your feedback with us”Your feedback helps us create a better experience, so we would love to hear from you if you have any issues during the SDK integration process. If you face any difficulties, please do not hesitate to share your thoughts with us via this form.