# 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: एक बूलियन मान जो यह दर्शाता है कि वीडियो कॉल समर्थित हैं या नहीं।
        ///   - 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) {
        // प्रोवाइडर रीसेट को हैंडल करें
    }

    func pwProviderDidBegin(_ provider: CXProvider) {
        // प्रोवाइडर एक्टिवेशन को हैंडल करें
    }
}

```

**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 प्रोवाइडर रीसेट होता है तो कॉल किया जाता है।
    @objc func pwProviderDidReset(_ provider: CXProvider)

    /// जब CallKit प्रोवाइडर शुरू होता है तो कॉल किया जाता है।
    @objc func pwProviderDidBegin(_ provider: CXProvider)

    /// वैकल्पिक: CallKit कॉल कंट्रोलर इंस्टेंस प्रदान करता है।
    @objc optional func returnedCallController(_ controller: CXCallController)

    /// वैकल्पिक: CallKit प्रोवाइडर इंस्टेंस प्रदान करता है।
    @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.** [VoIP प्रमाणपत्र कॉन्फ़िगरेशन गाइड](/hi/developer/first-steps/connect-messaging-services/ios-configuration/ios-voip-certificate-configuration/) के अनुसार अपना VoIP प्रमाणपत्र Pushwoosh कंट्रोल पैनल पर अपलोड करें, और **प्रोडक्शन** गेटवे चुनें।

बस इतना ही!

<Aside type="note">
मानक पुश के विपरीत, VoIP पुश नोटिफिकेशन साउंड नहीं बजाते हैं, या अलर्ट प्रदर्शित नहीं करते हैं। हालांकि, वे आपके ऐप को बैकग्राउंड में जगाते हैं, जो आपको एक स्थानीय नोटिफिकेशन शेड्यूल करने की अनुमति देता है।
</Aside>

## अपनी प्रतिक्रिया हमारे साथ साझा करें

आपकी प्रतिक्रिया हमें एक बेहतर अनुभव बनाने में मदद करती है, इसलिए यदि आपको SDK एकीकरण प्रक्रिया के दौरान कोई समस्या आती है तो हम आपसे सुनना पसंद करेंगे। यदि आपको कोई कठिनाई आती है, तो कृपया [इस फॉर्म के माध्यम से](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform) हमारे साथ अपने विचार साझा करने में संकोच न करें।