स्विफ्ट: एपीआई कुंजियों को लागू करने के लिए PREPROCESSOR झंडे (जैसे # # DEBUG`) का उपयोग कैसे करें?


95

में Objective-Cयह कभी कभी वैकल्पिक API कुंजियां (उदाहरण के लिए अंतर करने के लिए छोड़ दें और डीबग चाबियाँ के बीच विश्लेषण पैकेज के लिए, Mixpanel, घबराहट या Crashlytics) की तरह परिभाषित करने के लिए स्थिर स्ट्रिंग स्थिरांक उपयोग करने के लिए उपयोगी था:

#if DEBUG
static NSString *const API_KEY = @"KEY_A";
#else
static NSString *const API_KEY = @"KEY_B";
#endif

और फिर...

[Analytics startSession:API_KEY];

यह स्विफ्ट का अनुवाद कैसे करता है, क्योंकि स्विफ्ट कंपाइलर अब प्रीप्रोसेसर का उपयोग नहीं करता है?

जवाबों:


161

ऐप्पल ने Xcode 8 के रूप में स्विफ्ट प्रीप्रोसेसर झंडे के लिए पूर्ण समर्थन शामिल किया , इसलिए अब इन मूल्यों को "अन्य स्विफ्ट फ्लैग" में सेट करना आवश्यक नहीं है।

नई सेटिंग को "सक्रिय संकलन शर्तें" कहा जाता है, जो प्रीप्रोसेसर झंडे के बराबर स्विफ्ट के लिए शीर्ष-स्तरीय समर्थन प्रदान करता है। आप इसे उसी तरह से उपयोग करते हैं जैसे आप "अन्य स्विफ्ट फ्लैग" करेंगे, इसके अलावा "-D" (इसलिए यह बस थोड़ा क्लीनर है) के साथ मूल्य को पूर्व निर्धारित करने की आवश्यकता नहीं है।

से Xcode 8 रिलीज नोट्स :

Active Compilation Conditionsस्विफ्ट कंपाइलर में सशर्त संकलन झंडे को पारित करने के लिए एक नई बिल्ड सेटिंग है। इस सेटिंग के मूल्य का प्रत्येक तत्व -डी के साथ उपसर्ग करने के लिए तेजी से गुजरता है , उसी तरह जिस तरह से Preprocessor Macrosपास के तत्व एक ही उपसर्ग के साथ उलझते हैं । (22457329)

यहां छवि विवरण दर्ज करें

आप उपरोक्त सेटिंग का उपयोग करते हैं जैसे:

#if DEBUG
    let accessToken = "DebugAccessToken"
#else
    let accessToken = "ProductionAccessToken"
#endif

2
नोट: आपको = 1 या कोई अन्य = मान निर्दिष्ट नहीं करना चाहिए । बल्कि, आपको केवल ध्वज नाम निर्दिष्ट करने की आवश्यकता है। :]
जेआरजी-डेवलपर

@ JRG- डेवलपर मैं असहमत नहीं हूं, लेकिन मुझे यकीन नहीं है कि आपकी टिप्पणी यहां कैसे लागू होती है।
डैन लोवेनहर्ज़

9
यह एक उपयोगी उत्तर है, लेकिन ऑब्जेक्टिव-सी पृष्ठभूमि से आ रहा है (जैसा कि मुझे लगता है कि कई आईओएस डेवलपर्स हैं), मैंने मान लिया था कि मुझे निर्दिष्ट करने की आवश्यकता है =1... मैंने यह जानने की कोशिश करने में थोड़ा समय खो दिया कि यह क्यों काम नहीं कर रहा था जब मैंने किया। इसलिए, मैंने सोचा कि मैं अगले साथी की मदद करने के लिए इस tidbit को साझा करूंगा। :] वैसे भी, यहाँ आपके उत्तर के लिए धन्यवाद!
JRG- डेवलपर

1
@ जेआरजी-डेवलपर, @Dan Loewenherz मैं दोनों की स्थापना की है DEBUGमें Active Compilation Conditionsऔर DEBUG=1में Preprocessor Macrosऔर इस विन्यास सब पर काम नहीं करता। क्या मुझे निकालना चाहिए DEBUG=1?? उपरोक्त टिप्पणियों से स्पष्ट नहीं है।
भाविन_म ६

2
@DanLoewenherz आप बिल्कुल सही हैं। मैंने अपनी लक्ष्य सेटिंग में संग्रह कॉन्फ़िगरेशन के लिए "DEBUG" सेट किया था, इसलिए हर बार यह डिबग स्टेटमेंट चलाता है और कभी भी रिलीज़ स्थिति नहीं चलाता है। जो कोई भी समस्या का सामना कर रहा है, तो कृपया पहले लक्ष्य की जांच करें Build Configuration। अधिक जानकारी के लिए इस उत्तर stackoverflow.com/questions/9063100/… की जाँच करें ।
भाविन_म

131

अद्यतन: Xcode 8 अब स्वचालित रूप से इसका समर्थन करता है, ऊपर @ DanLoewenherz की प्रतिक्रिया देखें।

Xcode 8 से पहले, आप अभी भी उसी तरह मैक्रोज़ का उपयोग कर सकते हैं:

#if DEBUG
let apiKey = "KEY_A"
#else
let apiKey = "KEY_B"
#endif

हालाँकि, स्विफ्ट द्वारा उन्हें लेने के लिए, आपको अपने लक्ष्य की बिल्ड सेटिंग्स में "अन्य स्विफ्ट फ्लैग" सेट करने की आवश्यकता है:

  • अपने लक्ष्य के लिए बिल्ड सेटिंग्स खोलें
  • "अन्य स्विफ्ट फ्लैग" के लिए खोजें
  • उस मैक्रोज़ को जोड़ें जिसे आप उपयोग करना चाहते हैं, -Dझंडे से पहले

यहां छवि विवरण दर्ज करें


आपने मेरा दिन बना दिया! मेरे लिए यह बिना काम नहीं किया -Dउपसर्ग
nomnom

5

अनुवर्ती अवलोकन के रूप में, रिपॉजिटरी में प्लेटेक्स्ट में एपी कीज / सीक्रेट नहीं रखने का प्रयास करें। उपयोगकर्ता के पर्यावरण चर में कुंजियों / रहस्यों को लोड करने के लिए एक रहस्य प्रबंधन प्रणाली का उपयोग करें। अन्यथा चरण 1 आवश्यक है, यदि स्वीकार्य हो।

  1. "रहस्य" एक सादे फ़ाइल में ऊपर संलग्नक भंडार में रखें
  2. ../set_keys.shवह सूची बनाएं जिसमें export API_KEY_A='<plaintext_key_aef94c5l6>'(मूल्यांकन को रोकने के लिए एकल उद्धरण का उपयोग करें)
  3. एक रन स्क्रिप्ट चरण जोड़ें जो source ../set_keys.shइसे निष्पादित कर सकता है और निष्पादन आदेश के शीर्ष पर ले जा सकता है
  4. बिल्ड सेटिंग्स> प्रीप्रोसेसर मैक्रोज़ में, आवश्यकतानुसार परिभाषित करें API_KEY_A="$API_KEY_A"

यह संकलक में पर्यावरण चर को कैप्चर करता है जो बाद में प्रत्येक स्रोत फ़ाइल के लिए प्रत्येक क्लैंग आह्वान में उपयोग किया जाता है।

उदाहरण निर्देशिका संरचना

[10:33:15] ~/code/memo yes? tree -L 2 .
.
├── Memo
│   ├── Memo
│   ├── Memo.xcodeproj
│   ├── Memo.xcworkspace
│   ├── Podfile
│   ├── Podfile.lock
│   └── Pods
└── keys

0

स्विफ्ट पैकेज में आपको अपनी फ़ाइल में swiftSettingsतर्क के अंदर ऐसा करना होगा । का प्रयोग करें विधि (एप्पल प्रलेखन) या स्विफ्ट प्रलेखन.targetPackage.swiftdefine

targets: [
.target(name: String,
            dependencies: [Target.Dependency],
            path: String?,
            exclude: [String]?,
            sources: [String]?,,
            cSettings: [CSetting]?,
            cxxSettings: [CXXSetting]?,
            swiftSettings: [SwiftSetting]?,
            linkerSettings: [LinkerSetting]?),

मेरा ऐसा दिखता है और यह काम करता है!

            swiftSettings: [
               .define("VAPOR")
            ]

मेरे कोड में मैं सशर्त रूप से इसका उपयोग कर सकता हूं:

#if VAPOR
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.