# iOS SDK में फ़ीचर फ़्लैग

`Pushwoosh.configure.featureFlags` आपके iOS ऐप को वे [फ़ीचर फ़्लैग](/hi/product/audience-data-and-segmentation/feature-flags/) देता है जो कंट्रोल पैनल में एप्लिकेशन के लिए कॉन्फ़िगर किए गए हैं। Pushwoosh वर्तमान डिवाइस और उपयोगकर्ता के लिए सर्वर पर फ़्लैग नियमों का मूल्यांकन करता है, और SDK परिणाम लौटाता है: क्या इस डिवाइस के लिए फ़्लैग चालू है और कौन-से प्रॉपर्टी मान लागू होते हैं।

<Aside type="tip" title="बीटा फ़ीचर">
फ़ीचर फ़्लैग बीटा में हैं और केवल उन्हीं प्लान पर उपलब्ध हैं जिनमें वे शामिल हैं। अन्य प्लान पर सर्वर कोई फ़्लैग नहीं लौटाता, इसलिए हर फ़्लैग उस डिफ़ॉल्ट मान पर लौट आता है जो आप कोड में पास करते हैं।
</Aside>

## पूर्वापेक्षाएँ

* Pushwoosh iOS SDK 7.2.10 या उसके बाद का संस्करण, जिसे [iOS SDK का अवलोकन](/hi/developer/pushwoosh-sdk/ios-sdk/) में बताए अनुसार इंटीग्रेट किया गया हो। फ़ीचर फ़्लैग आवश्यक `PushwooshFramework` और `PushwooshCore` मॉड्यूल में शामिल हैं, इसलिए आपको कोई अन्य मॉड्यूल जोड़ने की ज़रूरत नहीं है। वे स्वयं iOS ऐप में काम करते हैं। ऐप एक्सटेंशन, जैसे Notification Service Extension, कभी फ़्लैग का अनुरोध नहीं करते।
* **Audience** → **Feature Flags** में बनाया गया कम से कम एक फ़्लैग। आपको उसकी **Key** और उसकी प्रॉपर्टी की कुंजियाँ और प्रकार चाहिए। कुंजियों का उपयोग ठीक वैसे ही करें जैसे वे वहाँ दिखाई देती हैं, अक्षरों के केस सहित। उदाहरण के लिए, `get("New_Checkout")` को `new_checkout` कुंजी वाला फ़्लैग नहीं मिलता।
* यदि ऐप SDK अनुरोध किसी रिवर्स प्रॉक्सी के माध्यम से भेजता है, तो उसका URL `json/1.3/` पर समाप्त होना चाहिए। अन्यथा SDK फ़्लैग का अनुरोध नहीं करता, और हर फ़्लैग आपके डिफ़ॉल्ट मान पर लौट आता है।

## फ़्लैग पढ़ें

हमेशा एक डिफ़ॉल्ट मान पास करें। यह तब तक लागू होता है जब तक SDK के पास डिवाइस के लिए फ़्लैग नहीं होते, और तब भी जब फ़्लैग मौजूद नहीं है, आर्काइव किया गया है, या प्लान में फ़ीचर फ़्लैग शामिल नहीं हैं।

```swift
import PushwooshFramework

let flags = Pushwoosh.configure.featureFlags

if let checkout = flags.get("new_checkout"), checkout.isEnabled {
    showNewCheckout(
        buttonColor: checkout.string(forProperty: "button_color", default: "blue") ?? "blue",
        maxItems: Int(checkout.number(forProperty: "max_items", default: 3))
    )
} else {
    showOldCheckout()
}
```

केवल यह जाँचने के लिए कि फ़्लैग चालू है या नहीं, `isEnabled` का उपयोग करें:

```swift
let isNewCheckout = Pushwoosh.configure.featureFlags.isEnabled("new_checkout", default: false)
```

Objective-C में `[PushwooshConfig featureFlags]` कॉल करें।

## फ़्लैग क्या लौटाता है

`get(_:)` एक `PWFeatureFlag` ऑब्जेक्ट लौटाता है, या `nil` तब लौटाता है जब SDK के पास अभी डिवाइस के लिए फ़्लैग नहीं हैं या फ़्लैग उत्तर में नहीं है। आर्काइव किया गया फ़्लैग उत्तर में नहीं होता। `get` केवल संग्रहीत फ़्लैग पढ़ता है और कभी नेटवर्क की प्रतीक्षा नहीं करता। ऑब्जेक्ट में ये प्रॉपर्टी होती हैं:

| प्रॉपर्टी | प्रकार | विवरण |
| :---- | :---- | :---- |
| `key` | String | फ़्लैग कुंजी। |
| `isEnabled` | Bool | क्या इस डिवाइस के लिए फ़्लैग चालू है। |
| `ruleId` | String | वह नियम जिसने परिणाम तय किया, उदाहरण के लिए `r_1a2b3c4d`। जब कोई नियम डिवाइस से मेल नहीं खाता तो `default`, और जब फ़्लैग किल (kill) किया गया हो तो खाली स्ट्रिंग। |

प्रॉपर्टी के प्रकार से मेल खाने वाले मेथड से प्रॉपर्टी मान पढ़ें। जब फ़्लैग बंद होता है, तो प्रॉपर्टी में कंट्रोल पैनल में सेट किए गए डिफ़ॉल्ट मान होते हैं।

| मेथड | लौटाता है |
| :---- | :---- |
| `string(forProperty:default:)` | **String** प्रॉपर्टी का मान, या आपका डिफ़ॉल्ट मान। |
| `number(forProperty:default:)` | **Number** प्रॉपर्टी का मान `Double` के रूप में, या आपका डिफ़ॉल्ट मान। |
| `bool(forProperty:default:)` | **Boolean** प्रॉपर्टी का मान, या आपका डिफ़ॉल्ट मान। |
| `jsonObject(forProperty:)` | ऑब्जेक्ट रखने वाली **JSON** प्रॉपर्टी का मान, डिक्शनरी के रूप में, या `nil`। |
| `jsonArray(forProperty:)` | ऐरे रखने वाली **JSON** प्रॉपर्टी का मान, या `nil`। |

जब प्रॉपर्टी मौजूद नहीं होती या उसमें किसी अन्य प्रकार का मान होता है, तो हर मेथड आपका डिफ़ॉल्ट मान लौटाता है, और JSON मेथड `nil` लौटाते हैं।

जब `get(_:)` `nil` लौटाता है, तो `isEnabled(_:default:)` डिफ़ॉल्ट मान लौटाता है।

<span id="keep-flags-up-to-date" />

## फ़्लैग को अप-टू-डेट रखें

SDK अंतिम उत्तर को डिवाइस पर अधिकतम 24 घंटे तक संग्रहीत करता है। संग्रहीत फ़्लैग केवल उसी User ID और ऐप के उसी Application Code के लिए मान्य होते हैं जिनके लिए उनका अनुरोध किया गया था। SDK उन्हें रीफ़्रेश करता है:

* जब कोई सत्र शुरू होता है, यानी जब ऐप पहली बार सक्रिय होता है या बैकग्राउंड में कम से कम 30 मिनट रहने के बाद;
* जब तक ऐप फ़ोरग्राउंड में है, हर घंटे;
* डिवाइस के पुश नोटिफिकेशन के लिए रजिस्टर होने के बाद, यदि पिछला अनुरोध रजिस्ट्रेशन से पहले भेजा गया था;
* `setUserId` से User ID बदलने के ठीक बाद। पिछले उपयोगकर्ता के संग्रहीत फ़्लैग हटा दिए जाते हैं, इसलिए नया उपयोगकर्ता उन्हें कभी नहीं देखता।

नए मानों पर प्रतिक्रिया देने के लिए, `PWFeatureFlagsUpdateListener` अपनाने वाला एक listener जोड़ें। किसी फ़्लैग को बदलने वाले रीफ़्रेश के बाद उसका `featureFlagsDidUpdate()` मुख्य थ्रेड पर कॉल किया जाता है। SDK listener को कमज़ोर (weak) रेफ़रेंस से रखता है। अपने listener का एक मज़बूत (strong) रेफ़रेंस रखें, नहीं तो वह रिलीज़ हो जाएगा और कभी कॉल नहीं होगा:

```swift
final class CheckoutViewController: UIViewController, PWFeatureFlagsUpdateListener {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        Pushwoosh.configure.featureFlags.addUpdateListener(self)
    }

    override func viewWillDisappear(_ animated: Bool) {
        Pushwoosh.configure.featureFlags.removeUpdateListener(self)
        super.viewWillDisappear(animated)
    }

    func featureFlagsDidUpdate() {
        render()
    }
}
```

फ़्लैग का अनुरोध स्वयं करने के लिए, उदाहरण के लिए किसी ऐसी कार्रवाई के बाद जो उपयोगकर्ता को किसी अलग सेगमेंट में ले जा सकती है, `refresh(completion:)` कॉल करें। जब तक संग्रहीत फ़्लैग मान्य हैं, यह हर 5 मिनट में अधिकतम एक अनुरोध भेजता है और उस अवधि के भीतर संग्रहीत फ़्लैग से उत्तर देता है। completion मुख्य थ्रेड पर चलता है:

```swift
Pushwoosh.configure.featureFlags.refresh { error in
    if let error = error as NSError? {
        let status = error.code
        // the stored flags, or your defaults, stay in effect
    }
    render()
}
```

विफलता पर, error का डोमेन `PWFeatureFlagsErrorDomain` होता है, और उसका `code` HTTP स्टेटस होता है। जब अनुरोध को कोई HTTP उत्तर नहीं मिला या वह भेजा नहीं गया, तो कोड `0` होता है, और जब सर्वर ने उत्तर दिया लेकिन उत्तर का उपयोग नहीं किया जा सका, तो `200` होता है।

5 मिनट की सीमा के बिना रीफ़्रेश का परीक्षण करने के लिए, `Info.plist` में Boolean कुंजी `Pushwoosh_FEATURE_FLAGS_DISABLE_THROTTLE` को `YES` पर सेट करें।

यदि Pushwoosh समय पर डिवाइस के सेगमेंट का मिलान नहीं कर पाता, तो वह आंशिक उत्तर लौटाता है। SDK इसे डिवाइस पर संग्रहीत नहीं करता, और अगला रीफ़्रेश पूरा उत्तर लाता है।

जब कंट्रोल पैनल में किसी फ़्लैग को किल (kill) किया जाता है, तो डिवाइस को अगले रीफ़्रेश पर वह डिफ़ॉल्ट प्रॉपर्टी मानों के साथ बंद मिलता है। जब SDK सर्वर तक नहीं पहुँच पाता, तो वह संग्रहीत फ़्लैग का उपयोग तब तक जारी रखता है जब तक वे 24 घंटे पुराने न हो जाएँ, और उसके बाद आपके डिफ़ॉल्ट मानों का।

<span id="log-impressions" />

## इम्प्रेशन लॉग करें

इम्प्रेशन Pushwoosh को बताता है कि उपयोगकर्ता वास्तव में उस कोड तक पहुँचा जिसे फ़्लैग नियंत्रित करता है, ताकि आप फ़ीचर पाने वाले उपयोगकर्ताओं की तुलना उनसे कर सकें जिन्हें फ़ीचर नहीं मिला। `logImpression(_:)` को उसी क्षण कॉल करें जब उपयोगकर्ता फ़ीचर या उसका पुराना संस्करण देखता है, चालू और बंद दोनों ब्रांच के लिए, क्योंकि फ़्लैग बंद वाले उपयोगकर्ता आपका तुलना समूह हैं:

```swift
let flags = Pushwoosh.configure.featureFlags
let isOn = flags.isEnabled("new_checkout", default: false)
flags.logImpression("new_checkout")
if isOn {
    showNewCheckout()
} else {
    showOldCheckout()
}
```

SDK इन एट्रिब्यूट के साथ `PW_FeatureFlagImpression` इवेंट भेजता है:

| एट्रिब्यूट | प्रकार | मान |
| :---- | :---- | :---- |
| `flag_key` | string | फ़्लैग कुंजी। |
| `rule_id` | string | वह नियम जिसने परिणाम तय किया, जैसा `ruleId` में है। |
| `enabled` | boolean | क्या फ़्लैग चालू था। |

आपको इवेंट पहले से बनाने की ज़रूरत नहीं है, क्योंकि पहला इम्प्रेशन आने पर Pushwoosh इन एट्रिब्यूट के साथ `PW_FeatureFlagImpression` को **Audience** → **Events** में जोड़ देता है। SDK एक सत्र में हर फ़्लैग, नियम और स्थिति के लिए एक इम्प्रेशन भेजता है, और जब कुंजी के लिए कोई फ़्लैग नहीं होता तो कुछ नहीं भेजता। यदि भेजना विफल हो जाता है, तो फ़्लैग के लिए अगली `logImpression` कॉल उसे फिर से भेजती है।

इम्प्रेशन मार्केटर्स को उन उपयोगकर्ताओं का सेगमेंट बनाने की सुविधा भी देते हैं जो फ़ीचर तक पहुँचे: [फ़ीचर फ़्लैग शर्त](/hi/product/audience-data-and-segmentation/feature-flags/#find-users-who-reached-a-feature) की **फ़ीचर देखा (30 दिन)** स्थिति।

## मेथड संदर्भ

`Pushwoosh.configure.featureFlags` में ये मेथड हैं:

| मेथड | विवरण |
| :---- | :---- |
| `get(_:)` | कुंजी के लिए `PWFeatureFlag` या `nil` लौटाता है। केवल संग्रहीत फ़्लैग पढ़ता है। |
| `isEnabled(_:default:)` | लौटाता है कि फ़्लैग चालू है या नहीं, या फ़्लैग न होने पर डिफ़ॉल्ट मान। |
| `refresh(completion:)` | फ़्लैग का अनुरोध करता है, जब तक संग्रहीत फ़्लैग मान्य हैं तब तक हर 5 मिनट में एक बार तक सीमित। completion को `nil` या `PWFeatureFlagsErrorDomain` में एक error मिलता है, और completion `nil` हो सकता है। |
| `addUpdateListener(_:)` | किसी फ़्लैग को बदलने वाले हर रीफ़्रेश के बाद listener का `featureFlagsDidUpdate()` कॉल करता है। listener को कमज़ोर रेफ़रेंस से रखा जाता है। |
| `removeUpdateListener(_:)` | `addUpdateListener(_:)` से जोड़े गए listener को हटाता है। |
| `logImpression(_:)` | फ़्लैग के वर्तमान नियम और स्थिति के लिए `PW_FeatureFlagImpression` इवेंट भेजता है। |