वर्तमान में प्रतिक्रिया-मूल निवासी, the documentation के अनुसार, उत्पादन के लिए अपने iOS एप्लिकेशन के निर्माण के लिए, आप की जरूरत है:रिहाई-डिबग विन्यास में प्रतिक्रिया-मूलनिवासी
- परिवर्तन आपके योजना के
Release
- परिवर्तन आपके
AppDelegate.m
सही बंडल लोड करने के लिए बदलने
- अपने
Info.pList
एटीएस
के लिए यह 12 factor config recommandation के एक मजबूत उल्लंघन है , और यह निरंतर एकीकरण प्रक्रिया में गलतियों को जन्म देता है।
आरएन जेएस कोड में कॉन्फ़िगरेशन पर्यावरण को जानने के लिए बॉक्स ऑफ स्टॉकिटी प्रदान नहीं करता है, जिससे पैकेज react-native-config
पैकेज का अस्तित्व होता है, जो पहले से ही एक महान काम करता है, लेकिन यह सही नहीं है (Xcode is not fully supported)।
ऐसा क्यों है? क्या ऐसा इसलिए है क्योंकि आज उत्पादन में बहुत कम आरएन ऐप हैं कि कोई इस पर परवाह नहीं करता है? क्या हम react-native-config
से बेहतर कर सकते हैं ताकि ऊपर सूचीबद्ध चरणों की आवश्यकता न हो? मुझे एक कमांड लाइन चाहिए जो मेरे ऐप को उसी तरह से संग्रहीत करे जैसे मैं cd android && ./gradlew assembleRelease
चला सकता हूं, मेरी कॉन्फ़िगरेशन में कुछ भी बदले बिना।
संपादित करें:
Fastlane अपने gym
आदेश के माध्यम से तैनाती एक बहुत आसान बना देता है (आप डैनियल Basedow धन्यवाद)। जाहिर है, एक्सकोड का दर्शन वातावरण "योजनाओं" को कॉल करना है, केवल आप उनमें चर को स्टोर नहीं कर सकते हैं, या पता कर सकते हैं कि आप अपने कोड में कौन सी योजना चला रहे हैं ... वैसे भी, डेविड के। हेस ने a great way को अपनी योजना का नाम निर्यात करने के लिए पाया आपके Info.plist
, और फिर अपने उद्देश्य सी कोड में, जिसका अर्थ है कि अब मैं वर्तमान योजना के अनुसार अपना बंडल चुनने में सक्षम हूं, और मेरे कोड को स्पर्श नहीं करता हूं। NSString *schemeName = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"SchemeName"]; if ([schemeName isEqualToString:@"scheme1"]) { jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"]; } else if ([schemeName isEqualToString:@"scheme2"]) { jsCodeLocation = [NSURL URLWithString:@"http://<my_local_ip_address>:8081/index.ios.bundle?platform=ios&dev=true"]; } else if ([schemeName isEqualToString:@"scheme3"]) { jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; }
अब मेरी समस्या है::
यहाँ मेरी कोड है मुझे यह भी पता करने के लिए जो योजना मैं अपने जे एस कोड में चल रहा हूँ चाहता हूँ। react-native-config
का तरीका हैकी के रूप में स्वयं वर्णन किया गया है, और इस तथ्य पर विचार करने के लिए अत्यधिक जटिल है कि जानकारी पहले से ही मेरे उद्देश्य सी कोड में है। क्या इस जानकारी को मेरे जेएस कोड में पुल करने का कोई तरीका है?
केवल यह जानकर कि मैं कौन सी योजना चला रहा हूं वह पर्यावरण चर सेट करने में सक्षम होने के समान नहीं है, लेकिन कम से कम मैं केवल अपनी योजना को बदलकर वातावरण के बीच स्विच करने में सक्षम हूं।
संपादित करें 2:
मैं अपने जे एस कोड के लिए मेरी योजना का निर्यात करने में कामयाब रहे।
// RNScheme.h
#import <Foundation/Foundation.h>
#import "RCTBridgeModule.h"
@interface RNScheme : NSObject <RCTBridgeModule>
@end
// RNScheme.m
#import "RNScheme.h"
@interface RNScheme()
@end
@implementation RNScheme
{
}
RCT_EXPORT_MODULE()
- (NSDictionary *)constantsToExport
{
NSString *schemeName = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"SchemeName"];
NSLog(@"%@", schemeName);
return @{
@"scheme_name": schemeName,
};
}
@end
और फिर मेरी जे एस कोड में:
import {NativeModules} from 'react-native'
let scheme = NativeModules.RNScheme.scheme_name
संपादित करें 3:
वास्तव में योजनाओं का उपयोग करने से एक और तरीका नहीं है मैं निम्नलिखित कोड के साथ एक कोको स्पर्श वर्ग बनाया।आप ("रिलीज़" और "डीबग" विन्यास कहा जाता है) निम्न चरणों के साथ नए "विन्यास" बना सकते हैं (धन्यवाद CodePush):
अपने Xcode प्रोजेक्ट खोलें और परियोजना नाविक विंडो में अपना प्रोजेक्ट चुनें
परियोजना नोड सुनिश्चित चुना जाता है, के रूप में अपने लक्ष्यों में से एक के लिए विरोध
जानकारी टैब का चयन करें
विन्यास अनुभाग के भीतर + बटन पर क्लिक करें और चयन जो विन्यास आप डुप्लिकेट करना
तो फिर आप अपने विन्यास के अनुसार अलग-अलग मानों वाली कुंजियों परिभाषित कर सकते हैं चाहता हूँ।
अपने अनुप्रयोग लक्ष्य का चयन करें
चुना उपयोगकर्ता निर्धारित अनुभाग के लिए बिल्ड
- (स्क्रॉल क्षेत्र के निचले भाग में) सेटिंग
जाओ
आप अपनी कॉन्फ़िगरेशन के अनुसार एक अलग मूल्य के साथ स्थिरांक परिभाषित कर सकते हैं (उदाहरण के लिए
API_ENDPOINT
)
तब आप अपने Info.plist
फ़ाइल में इस मूल्य देख सकते हैं:
अपने
Info.plist
फ़ाइलखोलें एक नया मान बनाएँ और कोई नाम दें (
ApiEndpoint
)यह मूल्य
$(API_ENDPOINT)
या जो भी नाम आप अपने निरंतर
अब आप इस प्रश्न के मेरे दूसरे संपादन में दिए गए कोड का उपयोग करके अपने कोड में इस मान का संदर्भ दे सकते हैं।
आप एक कॉन्फ़िगरेशन प्रति एक योजना को एक से दूसरे में स्विच करने के लिए बना सकते हैं, या प्रत्येक बार बिल्ड कॉन्फ़िगरेशन बदल सकते हैं (विकल्प रन बटन पर क्लिक करें)।
क्या आपके पास एंड्रॉइड के लिए भी एक उदाहरण है :) –
'फास्टलेन तैनाती' एंड्रॉइड के लिए अच्छी तरह से काम करता है। आप प्रतिक्रिया-मूल-कॉन्फ़िगरेशन का उपयोग कर कॉन्फ़िगरेशन फ़ाइलों को जोड़ सकते हैं। एक अच्छा विकल्प expo.io है: सभी मूल कोड आपके लिए सारणीबद्ध हैं, सभी कॉन्फ़िगरेशन केंद्रीकृत हैं और एंड्रॉइड और आईओएस दोनों के लिए एक फ़ाइल का उपयोग करके उपलब्ध हैं। –