2016-07-13 14 views
6

वर्तमान में प्रतिक्रिया-मूल निवासी, 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):

  1. अपने Xcode प्रोजेक्ट खोलें और परियोजना नाविक विंडो में अपना प्रोजेक्ट चुनें

  2. परियोजना नोड सुनिश्चित चुना जाता है, के रूप में अपने लक्ष्यों में से एक के लिए विरोध

  3. जानकारी टैब का चयन करें

  4. विन्यास अनुभाग के भीतर + बटन पर क्लिक करें और चयन जो विन्यास आप डुप्लिकेट करना

Xcode configuration screenshot

तो फिर आप अपने विन्यास के अनुसार अलग-अलग मानों वाली कुंजियों परिभाषित कर सकते हैं चाहता हूँ।

  1. अपने अनुप्रयोग लक्ष्य का चयन करें

  2. चुना उपयोगकर्ता निर्धारित अनुभाग के लिए बिल्ड

  3. (स्क्रॉल क्षेत्र के निचले भाग में) सेटिंग

  4. जाओ

    आप अपनी कॉन्फ़िगरेशन के अनुसार एक अलग मूल्य के साथ स्थिरांक परिभाषित कर सकते हैं (उदाहरण के लिए API_ENDPOINT)

तब आप अपने Info.plist फ़ाइल में इस मूल्य देख सकते हैं:

  1. अपने Info.plist फ़ाइल

  2. खोलें एक नया मान बनाएँ और कोई नाम दें (ApiEndpoint)

  3. यह मूल्य $(API_ENDPOINT) या जो भी नाम आप अपने निरंतर

को दे दिया दें

अब आप इस प्रश्न के मेरे दूसरे संपादन में दिए गए कोड का उपयोग करके अपने कोड में इस मान का संदर्भ दे सकते हैं।

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

+0

क्या आपके पास एंड्रॉइड के लिए भी एक उदाहरण है :) –

+0

'फास्टलेन तैनाती' एंड्रॉइड के लिए अच्छी तरह से काम करता है। आप प्रतिक्रिया-मूल-कॉन्फ़िगरेशन का उपयोग कर कॉन्फ़िगरेशन फ़ाइलों को जोड़ सकते हैं। एक अच्छा विकल्प expo.io है: सभी मूल कोड आपके लिए सारणीबद्ध हैं, सभी कॉन्फ़िगरेशन केंद्रीकृत हैं और एंड्रॉइड और आईओएस दोनों के लिए एक फ़ाइल का उपयोग करके उपलब्ध हैं। –

उत्तर

3

अपने AppDelegate में आप इस

#ifdef DEBUG 
    jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"]; 
#else 
    jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 
#endif 

तरह सही बंडल का उपयोग कर सकते हैं जब आप एक रिलीज निर्माण करते हैं, डीबग ध्वज सेट नहीं है। बिल्ड प्रकार के आधार पर आप अपनी जानकारी के रूप में विभिन्न फ़ाइलों का उपयोग भी कर सकते हैं। ऐसी स्थितियां शायद ऐसी स्थितियां होंगी जहां आप एक उत्पादन जेएस बंडल या इसके विपरीत एक एक्सकोड डीबग बिल्ड करना चाहते हैं। उस स्थिति में आपको कोड को स्पर्श करने की आवश्यकता है।

कमांड लाइन से बिल्डिंग आईओएस ऐप्स थोड़ा मुश्किल हो सकता है। जिन समस्याओं का आप वर्णन कर रहे हैं वे प्रतिक्रिया-मूल लेकिन एक्सकोड बिल्ड सिस्टम के लिए विशिष्ट नहीं हैं।यदि आप पहले से नहीं हैं, तो fastlane विशेष रूप से जिम कमांड देखें। यह सीधे xcodebuild का उपयोग करने से बहुत आसान है।

लेकिन आपको अभी भी अपनी योजनाओं को परिभाषित करना होगा।

+0

'DEBUG' ध्वज मेरे लिए पर्याप्त नहीं है। [इस उत्तर] के अनुसार (http://stackoverflow.com/a/26433618/3995091) हालांकि, मैं वर्तमान योजना तक पहुंच प्राप्त कर सकता हूं। फास्टलेन अद्भुत लग रहा है, मैं इसे आज़मा दूंगा। –

+0

भले ही इस उत्तर ने प्रश्न का उत्तर नहीं दिया, फिर भी मुझे यह जवाब बहुत उपयोगी पाया :) – JeremyKun

संबंधित मुद्दे