# iOS SDK को कस्टमाइज़ करना

## एकीकरण

*   [डीप लिंकिंग](#deep-linking)
*   [यूनिवर्सल लिंक्स](#universal-links)
*   [इन-ऐप खरीदारी ट्रैकिंग](#in-app-purchase-tracking)
*   [जियोज़ोन पुश नोटिफिकेशन्स](#geozones-push-notifications)
*   [एक रिच मीडिया कतार बनाना](#creating-a-rich-media-queue)
*   [फोर्स टच के साथ एक रिच नोटिफिकेशन में भेजे गए वीडियो को ऑटोप्ले करें](#autoplay-a-video-sent-in-a-rich-notification-with-force-touch)
*   [कस्टम पुश साउंड](#custom-push-sound)
*   [iOS प्रोविजनल पुश](#ios-provisional-push)

### डीप लिंकिंग

अपनी **Info.plist** फ़ाइल में `URL Identifier` और `URL Scheme` के साथ `URL types` ऐरे जोड़ें।\
नीचे दिए गए उदाहरण में `URL Scheme` _com.pushwoosh_ है और `URL Identifier` _promotion_ है।

<img src="/ios-push-notifications-customizing-ios-sdk-3.webp" alt=""/>

अपनी ऐप डेलीगेट फ़ाइल (आमतौर पर iOS 12 और उससे नीचे के लिए AppDelegate.m, या iOS 13 और उससे ऊपर के लिए SceneDelegate.m) में, नीचे दिए गए उदाहरण में उल्लिखित उपयुक्त openURL डेलीगेट फ़ंक्शन जोड़ें। उदाहरण सही पेज की जाँच करता है, URL से "id" मान को पार्स करता है, और प्रतिक्रिया में PromoPageViewController खोलता है।

```AppDelegate.swift```
<Tabs>
<TabItem label="Swift">
```swift
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let page = components?.host
    var promotionId: String?

    if page == "promotion" {
        return
    }

    let items = components?.queryItems ?? []

    for item in items {
        if item.name == "id" {
            promotionId = item.value
        }
    }

    //show PromoPageViewController
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *page = components.host;
    NSString *promotionId = nil;

    //return if this is not a promotion deep link
    if(![page isEqualToString:@"promotion"])
        return NO;

    for(NSURLQueryItem *item in components.queryItems)
    {
        if([item.name isEqualToString:@"id"])
            promotionId = item.value;
    }

    PromoPageViewController *vc = [[PromoPageViewController alloc] init];
    vc.promotionId = promotionId
    [self presentViewController:vc animated:YES completion:nil];
}
```
</TabItem>
</Tabs>

```SceneDelegate.swift```
<Tabs>
<TabItem label="Swift">
```swift
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let urlContext = URLContexts.first else { return }
        
    let components = URLComponents(url: urlContext.url, resolvingAgainstBaseURL: false)
    let page = components?.host
    var promotionId: String?
        
    guard page == "promotion" else {
        return
    }
        
    let items = components?.queryItems ?? []
        
    for item in items {
        if item.name == "id" {
            promotionId = item.value
        }
    }
        
    //show PromoPageViewController
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (void)scene:(UIWindowScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
    UIOpenURLContext *urlContext = URLContexts.anyObject;
    if (!urlContext) {
        return;
    }

    NSURLComponents *components = [NSURLComponents componentsWithURL:urlContext.URL resolvingAgainstBaseURL:NO];
    NSString *page = components.host;
    NSString *promotionId = nil;

    if (![page isEqualToString:@"promotion"]) {
        return;
    }

    for (NSURLQueryItem *item in components.queryItems) {
        if ([item.name isEqualToString:@"id"]) {
            promotionId = item.value;
        }
    }

    //show PromoPageViewController
}
```

</TabItem>
</Tabs>

### यूनिवर्सल लिंक्स

यूनिवर्सल लिंक्स उपयोगकर्ताओं को आपकी वेबसाइट के लिंक पर टैप करने पर सीधे आपका ऐप खोलने की अनुमति देते हैं। कस्टम URL स्कीम के विपरीत, यूनिवर्सल लिंक्स मानक `https://` URLs का उपयोग करते हैं और एक अधिक सहज उपयोगकर्ता अनुभव प्रदान करते हैं।

<Aside type="note">
**SDK संस्करण 7.0.15** से, Pushwoosh iOS SDK पुश नोटिफिकेशन से यूनिवर्सल लिंक्स को सफारी में खोलने के बजाय स्वचालित रूप से आपके ऐप के हैंडलर्स पर भेजता है।
</Aside>

#### यह कैसे काम करता है

जब एक पुश नोटिफिकेशन में `https://` URL होता है ("url" या "l" पैरामीटर में), तो SDK करेगा:

1.  URL के साथ एक `NSUserActivity` बनाएँ
2.  अपने ऐप के यूनिवर्सल लिंक्स हैंडलर (`scene:continueUserActivity:` या `application:continueUserActivity:restorationHandler:`) को कॉल करें
3.  यदि आपका ऐप URL को हैंडल नहीं करता है, तो यह एक फॉलबैक के रूप में सफारी में खुलेगा

#### सेटअप

1.  **Xcode में एसोसिएटेड डोमेन्स कॉन्फ़िगर करें**

    अपने ऐप में एसोसिएटेड डोमेन्स क्षमता जोड़ें और अपना डोमेन जोड़ें:

    ```
    applinks:yourdomain.com
    ```

2.  **एप्पल ऐप साइट एसोसिएशन फ़ाइल को होस्ट करें**

    अपने वेब सर्वर पर `https://yourdomain.com/.well-known/apple-app-site-association` पर एक `apple-app-site-association` फ़ाइल बनाएँ:

    ```json
    {
      "applinks": {
        "apps": [],
        "details": [
          {
            "appID": "TEAM_ID.com.your.bundleid",
            "paths": ["/path/*", "/promotion/*"]
          }
        ]
      }
    }
    ```

    `TEAM_ID` को अपने Apple डेवलपर टीम ID से और `com.your.bundleid` को अपने ऐप के बंडल आइडेंटिफायर से बदलें।

3.  **यूनिवर्सल लिंक्स हैंडलर को लागू करें**

    ```SceneDelegate.swift``` (iOS 13+)
<Tabs>
<TabItem label="Swift">
```swift
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else {
        return
    }

    // Handle the Universal Link URL
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let path = components?.path

    if path?.starts(with: "/promotion") == true {
        // Navigate to promotion screen
        let promotionId = components?.queryItems?.first(where: { $0.name == "id" })?.value
        // Show promotion with promotionId
    }
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
    if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        return;
    }

    NSURL *url = userActivity.webpageURL;
    if (!url) {
        return;
    }

    // Handle the Universal Link URL
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *path = components.path;

    if ([path hasPrefix:@"/promotion"]) {
        // Navigate to promotion screen
        NSString *promotionId = nil;
        for (NSURLQueryItem *item in components.queryItems) {
            if ([item.name isEqualToString:@"id"]) {
                promotionId = item.value;
                break;
            }
        }
        // Show promotion with promotionId
    }
}
```
</TabItem>
</Tabs>

```AppDelegate.swift``` (iOS 12 और पहले, या फॉलबैक के रूप में)
<Tabs>
<TabItem label="Swift">
```swift
func application(_ application: UIApplication,
                 continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else {
        return false
    }

    // Handle the Universal Link URL
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let path = components?.path

    if path?.starts(with: "/promotion") == true {
        // Navigate to promotion screen
        return true
    }

    return false
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (BOOL)application:(UIApplication *)application
        continueUserActivity:(NSUserActivity *)userActivity
          restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *restorableObjects))restorationHandler {

    if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        return NO;
    }

    NSURL *url = userActivity.webpageURL;
    if (!url) {
        return NO;
    }

    // Handle the Universal Link URL
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *path = components.path;

    if ([path hasPrefix:@"/promotion"]) {
        // Navigate to promotion screen
        return YES;
    }

    return NO;
}
```
</TabItem>
</Tabs>

#### यूनिवर्सल लिंक के साथ पुश भेजना

पुश नोटिफिकेशन बनाते समय, **एक्शन** फ़ील्ड में अपनी वेबसाइट URL का उपयोग करें:

```
https://yourdomain.com/promotion?id=123
```

SDK इस URL को स्वचालित रूप से आपके यूनिवर्सल लिंक्स हैंडलर पर भेज देगा, जिससे आप उपयोगकर्ता को अपने ऐप में उपयुक्त स्क्रीन पर नेविगेट कर सकेंगे।

<Aside type="tip">
यूनिवर्सल लिंक्स कस्टम URL स्कीम की तुलना में बेहतर उपयोगकर्ता अनुभव प्रदान करते हैं क्योंकि वे तब भी काम करते हैं जब आपका ऐप इंस्टॉल नहीं होता है — उपयोगकर्ता को इसके बजाय आपकी वेबसाइट पर ले जाया जाएगा।
</Aside>

### इन-ऐप खरीदारी ट्रैकिंग

डिफ़ॉल्ट रूप से, इन-ऐप खरीदारी की ट्रैकिंग अक्षम है। यदि आप [कस्टमर जर्नी](/hi/product/customer-journey/pushwoosh-journey-overview) को कॉन्फ़िगर करते समय इन-ऐप खरीदारी को ट्रैक करना चाहते हैं, तो _info.plist_ फ़ाइल में _Pushwoosh\_PURCHASE\_TRACKING\_ENABLED_ फ़्लैग को _true_ पर सेट करें। आप [तालिका](/hi/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/advanced-integration-guide/#complete-list-of-infoplist-properties) में उपलब्ध फ़्लैग की सूची पा सकते हैं।

यदि आप इन-ऐप खरीदारी को मैन्युअल रूप से ट्रैक करना चाहते हैं, तो आप नीचे दिए गए कोड का उपयोग कर सकते हैं।

`paymentQueue:updatedTransactions: delegate` मेथड में `PushManager` के `sendSKPaymentTransactions मेथड` को कॉल करें

<Tabs>
<TabItem label="Swift">
```swift
 func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
     // In-Apps Tracking Pushwoosh code here
     Pushwoosh.sharedInstance().sendSKPaymentTransactions(transactions)
     // the rest of the code, consume transactions, etc
 }
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {

  [[PushNotificationManager pushManager] sendSKPaymentTransactions:transactions];

  //the rest of the code, consume transactions, etc
}
```
</TabItem>
</Tabs>

<img src="/ios-push-notifications-customizing-ios-sdk-4.webp" alt="InAppTrackingViewController.swift"/>

<LinkCard title="उदाहरण" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/In-Apps%20Tracking/InAppTrackingViewController.swift" />

### जियोज़ोन पुश नोटिफिकेशन्स

जियोज़ोन पुश नोटिफिकेशन्स एक अलग फ्रेमवर्क **PushwooshGeozones** में समाहित हैं।

1.  अपने प्रोजेक्ट में PushwooshGeozones.framework जोड़ें

    एक डिपेंडेंसी मैनेजर का उपयोग करके अपने प्रोजेक्ट में PushwooshGeozones.framework जोड़ने के लिए, अपनी `podfile` या `cartfile` में निम्नलिखित पंक्तियाँ डालें:

<Tabs>
  <TabItem value="podfile" label="Podfile">

  ```plaintext
  pod 'PushwooshXCFramework/Geozones'
  ```

  </TabItem>
  
  <TabItem value="carfile" label="Carfile">

  ```plaintext
  github "Pushwoosh/pushwoosh-ios-sdk"
  ```

  </TabItem>
  
  <TabItem value="swiftpm" label="SwiftPM">
  
  यदि आप **PushwooshGeozones.xcframework** का उपयोग करना चाहते हैं, तो निम्नलिखित पैकेज URL दर्ज करें:  
  [PushwooshGeozones-XCFramework](https://github.com/Pushwoosh/PushwooshGeozones-XCFramework)  

  </TabItem>
</Tabs>

वैकल्पिक रूप से, आप बस फ्रेमवर्क को अपने प्रोजेक्ट के **Build Phases** में **Link Binaries With Libraries** में खींच और छोड़ सकते हैं।

2.  अपनी Info.plist में निम्नलिखित कुंजियाँ जोड़ें:

*   **NSLocationWhenInUseUsageDescription** – *(आवश्यक)* ऐप के लिए जियोज़ोन को केवल फोरग्राउंड में चलते समय ट्रैक करने के लिए।
*   **NSLocationAlwaysAndWhenInUseUsageDescription** – *(आवश्यक)* ऐप के लिए जियोज़ोन को **फोरग्राउंड और बैकग्राउंड दोनों में** ट्रैक करने और एक अनुमति अनुरोध डायलॉग पॉप-अप दिखाने के लिए।
*   **NSLocationAlwaysUsageDescription** – *(वैकल्पिक)* ऐप के लिए जियोज़ोन को **हर समय** ट्रैक करने के लिए; यदि आपका ऐप iOS 10 और पहले के संस्करणों को लक्षित करता है तो इसका उपयोग किया जाना चाहिए।

```xml
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>for app to track Geozones in both conditions and to show a permission request dialog</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>for app to track Geozones only while running in the foreground</string>
```
![]()

<LinkCard title="Pushwoosh Info.plist उदाहरण" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Info.plist" />

3.  फ्रेमवर्क आयात करें

<Tabs>
  <TabItem value="swift" label="Swift">

  ```swift
  import PushwooshGeozones
  ```

  </TabItem>
  
  <TabItem value="objective-c" label="Objective-C">

  ```objc
  #import <PushwooshGeozones/PWGeozonesManager.h>
  ```

  </TabItem>
</Tabs>

4.  जियोज़ोन ट्रैकिंग शुरू करें

<Tabs>
  <TabItem value="swift" label="Swift">

  ```swift
  PWGeozonesManager.shared()?.startLocationTracking()
  ```

  [GitHub संदर्भ](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/Geozones%20Push%20Notification/GeozonesViewController.swift)

  </TabItem>
  
  <TabItem value="objective-c" label="Objective-C">

  ```objc
  [[PWGeozonesManager sharedManager] startLocationTracking];
  ```

  [GitHub संदर्भ](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Geozones%20Push%20Notification/PWGeozonesViewController.m)

  </TabItem>
</Tabs>

##### उदाहरण
<Tabs>
  <TabItem value="swift" label="Swift उदाहरण">

  ```swift
  override func viewDidLoad() {
      super.viewDidLoad()

      // Start Geozones tracking when needed
      PWGeozonesManager.shared().startLocationTracking()
  }
  ```

  </TabItem>
  
  <TabItem value="objective-c" label="Objective-C उदाहरण">

  ```objc
  - (void)viewDidLoad {
      [super viewDidLoad];
      // Do any additional setup after loading the view.

      // Start Geozones tracking when needed
      [[PWGeozonesManager sharedManager] startLocationTracking];
  }
  ```

  </TabItem>
</Tabs>

### एक रिच मीडिया कतार बनाना

यदि एक साथ कई रिच मीडिया पेज प्रदर्शित करने हों (उदाहरण के लिए, दो या दो से अधिक इन-ऐप्स के लिए ट्रिगर इवेंट एक ही समय में होते हैं, या एक रिच मीडिया पेज पहले से ही प्रदर्शित हो रहा है जब एक अलग ट्रिगर इवेंट होता है), तो आप रिच मीडिया पेजों के प्रदर्शन के लिए एक कतार सेट कर सकते हैं। एक कतार बनाने के लिए, नीचे वर्णित चरणों का पालन करें।

1.  एक क्लास बनाएँ जो PWRichMediaPresentingDelegate को लागू करती है:

```objective-c
@interface ChainedRichMediaPresentingDelegate () <PWRichMediaPresentingDelegate>

@property (nonatomic) NSMutableArray *queue;

@property (nonatomic) BOOL inAppIsPresenting;

@end


@implementation ChainedRichMediaPresentingDelegate

- (instancetype)init {
    self = [super init];

    if (self) {
        _queue = [NSMutableArray new];
    }

    return self;
}

- (BOOL)richMediaManager:(PWRichMediaManager *)richMediaManager shouldPresentRichMedia:(PWRichMedia *)richMedia {
    [_queue addObject:richMedia];
    return !_inAppIsPresenting;
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didPresentRichMedia:(PWRichMedia *)richMedia {
    _inAppIsPresenting = YES;
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didCloseRichMedia:(PWRichMedia *)richMedia {
    _inAppIsPresenting = NO;

    [_queue removeObject:richMedia];

    if (_queue.count) {
        [[PWRichMediaManager sharedManager] presentRichMedia:_queue.firstObject];
    }
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager presentingDidFailForRichMedia:(PWRichMedia *)richMedia withError:(NSError *)error {
    [self richMediaManager:richMediaManager didCloseRichMedia:richMedia];
}

@end
```

2\. डेलीगेट सेट करें:

```objective-c
 [PWRichMediaManager sharedManager].delegate = [ChainedRichMediaPresentingDelegate new];
```

<Tabs>
<TabItem label="Swift (GitHub)">
<LinkCard title="उदाहरण" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customizing/customizing/Rich%20Media%20Queue" />
</TabItem>

<TabItem label="Objective-C (GitHub)">
<LinkCard title="उदाहरण" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customizing/customizingObjC/customizingObjC/Rich%20Media%20Queue" />
</TabItem>
</Tabs>

### फोर्स टच के साथ एक रिच नोटिफिकेशन में भेजे गए वीडियो को ऑटोप्ले करें

एक वीडियो को [रिच नोटिफिकेशन अटैचमेंट](/hi/developer/pushwoosh-sdk/ios-sdk/ios-rich-notifications-integration/) के रूप में भेजे जाने पर, बिना किसी उपयोगकर्ता सहभागिता के नोटिफिकेशन के विस्तार पर ऑटोप्ले करने के लिए, नीचे दिए गए चरणों का पालन करें:

1.  अपने प्रोजेक्ट में नोटिफिकेशन कंटेंट एक्सटेंशन जोड़ें:

*   Xcode में, फ़ाइल > नया > लक्ष्य चुनें।
*   नोटिफिकेशन कंटेंट एक्सटेंशन चुनें।
*   इसे एक नाम दें और सेटअप पूरा करें।

<img src="/ios-push-notifications-customizing-ios-sdk-5.webp" alt="नोटिफिकेशन कंटेंट एक्सटेंशन - iOS रिच पुश नोटिफिकेशन"/>

यदि "एक्टिवेट स्कीम" संदेश के साथ संकेत दिया जाता है, तो कैंसिल चुनें।

<img
  src="/ios-push-notifications-customizing-ios-sdk-6.webp"
  alt="नोटिफिकेशन कंटेंट स्कीम को सक्रिय करें"
  style={{ display: "block", margin: "0 auto", maxWidth: "40%", height: "auto" }}
  width="400"
/>

2.  कंटेंट एक्सटेंशन में प्रॉपर्टीज़ और मेथड्स को निम्नानुसार समायोजित करें:

```
import UIKit
import UserNotifications
import UserNotificationsUI
import AVKit


class NotificationViewController: UIViewController, UNNotificationContentExtension {
    var playerController: AVPlayerViewController!
    @IBOutlet weak var playerBackgroundView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any required interface initialization here.
    }

    func didReceive(_ notification: UNNotification) {
        let attachment = notification.request.content.attachments.first

        playerController = AVPlayerViewController()
        // Set height programmatically
        // preferredContentSize.height = 250

        if let url = attachment?.url {
            setupVideoPlayer(url: url)
        } else {
            print("No valid URL...")
        }
    }

    private func setupVideoPlayer(url: URL) {
        guard let playerController = self.playerController else { return }
        let player = AVPlayer(url: url)
        playerController.player = player
        playerController.view.frame = self.playerBackgroundView.bounds
        playerBackgroundView.addSubview(playerController.view)
        addChild(playerController)
        playerController.didMove(toParent: self)
        player.play()
    }
```

3.  MainInterface.storyboard में एक UIView शामिल करें:

<img src="/ios-push-notifications-customizing-ios-sdk-7.webp" alt="MainInterface.storyboard में UIView"/>

4.  playerBackgroundView IBOutlet को आपके द्वारा अभी जोड़े गए UIView से लिंक करें:

<img src="/ios-push-notifications-customizing-ios-sdk-8.webp" alt="playerBackgroundView IBOutlet को UIView से लिंक करें"/>

5.  info.plist फ़ाइल को निम्नलिखित प्रविष्टि के साथ अपडेट करें:

```
UNNotificationExtensionUserInteractionEnabled = true
```

<img src="/ios-push-notifications-customizing-ios-sdk-9.webp" alt="UNNotificationExtensionUserInteractionEnabled = true"/>

अपने नोटिफिकेशन में एक वीडियो संलग्न करने के लिए, कंट्रोल पैनल में मीडिया अटैचमेंट फ़ील्ड में एक वीडियो का URL इनपुट करें:

<img src="/ios-push-notifications-customizing-ios-sdk-10.webp" alt="Pushwoosh कंट्रोल पैनल में मीडिया अटैचमेंट फ़ील्ड में वीडियो का URL"/>

API [/createMessage](/hi/developer/api-reference/messages-api#createmessage) अनुरोध के माध्यम से एक नोटिफिकेशन भेजते समय, URL को "ios\_attachment" पैरामीटर में शामिल करें और सुनिश्चित करें कि "mutable-content" फ़्लैग \`1\` पर सेट है।

<Aside type="note">
ऑटोप्ले सुविधा का परीक्षण करने के लिए, आप निम्नलिखित नमूना वीडियो का उपयोग कर सकते हैं: [हैलो वर्ल्ड नमूना वीडियो](https://docs-assets.developer.apple.com/published/efa8e7a0a97cfab20bf0f4c307b9b121/Hello-World-overview.mp4)।
</Aside>

<video src="/ios-push-notifications-customizing-ios-sdk-11.webm" title="हैलो वर्ल्ड नमूना वीडियो" autoplay loop muted playsinline />

### कस्टम पुश साउंड

पुश नोटिफिकेशन प्राप्त होने पर एक कस्टम ध्वनि चलाने के लिए, पहले ऑडियो फ़ाइल को अपने प्रोजेक्ट के रूट फ़ोल्डर में रखें।

<img
  src="/ios-push-notifications-customizing-ios-sdk-12.webp"
  alt=""
  style={{ display: "block", margin: "0 auto", maxWidth: "40%", height: "auto" }}
  width="400"
/>

फिर, पुश पैरामीटर्स में साउंड फ़ाइल का नाम निर्दिष्ट करें - अपने संदेश की [iOS-विशिष्ट सेटिंग्स](/hi/product/messaging-channels/push-notifications/send-push-notifications/one-time-push#ios) के साउंड फ़ील्ड को भरें या [createMessage API अनुरोध](/hi/developer/api-reference/messages-api/) के "ios\_sound" पैरामीटर के मान के रूप में फ़ाइल का नाम निर्दिष्ट करें।

कस्टम iOS साउंड के लिए ऑडियो फ़ाइल निम्नलिखित प्रारूपों में से एक में होनी चाहिए: **.aif**, **.caf**, **.wav**। **फ़ाइल के नाम में प्रारूप निर्दिष्ट करना सुनिश्चित करें; अन्यथा, इसे Pushwoosh iOS SDK द्वारा अनदेखा कर दिया जाएगा।**

<Aside type="tip">
अपने बंडल में साउंड फ़ाइल जोड़ते समय बंडल आकार पर ऐप स्टोर की सीमाओं पर विचार करें।
</Aside>

### iOS प्रोविजनल पुश

<Aside>
iOS 12 और बाद के संस्करणों पर समर्थित।
</Aside>

#### यह कैसे काम करता है

प्रोविजनल पुश नोटिफिकेशन्स उपयोगकर्ता के नोटिफिकेशन सेंटर में चुपचाप दिखाई देते हैं लेकिन लॉक स्क्रीन पर नहीं। इस प्रकार के पुश को उपयोगकर्ता द्वारा स्पष्ट रूप से अनुमति देने की आवश्यकता नहीं होती है: आप उन्हें भेजना शुरू कर सकते हैं जैसे ही कोई उपयोगकर्ता आपके ऐप को इंस्टॉल और लॉन्च करता है।

हालांकि, उपयोगकर्ता अभी भी आपके प्रमुख पुश नोटिफिकेशन्स की सदस्यता ले सकते हैं: प्रोविजनल पुश खोलने पर, उनके पास अपने अनुभव को चुनने के लिए दो विकल्प होते हैं - पुश को बिना अलर्ट और साउंड के नोटिफिकेशन सेंटर में रखना या आपको प्रमुख रूप से पुश भेजने की अनुमति देना ताकि वे लॉक स्क्रीन पर दिखाई दें।

प्रोविजनल पुश को उपयोगकर्ताओं को यह सूचित निर्णय लेने देने के लिए डिज़ाइन किया गया है कि क्या वे आपके ऐप से नोटिफिकेशन्स प्राप्त करना चाहेंगे। चूंकि APN मूल सदस्यता अनुरोध उपयोगकर्ताओं को केवल एक बार दिखाया जाता है और बाद में सदस्यता लेने के लिए, उन्हें अपने फोन की सिस्टम सेटिंग्स में जाना चाहिए, और कुछ उपयोगकर्ता सदस्यता नहीं ले सकते हैं क्योंकि उन्हें यह नहीं पता होता है कि आपके पुश से उन्हें क्या मूल्य मिलता है। प्रोविजनल पुश उपयोगकर्ताओं को यह समझ देते हैं: वे देख सकते हैं कि आप पुश नोटिफिकेशन्स में कौन सी सामग्री वितरित करते हैं और यह तय कर सकते हैं कि क्या उन्हें इस सामग्री के बारे में प्रमुख रूप से सूचित करने की आवश्यकता है।

<Aside type="caution" title="महत्वपूर्ण">
कृपया ध्यान दें कि प्रोविजनल पुश, जब लागू किए जाते हैं, तो मूल APN प्रॉम्प्ट को प्रतिस्थापित कर देते हैं, जिसका अर्थ है कि उपयोगकर्ता प्रमुख नोटिफिकेशन्स की सदस्यता तब तक नहीं ले सकते जब तक वे अपना नोटिफिकेशन सेंटर नहीं खोलते और प्रोविजनल पुश को प्रमुख के रूप में प्राप्त करने का विकल्प नहीं चुनते।
</Aside>

#### कैसे लागू करें

1\. [गाइड](/hi/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/quick-start/) का पालन करके Pushwoosh iOS SDK को एकीकृत करें।

2\. `registerForPushNotifications()` मेथड को कॉल करने से पहले अपने प्रोजेक्ट के AppDelegate में निम्नलिखित स्ट्रिंग जोड़ें:

<Tabs>
<TabItem label="Swift">
```swift
if #available(iOS 12.0, *) {
    Pushwoosh.sharedInstance().additionalAuthorizationOptions = UNAuthorizationOptions.provisional
}
```

<LinkCard title="उदाहरण" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/provisionalpush/provisionalpush/AppDelegate/AppDelegate.swift" />
</TabItem>

<TabItem label="Objective-C">
```objective-c
if (@available(iOS 12.0, *)) {
	[Pushwoosh sharedInstance].additionalAuthorizationOptions = UNAuthorizationOptionProvisional;
}
```

<LinkCard title="उदाहरण" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/provisionalpush/provisionalpushObjC/provisionalpushObjC/AppDelegate/AppDelegate.m" />
</TabItem>
</Tabs>

बस इतना ही! ऐप उपयोगकर्ता ऐप इंस्टॉल करते ही सीधे अपने नोटिफिकेशन सेंटर में संदेश प्राप्त करेंगे।

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

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