2016-07-13 20 views
6

Aktuell in React-Ureinwohner, nach the documentation, bauen Sie Ihre iOS-App für die Produktion, müssen Sie:Release-Debug-Konfiguration in React-india

  • Änderung Ihr Schema zu Release
  • Änderung Ihrer AppDelegate.m die richtige Bündel
  • laden Sie Ihre Info.pList für ATS

Dies ist eine starke Verletzung ist ändern von 12 factor config recommandation und es führt zu Fehlern in einem kontinuierlichen Integrationsprozess.

RN bietet keine sofort einsatzbereiten Strategien, um die Konfigurationsumgebung im JS-Code zu kennen, was zur Existenz des Pakets react-native-config führt, das schon gute Arbeit leistet, aber nicht perfekt ist (Xcode is not fully supported).

Warum ist es so? Weil es heute so wenige RN-Apps in der Produktion gibt, dass sich niemand darum kümmert? Können wir besser als react-native-config, so dass die oben genannten Schritte nicht erforderlich sind? Ich möchte eine Befehlszeile, die meine App auf die gleiche Weise archiviert, wie ich cd android && ./gradlew assembleRelease ausführen kann, ohne etwas zu meiner Konfiguration zu ändern.

EDIT:

Fastlane Einsatz macht viel einfacher durch seine gym Befehl (danke Daniel Basedow). Anscheinend ist die Philosophie von Xcode, Umgebungen "Schemata" zu nennen, nur Sie können Variablen in ihnen nicht speichern, oder wissen, welches Schema Sie in Ihrem Code laufen lassen ... Jedenfalls hat David K. Hess a great way gefunden, um Ihren Schema-Namen zu exportieren Ihre Info.plist, und dann in Ihrem Objective-C-Code, was bedeutet, dass ich jetzt in der Lage bin, mein Bundle nach dem aktuellen Schema zu wählen und meinen Code nicht zu berühren.

Hier ist mein Code: 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"]; }

Nun mein Problem ist: Ich möchte auch wissen, welches Programm ich in meinem JS-Code renne. react-native-config 's Weg ist selbst als hacky beschrieben, und zu kompliziert angesichts der Tatsache, dass die Informationen bereits in meinem Objective C-Code ist. Gibt es eine Möglichkeit, diese Informationen mit meinem JS-Code zu verbinden?

Nur zu wissen, welches Schema ich ausführe, ist nicht so gut wie in der Lage, Umgebungsvariablen zu setzen, aber zumindest kann ich nur durch Ändern meines Schemas zwischen den Umgebungen wechseln.

EDIT 2:

konnte ich meinen Plan zu meinem JS-Code exportieren. Ich habe eine Cocoa Touch-Klasse mit dem folgenden Code:

// 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 

und dann in meinem JS-Code:

import {NativeModules} from 'react-native' 
let scheme = NativeModules.RNScheme.scheme_name 

EDIT 3:

Es ist eigentlich eine andere Art und Weise als Schemata verwenden.Sie können neue „Konfigurationen“ („Release“ und „Debug“ Konfigurationen genannt werden) erstellen mit den folgenden Schritten (dank CodePush):

  1. Öffnen Sie Ihr Xcode-Projekt und wählen Sie Ihr Projekt im Projekt Navigatorfenster

  2. den Projektknoten Stellen Sie sicher, ausgewählt ist, als

  3. die Registerkarte Info Wählen Sie eines Ihrer Ziele gegen

  4. Klicken Sie auf die Schaltfläche + im Abschnitt Konfigurationen und wählen Sie , welche Konfiguration Sie

Xcode configuration screenshot

Dann können Sie definieren Tasten mit unterschiedlichen Werten entsprechend Ihrer Konfiguration duplizieren möchten.

  1. Wählen Sie Ihre App Ziel

  2. Wählen Sie Einstellungen beim Aufbau

  3. Zum Abschnitt Benutzerdefiniert (am unteren Rand des Scroll-Bereich)

  4. Sie können Konstanten mit einem anderen Wert entsprechend Ihrer Konfiguration definieren (z. B. API_ENDPOINT)

Sie können dann diesen Wert in Ihrem Info.plist Datei verweisen:

  1. Öffnen Sie Ihre Info.plist Datei

  2. einen neuen Wert erstellen und ihm einen Namen geben (ApiEndpoint)

  3. den Wert geben Sie ihm $(API_ENDPOINT) oder Sie Ihre konstante gab einen beliebigen Namen zu

Jetzt können Sie auf diesen Wert in Ihrem Code verweisen, indem Sie den Code verwenden, den ich Ihnen in meiner zweiten Bearbeitung zu dieser Frage gegeben habe.

Sie können ein Schema pro Konfiguration erstellen, um schnell von einem zum anderen zu wechseln, oder die Build-Konfiguration jedes Mal ändern (Option klicken Sie auf die Schaltfläche Ausführen).

+0

Haben Sie auch ein Beispiel für Android :) –

+0

'Fastlane deploy' funktioniert gut für Android. Sie können Konfigurationsdateien mit react-native-config hinzufügen. Eine gute Alternative ist expo.io: Der gesamte native Code ist für Sie abstrahiert, die gesamte Konfiguration ist zentralisiert und mit einer einzigen Datei für Android und iOS verfügbar. –

Antwort

3

In Ihrem AppDelegate Sie das richtige Paket wie diese verwenden kann

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

Wenn Sie ein Release-Build tun, wird der DEBUG-Flag nicht gesetzt. Je nach Buildtyp können Sie auch verschiedene Dateien als Info.plist verwenden. Es wird wahrscheinlich Situationen geben, in denen Sie einen Xcode-Debug-Build mit einem Produktions-JS-Bundle erstellen möchten oder umgekehrt. In diesem Fall müssen Sie den Code berühren.

Der Aufbau von iOS-Apps über die Befehlszeile kann ein wenig kompliziert sein. Die Probleme, die Sie beschreiben, sind nicht spezifisch für reaktive native, sondern das Xcode-Build-System.Wenn Sie es noch nicht getan haben, schauen Sie sich fastlane an, vor allem das Fitness-Studio-Kommando. Es ist viel einfacher als xcodebuild direkt zu verwenden.

Aber Sie müssen immer noch Ihre Schemata definieren.

+0

'DEBUG' Flagge ist nicht genug für mich. Laut [dieser Antwort] (http://stackoverflow.com/a/26433618/3995091) kann ich jedoch auf das aktuelle Schema zugreifen. Fastlane sieht toll aus, ich werde es versuchen. –

+0

Obwohl diese Antwort die Frage nicht beantwortet, fand ich diese Antwort sehr hilfreich :) – JeremyKun