एक महत्वपूर्ण जाल जिसका मैंने आज में दोहन किया वह निम्नलिखित है:
कई परियोजनाओं में मैंने एक एकल लक्ष्य को देखा और उस लक्ष्य के प्रत्येक विन्यास के लिए अलग-अलग बंडल पहचानकर्ताओं के साथ सेट किया। यहां चीजें गड़बड़ हो जाती हैं। डेवलपर्स का इरादा क्या था डिबग कॉन्फिग के लिए डिबग ऐप और रिलीज़ टारगेट के लिए प्रोडक्शन ऐप।
यदि आप ऐसा करते हैं, तो दोनों ऐप्स समान NSUserDefaults को साझा करेंगे, जब वे इस तरह सेट होते हैं
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
इसके कारण कई स्थानों पर समस्याएँ होती हैं:
- कल्पना करें कि जब आप उपयोगकर्ता के लिए एक विशेष ऐप-इंट्रो-स्क्रीन दिखाए गए हैं, तो आप एक कुंजी के लिए हां सेट करते हैं। अन्य ऐप अब YES भी पढ़ेंगे और परिचय नहीं दिखाएंगे।
- हां कुछ ऐप अपने यूजर डिफॉल्ट में भी oAuth टोकन स्टोर करते हैं। वैसे भी ... कार्यान्वयन के आधार पर, ऐप यह पहचान लेगा कि एक टोकन है और गलत टोकन का उपयोग करके डेटा पुनर्प्राप्त करना शुरू करें। मौका अधिक है कि यह अजीब त्रुटियों के साथ विफल हो जाएगा।
सामान्य रूप से इस समस्या का समाधान वर्तमान में बनाए गए कॉन्फ़िगरेशन के साथ डिफ़ॉल्ट कुंजियों को उपसर्ग करना है। आप अपने कॉन्फ़िगरेशन के लिए अलग-अलग बंडल आइडेंटिफ़ायर सेट करके रनटाइम पर कॉन्फ़िगरेशन का आसानी से पता लगा सकते हैं। तो बस बंडल पहचानकर्ता से पढ़ें NSBundle.mainBundle()
। यदि आपके पास एक ही बंडल पहचानकर्ता है, तो आपको अलग-अलग प्रीप्रोसेसर मैक्रोज़ सेट करने की आवश्यकता है
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
स्विफ्ट में यह लगभग समान दिखाई देगा:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif