# Pushes VoIP

No iOS 8, a Apple introduziu o [PushKit](https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternet/Reference/PushKit_Framework/index.html) e os pushes VoIP - um novo tipo de notificação push. Além da funcionalidade de push padrão, um push VoIP permite que o aplicativo execute código antes de exibir a notificação ao usuário.

<Aside type="caution" title="Importante">
Você só pode criar um certificado VoIP no modo de produção, não no modo de desenvolvimento. Portanto, na configuração do aplicativo Pushwoosh para iOS, você deve sempre usar o gateway de **Produção** para certificados VoIP.
</Aside>


**1.** Adicione o módulo PushwooshVoIP ao seu projeto.

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

<Aside type="caution" title="Importante">
Os módulos ```PushwooshFramework```, ```PushwooshCore```, ```PushwooshBridge``` e ```PushwooshLiveActivities``` são **obrigatórios**.
</Aside>

**Cocoapods**
```bash
# Descomente a próxima linha para definir uma plataforma global para o seu projeto
# platform :ios, '9.0'

target 'MyApp' do
  # Comente a próxima linha se não quiser usar frameworks dinâmicos
  use_frameworks!

  pod 'PushwooshXCFramework'
  pod 'PushwooshFramework/PushwooshVoIP'

end
```

**2.** Na aba ```Signing & Capabilities```, adicione a capacidade **Voice over IP** marcando a caixa de seleção, como mostrado na captura de tela abaixo:
<img src="/ios-voip-2.webp" alt=""/>

**3.** Inicialize o módulo ```PushwooshVoIP``` como mostrado no código abaixo.

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

        /// Inicializa o módulo VoIP do Pushwoosh.
        ///
        /// - Parâmetros:
        ///   - supportVideo: Um valor booleano que indica se as chamadas de vídeo são suportadas.
        ///   - ringtoneSound: O nome do arquivo de som de toque personalizado a ser usado para chamadas recebidas (por exemplo, `"mySound.caf"`).
        ///   - handleTypes: O tipo de identificador de chamada a ser suportado. Valores possíveis:
        ///     - `1` – Genérico
        ///     - `2` – Número de telefone
        ///     - `3` – Endereço de e-mail
        Pushwoosh.VoIP.initializeVoIP(true, ringtoneSound: "mySound.caf", handleTypes: 1)

        // Define o delegate para receber eventos de chamada VoIP
        Pushwoosh.VoIP.delegate = self

        return true
    }

    // MARK: - Callbacks Obrigatórios do PWVoIPCallDelegate

    func voipDidReceiveIncomingCall(payload: PushwooshVoIP.PWVoIPMessage) {
        // Lida com o push VoIP recebido
    }

    func pwProviderDidReset(_ provider: CXProvider) {
        // Lida com a redefinição do provedor
    }

    func pwProviderDidBegin(_ provider: CXProvider) {
        // Lida com a ativação do provedor
    }
}

```

**4.** O protocolo ```PWVoIPCallDelegate``` define callbacks obrigatórios e opcionais para lidar com o ciclo de vida da chamada VoIP e as interações do CallKit.

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

    /// Chamado quando um push VoIP de entrada é recebido.
    @objc func voipDidReceiveIncomingCall(payload: PushwooshVoIP.PWVoIPMessage)

    /// Opcional: Chamado quando a chamada de entrada foi reportada com sucesso ao CallKit.
    @objc optional func voipDidReportIncomingCallSuccessfully(voipMessage: PushwooshVoIP.PWVoIPMessage)

    /// Opcional: Chamado quando a comunicação da chamada de entrada ao CallKit falhou.
    @objc optional func voipDidFailToReportIncomingCall(error: Error)

    /// Opcional: Chamado quando uma nova chamada de saída é iniciada.
    @objc optional func startCall(_ provider: CXProvider, perform action: CXStartCallAction)

    /// Opcional: Chamado quando uma chamada ativa é encerrada.
    @objc optional func endCall(_ provider: CXProvider, perform action: CXEndCallAction, voipMessage: PushwooshVoIP.PWVoIPMessage?)

    /// Opcional: Chamado quando uma chamada de entrada é atendida.
    @objc optional func answerCall(_ provider: CXProvider, perform action: CXAnswerCallAction, voipMessage: PushwooshVoIP.PWVoIPMessage?)

    /// Opcional: Chamado quando a chamada é silenciada ou não.
    @objc optional func mutedCall(_ provider: CXProvider, perform action: CXSetMutedCallAction)

    /// Opcional: Chamado quando a chamada é colocada em espera ou retirada da espera.
    @objc optional func heldCall(_ provider: CXProvider, perform action: CXSetHeldCallAction)

    /// Opcional: Chamado quando um tom DTMF é reproduzido.
    @objc optional func playDTMF(_ provider: CXProvider, perform action: CXPlayDTMFCallAction)

    /// Chamado quando o provedor CallKit é redefinido.
    @objc func pwProviderDidReset(_ provider: CXProvider)

    /// Chamado quando o provedor CallKit inicia.
    @objc func pwProviderDidBegin(_ provider: CXProvider)

    /// Opcional: Fornece a instância do controlador de chamadas do CallKit.
    @objc optional func returnedCallController(_ controller: CXCallController)

    /// Opcional: Fornece a instância do provedor do CallKit.
    @objc optional func returnedProvider(_ provider: CXProvider)

    /// Opcional: Chamado quando a sessão de áudio é ativada.
    @objc optional func activatedAudioSession(_ provider: CXProvider, didActivate audioSession: AVAudioSession)

    /// Opcional: Chamado quando a sessão de áudio é desativada.
    @objc optional func deactivatedAudioSession(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession)
}
```

**5.** Faça o upload do seu certificado VoIP para o Painel de Controle do Pushwoosh de acordo com o [Guia de Configuração](/pt/developer/first-steps/connect-messaging-services/ios-configuration/ios-platform-configuration/) e escolha o gateway de **Produção**.

É isso!

<Aside type="note">
Ao contrário do push padrão, os pushes VoIP não reproduzem sons de notificação nem exibem alertas. No entanto, eles ativam seu aplicativo em segundo plano, o que permite agendar uma notificação local.
</Aside>

## Compartilhe seu feedback conosco

Seu feedback nos ajuda a criar uma experiência melhor, então adoraríamos ouvir de você se tiver algum problema durante o processo de integração do SDK. Se você enfrentar alguma dificuldade, não hesite em compartilhar suas opiniões conosco [através deste formulário](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).