React-Native中的release-debug配置

Aym*_*byk 6 configuration release ios react-native

目前,在React-Native中,根据文档,要构建用于生产的iOS应用程序,您需要:

  • 将你的计划改为 Release
  • 更改您AppDelegate.m的加载正确的捆绑
  • 改变你Info.pList的ATS

这强烈违反了12因素配置建议,并导致在持续集成过程中出错.

RN没有提供开箱即用的策略来了解JS代码中的配置环境,导致包的存在react-native-config,这已经做得很好,但并不完美(Xcode不完全支持).

为什么会这样?是因为今天生产的RN应用实际上很少,没有人关心这个?我们能做得更好react-native-config,不需要上面列出的步骤吗?我想要一个命令行,以我可以运行的方式存档我的应​​用程序cd android && ./gradlew assembleRelease,而不更改我的配置.

编辑:

Fastlane通过其gym命令使部署变得更加容易(谢谢Daniel Basedow).显然,Xcode的理念是调用环境"方案",只有你不能在其中存储变量,或者知道你在代码中运行的是哪种方案......无论如何,David K. Hess找到了一个很好的方法来导出你的方案你的名字Info.plist,然后在你的Objective C代码中,这意味着我现在能够根据当前的方案选择我的包,而不是触摸我的代码.

这是我的代码: 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"]; }

现在我的问题是:我也想知道我在JS代码中运行的是哪种方案.react-native-config考虑到信息已经存在于我的Objective C代码中,这种方式被自我描述为hacky,并且过于复杂.有没有办法将这些信息与我的JS代码联系起来?

只知道我正在运行的方案不如设置环境变量那么好,但至少我只能通过改变我的方案来在环境之间切换.

编辑2:

我设法将我的方案导出到我的JS代码中.我用以下代码创建了一个cocoa touch类:

//  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
Run Code Online (Sandbox Code Playgroud)

然后在我的JS代码中:

import {NativeModules} from 'react-native'
let scheme = NativeModules.RNScheme.scheme_name
Run Code Online (Sandbox Code Playgroud)

编辑3:

实际上除了使用方案之外还有其他方式.您可以使用以下步骤创建新的"配置"("发布"和"调试"称为配置)(感谢CodePush):

  1. 打开Xcode项目,在Project导航器窗口中选择项目

  2. 确保选择项目节点,而不是其中一个目标

  3. 选择"信息"选项卡

  4. 单击"配置"部分中的+按钮,然后选择要复制的配置

Xcode配置截图

然后,您可以根据配置定义具有不同值的键.

  1. 选择您的应用目标

  2. 选择构建设置

  3. 转到"用户定义"部分(位于滚动区域的底部)

  4. 您可以根据配置定义具有不同值的常量(例如API_ENDPOINT)

然后,您可以在Info.plist文件中引用此值:

  1. 打开你的Info.plist文件

  2. 创建一个新值并为其命名(ApiEndpoint)

  3. 给它$(API_ENDPOINT)给你的常数的值或任何名称

现在,您可以使用我在第二次编辑此代码时给您的代码在代码中引用此值.

您可以为每个配置创建一个方案以快速从一个方案切换到另一个方案,或者每次更改构建配置(选项单击运行按钮).

Dan*_*dow 5

在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
Run Code Online (Sandbox Code Playgroud)

执行发布版本时,未设置DEBUG标志.您还可以使用不同的文件作为Info.plist,具体取决于构建类型.可能会出现需要使用生产JS包进行Xcode调试构建的情况,反之亦然.在这种情况下,您需要触摸代码.

从命令行构建ios应用程序可能有点棘手.您所描述的问题并非特定于react-native而是Xcode构建系统.如果您还没有,请查看fastlane特别是健身房指令.它比直接使用xcodebuild简单得多.

但你仍然需要定义你的方案.