# พุช 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 ได้ในโหมด production เท่านั้น ไม่ใช่โหมด development ดังนั้น ในการกำหนดค่าแอป Pushwoosh iOS คุณควรใช้เกตเวย์ **Production** สำหรับใบรับรอง 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 {

        /// 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.** โปรโตคอล ```PWVoIPCallDelegate``` กำหนด callbacks ที่จำเป็นและไม่จำเป็นสำหรับการจัดการวงจรชีวิตของการโทร VoIP และการโต้ตอบกับ CallKit

```swift
@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.** อัปโหลดใบรับรอง VoIP ของคุณไปยัง Pushwoosh Control Panel ตาม [คู่มือการกำหนดค่า](/th/developer/first-steps/connect-messaging-services/ios-configuration/ios-platform-configuration/) และเลือกเกตเวย์ **Production**

เพียงเท่านี้ก็เรียบร้อย!

<Aside type="note">
ตรงกันข้ามกับพุชมาตรฐาน พุช VoIP จะไม่เล่นเสียงการแจ้งเตือนหรือแสดงการแจ้งเตือน อย่างไรก็ตาม พุชเหล่านี้จะปลุกแอปของคุณในเบื้องหลัง ซึ่งช่วยให้คุณสามารถกำหนดเวลาการแจ้งเตือนในเครื่องได้
</Aside>

## แบ่งปันความคิดเห็นของคุณกับเรา

ความคิดเห็นของคุณช่วยให้เราสร้างประสบการณ์ที่ดีขึ้น ดังนั้นเรายินดีที่จะรับฟังจากคุณหากคุณมีปัญหาใดๆ ในระหว่างกระบวนการผสานรวม SDK หากคุณประสบปัญหาใดๆ โปรดอย่าลังเลที่จะแบ่งปันความคิดเห็นของคุณกับเรา [ผ่านฟอร์มนี้](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform)