# Cordova VoIP 통화

Pushwoosh는 `pushwoosh-cordova-plugin`을 사용하여 iOS 및 Android용 VoIP 스타일 통화 알림을 지원합니다. 이를 통해 수신 통화 UI 및 통화 제어 이벤트를 포함한 네이티브 VoIP 통화 기능을 사용할 수 있습니다.

## 1. VoIP가 활성화된 Pushwoosh Cordova 플러그인 추가

VoIP 플래그를 활성화하여 플러그인을 설치합니다:

```sh
cordova plugin add pushwoosh-cordova-plugin --variable PW_VOIP_IOS_ENABLED=true --variable PW_VOIP_ANDROID_ENABLED=true
```

이렇게 하면 iOS에서 VoIP 기능을 지원하도록 플러그인이 구성됩니다.

## 2. PushwooshVoIP CocoaPod 종속성 추가

플러그인을 통해 `PushwooshVoIP` pod가 자동으로 포함되었는지 확인하세요. 필요한 경우 `Podfile`에서 수동으로 확인합니다:

```ruby
pod 'PushwooshVoIP'
```

> 이 pod는 PushKit 기반 VoIP 알림 및 시스템 수준 통화 처리를 지원하는 데 필요합니다.

## 3. Xcode에서 VoIP 백그라운드 모드 활성화

Xcode에서 프로젝트를 열고 다음 단계를 따르세요:

1. **Signing & Capabilities**로 이동합니다.
2. **Background Modes** 기능을 추가합니다.
3. **Voice over IP** 옵션을 선택합니다.

이렇게 하면 앱이 백그라운드에 있는 동안 수신 VoIP 푸시를 받을 수 있습니다.

## 4. VoIP 앱 코드 구성 (VoIP와 일반 푸시를 모두 사용하는 경우)

앱이 표준 푸시와 VoIP 푸시를 모두 사용하는 경우, VoIP 초기화 전에 VoIP 애플리케이션 코드를 명시적으로 설정해야 합니다:

```javascript
pushwoosh.setVoipAppCode("XXXXX-XXXXX");
```

`"XXXXX-XXXXX"`를 Pushwoosh 제어판에서 VoIP 지원 애플리케이션에 할당된 Pushwoosh 앱 코드로 바꾸세요.
<Aside type="caution" title="중요">
- VoIP 푸시용 토큰은 VoIP 앱 코드 아래에 등록되고, 일반 푸시 토큰은 기본 앱 코드 아래에 등록됩니다.

- 이 메서드는 `registerDevice()` 메서드를 호출하기 **전에** 호출해야 합니다.
</Aside> 


## 5. Android에서 통화 권한 요청

Android에서는 사용자로부터 통화 수신 권한을 부여받도록 요청해야 합니다. 이를 위해 `requestCallPermission()` 메서드를 호출합니다. 이 작업은 기기를 등록하기 전에 수행해야 합니다.

```javascript
pushwoosh.requestCallPermission();
```


## 6. VoIP 파라미터 초기화

VoIP 기능을 초기화하려면 다음 메서드를 호출하세요:

```javascript
PushNotification.prototype.initializeVoIPParameters = function(supportsVideo, ringtoneSound, handleTypes, success, error) {
    if (typeof handleTypes === "function") {
        error = ringtoneSound;
        success = supportsVideo;
        handleTypes = undefined;
        ringtoneSound = undefined;
        supportsVideo = undefined;
    }

    exec(success, error, "PushNotification", "initializeVoIPParameters", [
        !!supportsVideo,
        ringtoneSound || "",
        handleTypes != null ? Number(handleTypes) : 1
    ]);
};
```

### 파라미터

- `supportsVideo` – 앱이 영상 통화를 지원하는지에 따라 `true` 또는 `false`
- `ringtoneSound` – 사용자 지정 벨소리 파일 이름 (예: `"incoming.caf"`), 기본값은 빈 문자열
- `handleTypes` – 통화 핸들 유형에 대한 숫자 비트마스크 (`1`은 전화번호, `2`는 이메일 등)

## 7. 사용 가능한 VoIP 콜백 및 메서드

Cordova 플러그인은 다음과 같은 VoIP 관련 메서드 및 이벤트를 지원합니다:

- `answer` – 사용자가 수신 전화를 받을 때 호출됩니다
- `endCall` – 사용자가 현재 통화를 종료할 때 호출됩니다
- `hangup` – 통화가 끊겼을 때 호출됩니다
- `reject` – 수신 전화가 거부될 때 호출됩니다
- `muted` – 음소거 상태 토글, iOS 전용
- `held` – 보류 상태 토글, iOS 전용
- `voipPushPayload` – 수신 VoIP 통화에 대한 푸시 페이로드를 반환합니다
- `incomingCallSuccess` – 시스템 통화 UI가 성공적으로 표시될 때 호출됩니다, iOS 전용
- `incomingCallFailure` – 시스템 통화 UI 표시에 실패할 때 호출됩니다, iOS 전용
- `speakerOn` – 스피커 켜기
- `speakerOff` – 스피커 끄기
- `playDTMF` – 통화 중 DTMF 톤 재생, iOS 전용

이들은 Cordova의 `PushNotification` 객체를 사용하여 연결할 수 있으며, 이를 통해 VoIP 통화 상태 변경을 제어하고 응답할 수 있습니다.


## 관련 링크

- [Pushwoosh Cordova SDK 개요](/ko/developer/pushwoosh-sdk/cross-platform-frameworks/cordova/)
- [iOS의 VoIP 푸시 알림 (Apple 문서)](https://developer.apple.com/documentation/pushkit)