gpt4 book ai didi

ios - React-Native 中的发布调试配置

转载 作者:可可西里 更新时间:2023-11-01 03:53:28 27 4
gpt4 key购买 nike

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

  • 将方案更改为 Release
  • 更改您的 AppDelegate.m加载正确的包
  • 更改您的 Info.pList对于 ATS

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

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

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

编辑:

Fastlane通过其 gym 使部署变得更加容易命令(谢谢 Daniel Basedow)。显然,Xcode 的理念是将环境称为“方案”,只是您不能在其中存储变量,或者不知道您在代码中运行的方案......无论如何,David K. Hess 发现了a great way在您的 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 代码中,这种方式 self 描述为 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:

除了使用方案之外,实际上还有另一种方法。您可以通过以下步骤创建新的“配置”(“发布”和“调试”称为配置)(感谢 CodePush ):

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

  2. 确保选择了项目节点,而不是您选择的节点之一目标

  3. 选择“信息”选项卡

  4. 点击“配置”部分中的 + 按钮并选择你想复制哪个配置

Xcode configuration screenshot

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

  1. 选择您的应用目标

  2. 选择build设置

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

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

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

  1. 打开你的 Info.plist文件

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

  3. 给它赋值 $(API_ENDPOINT)或者你给常量起的任何名字

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

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

最佳答案

在您的 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 应用程序可能有点棘手。您描述的问题并非特定于 react-native,而是 Xcode 构建系统。如果您还没有,请查看 fastlane特别是健身房指挥。它比直接使用 xcodebuild 简单得多。

但是您仍然需要定义您的方案。

关于ios - React-Native 中的发布调试配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38355034/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com