# VoIP 푸시

iOS 8에서 Apple은 [PushKit](https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternet/Reference/PushKit_Framework/index.html)과 새로운 유형의 푸시 알림인 VoIP 푸시를 도입했습니다. 표준 푸시 기능 외에도 VoIP 푸시는 앱이 사용자에게 알림을 표시하기 전에 코드를 실행할 수 있도록 합니다.

<Aside type="caution" title="중요">
VoIP 인증서는 개발 모드가 아닌 프로덕션 모드에서만 생성할 수 있습니다. 따라서 Pushwoosh iOS 앱 구성에서는 VoIP 인증서에 대해 항상 **프로덕션** 게이트웨이를 사용해야 합니다.
</Aside>


**1.** 프로젝트에 PushwooshVoIP 모듈을 추가합니다.

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

<Aside type="caution" title="중요">
`PushwooshFramework`, `PushwooshCore`, `PushwooshBridge`, `PushwooshLiveActivities` 모듈은 **필수**입니다.
</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.** `Signing & Capabilities` 탭에서 아래 스크린샷과 같이 체크박스를 선택하여 **Voice over IP** 기능을 추가합니다:
<img src="/ios-voip-2.webp" alt=""/>

**3.** 아래 코드와 같이 `PushwooshVoIP` 모듈을 초기화합니다.

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

        /// Pushwoosh VoIP 모듈을 초기화합니다.
        ///
        /// - 매개변수:
        ///   - supportVideo: 영상 통화 지원 여부를 나타내는 Boolean 값입니다.
        ///   - ringtoneSound: 수신 전화에 사용할 사용자 지정 벨소리 사운드 파일의 이름입니다 (예: `"mySound.caf"`).
        ///   - handleTypes: 지원할 통화 핸들 유형입니다. 가능한 값:
        ///     - `1` – 일반
        ///     - `2` – 전화번호
        ///     - `3` – 이메일 주소
        Pushwoosh.VoIP.initializeVoIP(true, ringtoneSound: "mySound.caf", handleTypes: 1)

        // VoIP 통화 이벤트를 수신하도록 델리게이트를 설정합니다
        Pushwoosh.VoIP.delegate = self

        return true
    }

    // MARK: - 필수 PWVoIPCallDelegate 콜백

    func voipDidReceiveIncomingCall(payload: PushwooshVoIP.PWVoIPMessage) {
        // 수신 VoIP 푸시 처리
    }

    func pwProviderDidReset(_ provider: CXProvider) {
        // provider 재설정 처리
    }

    func pwProviderDidBegin(_ provider: CXProvider) {
        // provider 활성화 처리
    }
}

```

**4.** `PWVoIPCallDelegate` 프로토콜은 VoIP 통화 생명주기 및 CallKit 상호작용을 처리하기 위한 필수 및 선택적 콜백을 정의합니다.

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

    /// 수신 VoIP 푸시를 받았을 때 호출됩니다.
    @objc func voipDidReceiveIncomingCall(payload: PushwooshVoIP.PWVoIPMessage)

    /// 선택 사항: 수신 전화가 CallKit에 성공적으로 보고되었을 때 호출됩니다.
    @objc optional func voipDidReportIncomingCallSuccessfully(voipMessage: PushwooshVoIP.PWVoIPMessage)

    /// 선택 사항: 수신 전화를 CallKit에 보고하는 데 실패했을 때 호출됩니다.
    @objc optional func voipDidFailToReportIncomingCall(error: Error)

    /// 선택 사항: 새로운 발신 전화가 시작될 때 호출됩니다.
    @objc optional func startCall(_ provider: CXProvider, perform action: CXStartCallAction)

    /// 선택 사항: 활성 통화가 종료될 때 호출됩니다.
    @objc optional func endCall(_ provider: CXProvider, perform action: CXEndCallAction, voipMessage: PushwooshVoIP.PWVoIPMessage?)

    /// 선택 사항: 수신 전화에 응답했을 때 호출됩니다.
    @objc optional func answerCall(_ provider: CXProvider, perform action: CXAnswerCallAction, voipMessage: PushwooshVoIP.PWVoIPMessage?)

    /// 선택 사항: 통화가 음소거되거나 음소거 해제될 때 호출됩니다.
    @objc optional func mutedCall(_ provider: CXProvider, perform action: CXSetMutedCallAction)

    /// 선택 사항: 통화가 보류되거나 보류 해제될 때 호출됩니다.
    @objc optional func heldCall(_ provider: CXProvider, perform action: CXSetHeldCallAction)

    /// 선택 사항: DTMF 톤이 재생될 때 호출됩니다.
    @objc optional func playDTMF(_ provider: CXProvider, perform action: CXPlayDTMFCallAction)

    /// CallKit provider가 재설정될 때 호출됩니다.
    @objc func pwProviderDidReset(_ provider: CXProvider)

    /// CallKit provider가 시작될 때 호출됩니다.
    @objc func pwProviderDidBegin(_ provider: CXProvider)

    /// 선택 사항: CallKit 통화 컨트롤러 인스턴스를 제공합니다.
    @objc optional func returnedCallController(_ controller: CXCallController)

    /// 선택 사항: CallKit provider 인스턴스를 제공합니다.
    @objc optional func returnedProvider(_ provider: CXProvider)

    /// 선택 사항: 오디오 세션이 활성화될 때 호출됩니다.
    @objc optional func activatedAudioSession(_ provider: CXProvider, didActivate audioSession: AVAudioSession)

    /// 선택 사항: 오디오 세션이 비활성화될 때 호출됩니다.
    @objc optional func deactivatedAudioSession(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession)
}
```

**5.** [구성 가이드](/ko/developer/first-steps/connect-messaging-services/ios-configuration/ios-platform-configuration/)에 따라 VoIP 인증서를 Pushwoosh Control Panel에 업로드하고 **프로덕션** 게이트웨이를 선택합니다.

이것으로 끝입니다!

<Aside type="note">
표준 푸시와 달리 VoIP 푸시는 알림 소리를 재생하거나 알림을 표시하지 않습니다. 하지만 백그라운드에서 앱을 깨워 로컬 알림을 예약할 수 있습니다.
</Aside>

## 피드백을 공유해주세요

여러분의 피드백은 더 나은 경험을 만드는 데 도움이 됩니다. SDK 통합 과정에서 문제가 발생하면 언제든지 알려주세요. 어려움이 있으시면 주저하지 마시고 [이 양식을 통해](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform) 의견을 공유해주세요.