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):
Öffnen Sie Ihr Xcode-Projekt und wählen Sie Ihr Projekt im Projekt Navigatorfenster
den Projektknoten Stellen Sie sicher, ausgewählt ist, als
die Registerkarte Info Wählen Sie eines Ihrer Ziele gegen
Klicken Sie auf die Schaltfläche + im Abschnitt Konfigurationen und wählen Sie , welche Konfiguration Sie
Dann können Sie definieren Tasten mit unterschiedlichen Werten entsprechend Ihrer Konfiguration duplizieren möchten.
Wählen Sie Ihre App Ziel
Wählen Sie Einstellungen beim Aufbau
Zum Abschnitt Benutzerdefiniert (am unteren Rand des Scroll-Bereich)
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:
Öffnen Sie Ihre
Info.plist
Dateieinen neuen Wert erstellen und ihm einen Namen geben (
ApiEndpoint
)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).
Haben Sie auch ein Beispiel für Android :) –
'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. –