React-Native

时间:2016-07-13 14:50:11

标签: ios configuration react-native release

目前在React-Native中,根据the documentation,要构建用于制作的iOS应用,您需要:

  • 将您的计划更改为Release
  • 更改您的AppDelegate.m以加载正确的包
  • 更改您的Info.pList以获取ATS

这严重违反了12 factor config recommandation,导致在持续集成过程中出现错误。

RN没有提供开箱即用的策略来了解JS代码中的配置环境,导致包react-native-config的存在,它已经做得很好,但并不完美{ {3}}

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

编辑:

(Xcode is not fully supported)通过gym命令使部署变得更加容易(谢谢Daniel Basedow)。显然,Xcode的理念是调用环境" scheme",只有你不能在其中存储变量,或知道你在代码中运行的是哪种方案......无论如何,David K. Hess发现Fastlane要在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代码中运行的方案。考虑到信息已经存在于我的Objective C代码中,react-native-config的方式被自我描述为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

然后在我的JS代码中:

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

编辑3:

实际上除了使用方案之外还有其他方式。您可以创建新的&#34;配置&#34; (&#34;发布&#34;和#34;调试&#34;称为配置),并执行以下步骤(感谢a great way):

  1. 打开Xcode项目并在项目中选择项目 导航窗口

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

  3. 选择信息标签

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

  5. CodePush

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

    1. 选择您的应用目标

    2. 选择构建设置

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

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

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

      1. 打开Info.plist文件

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

      3. 为其赋予值$(API_ENDPOINT)或您为常量赋予的任何名称

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

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

1 个答案:

答案 0 :(得分: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

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

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

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