# iOS पुश प्राइमर

एक पुश प्राइमर एक सॉफ्ट ऑप्ट-इन डायलॉग है जिसे आप iOS सिस्टम पुश अनुमति प्रॉम्प्ट से **पहले** दिखाते हैं। iOS सिस्टम प्रॉम्प्ट को प्रति इंस्टॉल केवल एक बार दिखाता है — यदि उपयोगकर्ता **Don't Allow** पर टैप करता है, तो पुश तब तक खो जाता है जब तक कि वे इसे सेटिंग्स में फिर से सक्षम नहीं कर देते। प्राइमर आपको पहले मूल्य समझाने और सही समय पर पूछने की सुविधा देता है, ताकि आप एक-बार मिलने वाले सिस्टम प्रॉम्प्ट को उन उपयोगकर्ताओं पर खर्च करें जिन्होंने पहले ही हाँ कह दिया है।

संस्करण 7.1.1 से उपलब्ध है। प्राइमर `PushwooshFramework` का हिस्सा है; किसी अतिरिक्त मॉड्यूल की आवश्यकता नहीं है।

<figure style={{ textAlign: "center" }}>
  <img
    src="/ios-push-primer-1.webp"
    alt="सिस्टम अनुमति प्रॉम्प्ट से पहले दिखाया गया पुश प्राइमर डायलॉग"
    style={{ display: "block", margin: "0 auto", maxWidth: "300px", height: "auto" }}
    width="300"
  />
  <figcaption>iOS सिस्टम अनुमति प्रॉम्प्ट से पहले दिखाया गया पुश प्राइमर</figcaption>
</figure>

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

प्राइमर पूरी तरह से स्टेट-अवेयर है। यह वर्तमान नोटिफिकेशन प्राधिकरण स्थिति को पढ़ता है और तय करता है कि क्या करना है, इसलिए इसे हर लॉन्च पर कॉल करना सुरक्षित है:

- **Not determined** — प्राइमर दिखाता है; स्वीकार करने पर यह सिस्टम अनुमति प्रॉम्प्ट को ट्रिगर करता है।
- **Authorized or provisional** — चुपचाप प्राइमर को दबा देता है (कुछ भी नहीं दिखाया जाता है)।
- **Denied** — प्राइमर दिखाता है; स्वीकार करने पर यह उपयोगकर्ता को ऐप की नोटिफिकेशन सेटिंग्स पर भेजता है (जब `fallbackToSettings` सक्षम होता है)।

आप तय करते हैं कि प्राइमर को **कब** कॉल करना है (उदाहरण के लिए ऑनबोर्डिंग के बाद या किसी प्रमुख कार्रवाई के बाद)। SDK अपनी कोई टाइमिंग नहीं थोपता है, सिवाय नीचे वर्णित वैकल्पिक `minInterval` थ्रॉटल के।

## मूल उपयोग

प्राइमर को एक फ़्लूएंट बिल्डर के साथ कॉन्फ़िगर करें और `present` को कॉल करें। न्यूनतम सेटअप के लिए एक शीर्षक, एक संदेश और दो बटन शीर्षकों की आवश्यकता होती है।

<Tabs>
<TabItem label="Swift">
```swift
import PushwooshFramework

Pushwoosh.configure.pushPrimer
    .title("जानकारी से जुड़े रहें")
    .message("डील्स और ऑर्डर अपडेट के बारे में सबसे पहले सूचना पाएं")
    .acceptButton("नोटिफिकेशन सक्षम करें")
    .declineButton("अभी नहीं")
    .present()
```
</TabItem>
</Tabs>

<Aside type="note">
ऐप UI के स्क्रीन पर आने के बाद प्राइमर को कॉल करें (उदाहरण के लिए लॉन्च के कुछ समय बाद, या आपके फ्लो में एक सोचे-समझे कदम पर), ताकि यह आपके इंटरफ़ेस पर प्रस्तुत हो सके।
</Aside>

## स्टाइल और पोजीशन

सिस्टम अलर्ट और कस्टम शीट के बीच चयन करने के लिए `style` का उपयोग करें, और कस्टम शीट को रखने के लिए `position` का उपयोग करें। प्रत्येक स्थिति का अपना डिफ़ॉल्ट डिज़ाइन होता है।

| मान | विवरण |
|-------|-------------|
| `.alert` | सिस्टम `UIAlertController`। स्थिति को अनदेखा किया जाता है। |
| `.sheet` + `.bottom` | नीचे की शीट जो ऊपर की ओर स्लाइड होती है, जिसमें एक ग्रैबर और पूरी-चौड़ाई वाले बटन होते हैं (डिफ़ॉल्ट)। |
| `.sheet` + `.top` | कॉम्पैक्ट बैनर जो ऊपर से नीचे आता है, एक नोटिफिकेशन की तरह। |
| `.sheet` + `.center` | केंद्रित डायलॉग जो स्केल और फेड इन होता है। |

<Tabs>
<TabItem label="Swift">
```swift
Pushwoosh.configure.pushPrimer
    .style(.sheet)
    .position(.top)
    .title("जानकारी से जुड़े रहें")
    .message("डील्स और ऑर्डर अपडेट के बारे में सबसे पहले सूचना पाएं")
    .acceptButton("नोटिफिकेशन सक्षम करें")
    .declineButton("अभी नहीं")
    .present()
```
</TabItem>
</Tabs>

<img src="/ios-push-primer-positions.webp" alt="नीचे, ऊपर और केंद्र की स्थिति में पुश प्राइमर"/>

## अनुकूलन

सभी विज़ुअल सेटिंग्स वैकल्पिक हैं — लाइट और डार्क मोड के अनुकूल होने वाले नेटिव डिफ़ॉल्ट का उपयोग करने के लिए उन्हें छोड़ दें।

<Tabs>
<TabItem label="Swift">
```swift
Pushwoosh.configure.pushPrimer
    .style(.sheet)
    .position(.center)
    .title("जानकारी से जुड़े रहें")
    .message("डील्स और ऑर्डर अपडेट के बारे में सबसे पहले सूचना पाएं")
    .acceptButton("नोटिफिकेशन सक्षम करें")
    .declineButton("अभी नहीं")
    .image(UIImage(named: "PrimerHero"))          // स्थानीय छवि, या .imageURL("https://…")
    .backgroundColor(.systemBackground)
    .titleColor(.label)
    .messageColor(.secondaryLabel)
    .acceptButtonColor(.systemBlue)
    .acceptButtonTextColor(.white)
    .declineButtonColor(.clear)
    .declineButtonTextColor(.secondaryLabel)
    .cornerRadius(24)
    .buttonCornerRadius(14)
    .buttonBorderColor(.separator)
    .present()
```
</TabItem>
</Tabs>

अनुकूलन संदर्भ:

| सेटर | विवरण |
|--------|-------------|
| `image` / `imageURL` | एक स्थानीय `UIImage` या एक रिमोट URL। केंद्र और नीचे के लेआउट पर एक वृत्त के रूप में और शीर्ष बैनर पर आइकन के रूप में प्रस्तुत किया जाता है। एक स्थानीय छवि URL पर प्राथमिकता लेती है। |
| `backgroundColor` | कार्ड का ठोस पृष्ठभूमि रंग। |
| `backgroundGradient` | रंगों की एक सरणी जिसे एक नरम बहुरंगी ग्रेडिएंट के रूप में प्रस्तुत किया जाता है। `backgroundColor` को ओवरराइड करता है। |
| `titleColor` / `messageColor` | शीर्षक और संदेश टेक्स्ट के रंग। |
| `acceptButtonColor` / `acceptButtonTextColor` | स्वीकार बटन की पृष्ठभूमि और टेक्स्ट के रंग। स्वीकार रंग डिफ़ॉल्ट आइकन को भी टिंट करता है। |
| `declineButtonColor` / `declineButtonTextColor` | अस्वीकार बटन की पृष्ठभूमि और टेक्स्ट के रंग। |
| `cornerRadius` | कार्ड का कॉर्नर रेडियस। |
| `buttonCornerRadius` / `buttonBorderColor` | दोनों बटनों का कॉर्नर रेडियस और बॉर्डर का रंग। |

<Aside type="note">
प्राइमर ठीक वही स्ट्रिंग्स दिखाता है जो आप पास करते हैं। कई भाषाओं के लिए, स्थानीयकृत स्ट्रिंग्स पास करें (उदाहरण के लिए `NSLocalizedString` के साथ)।
</Aside>

## व्यवहार सेटिंग्स

### सेटिंग्स फॉलबैक

डिफ़ॉल्ट रूप से, जब नोटिफिकेशन पहले से ही अस्वीकृत होते हैं तो प्राइमर दिखाया जाता है और स्वीकार बटन उपयोगकर्ता को ऐप की नोटिफिकेशन सेटिंग्स पर ले जाता है। इसके बजाय अस्वीकृत स्थिति में प्राइमर को पूरी तरह से दबाने के लिए `false` पास करें।

```swift
.fallbackToSettings(false)
```

### प्रदर्शन आवृत्ति

डिफ़ॉल्ट रूप से प्राइमर में कोई अंतर्निहित थ्रॉटलिंग नहीं है — यह जब भी आप `present` को कॉल करते हैं तो दिखाई देता है (और नोटिफिकेशन अधिकृत होने के बाद स्वतः-दबा दिया जाता है)। प्राइमर कितनी बार फिर से दिखाई देता है, इसे सीमित करने के लिए `minInterval` का उपयोग करें। अंतिम बार दिखाए जाने का समय लॉन्च के दौरान बना रहता है।

```swift
.minInterval(7 * 24 * 60 * 60)   // सप्ताह में अधिकतम एक बार दिखाएं
```

## परिणाम को संभालना

परिणाम पर प्रतिक्रिया करने के लिए `present` को एक कंप्लीशन पास करें।

<Tabs>
<TabItem label="Swift">
```swift
Pushwoosh.configure.pushPrimer
    .title("जानकारी से जुड़े रहें")
    .message("डील्स और ऑर्डर अपडेट के बारे में सबसे पहले सूचना पाएं")
    .acceptButton("नोटिफिकेशन सक्षम करें")
    .declineButton("अभी नहीं")
    .present { outcome in
        switch outcome {
        case .accepted:            break   // दिखाया गया, उपयोगकर्ता ने स्वीकार किया, सिस्टम प्रॉम्प्ट का अनुरोध किया गया
        case .declined:            break   // दिखाया गया, उपयोगकर्ता ने अस्वीकार कर दिया
        case .suppressed:          break   // नहीं दिखाया गया (पहले से अधिकृत, या थ्रॉटल किया गया)
        case .redirectedToSettings: break  // अस्वीकृत स्थिति, उपयोगकर्ता को सेटिंग्स में भेजा गया
        @unknown default:          break
        }
    }
```
</TabItem>
</Tabs>

अंतिम सिस्टम-प्रॉम्प्ट परिणाम (अनुदानित/अस्वीकृत स्थिति और डिवाइस टोकन) नियमित पंजीकरण कॉलबैक के माध्यम से आता है — प्राइमर स्वीकार करने पर `registerForPushNotifications` का पुन: उपयोग करता है और उस श्रृंखला को डुप्लिकेट नहीं करता है।

## संदर्भ

<CardGrid>
  <LinkCard
    title="iOS SDK API संदर्भ"
    description="सभी सार्वजनिक क्लास, मेथड और प्रॉपर्टी को कवर करने वाला संपूर्ण तकनीकी दस्तावेज़।"
    href="https://pushwoosh.github.io/pushwoosh-ios-sdk/"
  />
  <LinkCard
    title="iOS SDK को अनुकूलित करना"
    description="Pushwoosh iOS SDK को अपने ऐप के अनुरूप बनाने के अन्य तरीके।"
    href="/developer/pushwoosh-sdk/ios-sdk/customizing-ios-sdk/"
  />
</CardGrid>