首页 文章

iOS和Android上的不同应用程序版本 - 带有Expo的React Native(CRNA)

提问于
浏览
0

是否可以在使用Expo的React Native(CRNA)应用程序中的同一代码库中拥有两个不同的应用程序版本(一个用于iOS,一个用于Android)?

显然只有1个app.json如下:

{
  "expo": {
    "name": "MyApp",
    "icon": "./assets/images/appstore-icon.png",
    "description": "This is a sample",
    "slug": "test",
    "privacy": "unlisted",
    "sdkVersion": "19.0.0",
    "version": "1.0.10",
    ......... etc
  }
}

有没有办法添加特定于平台的版本控制?

2 回答

  • 3

    sdkVersion 是Expo的SDK版本而不是您的应用 . version 是您的应用版本,使用您喜欢的任何版本控制方案

    如果您想单独为Android / iOS应用设置版本,请在 app.json 内设置:

    {
       "expo": {
        "name": "Your App Name",
        "icon": "./path/to/your/app-icon.png",
        "slug": "your-app-slug",
        "version": "1.2.0",
        "sdkVersion": "21.0.0",
        "ios": {
          "bundleIdentifier": "com.yourcompany.yourappname",
          "buildNumber": "3.2.1"
        },
        "android": {
          "package": "com.yourcompany.yourappname",
          "versionCode": "1.2.3"
        }
      }
    }
    

    要跟踪版本控制,您可以更新二进制文件的versionCodebuildNumber . 浏览app.json documentation以了解您可以更改的所有属性是个好主意,例如:图标,深层链接网址方案,手机/平板电脑支持等等 .

    见:https://docs.expo.io/versions/latest/guides/building-standalone-apps.html#7-update-your-app

  • 2

    不幸的是,没有直接的方式来做你所要求的 .

    使用平台

    您可以使用Platform react native API为每个应用程序定义自定义代码,这些文档可以在RN文档中找到 . 使用此API,您可以检查当前平台并为每个平台定义代码 .

    import { Platform, StyleSheet } from 'react-native';
    
    const styles = StyleSheet.create({  height: (Platform.OS === 'ios') ? 200 : 100, });
    

    或者您也可以使用platform.select为每个平台定义一些代码

    import { Platform, StyleSheet } from 'react-native';
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        ...Platform.select({
          ios: {
            backgroundColor: 'red',
          },
          android: {
            backgroundColor: 'blue',
          },
        }),
      },
    

    使用特定文件扩展名

    您可以使用filename.ios.js或filename.android.js命名每个js文件,它们将在每个平台中自动调用 .

    使用环境

    除了平台在很多情况下我喜欢定义一个环境模块,它允许我根据我选择的环境交换一些值 . 例如:

    - environment
       /environment.js
       /state.js
    

    在environment.js中,我保存了可用的状态键和当前选择的环境:

    environment.js

    export const environments = {
      pre: "PRE_ENV",
      prod: "PROD_ENV",
    };
    
    export const currentEnvironment =  environments.pre;
    

    然后在state.js中我想存储一些帮助来检查我所处的环境:

    state.js

    import { currentEnvironment, environments } from "./environment";
    
    export const isProductionEnvironment = () => {
      return environments.prod === currentEnvironment;
    };
    
    export const isPreEnvironment = () => {
      return environments.pre === currentEnvironment;
    };
    

    现在,您可以在新文件中创建一些与环境相关的代码,例如:

    greeting.js

    import { environments, currentEnvironment } from "./environment";
    
    export const selectGreeting = () => {
      switch(currentEnvironment) {
        case environments.pre:
          return "Welcome to the pre environment";
    
        case environments.prod:
          return "Welcome to the prod environment";
    
        default:
          return "Unsupported Environment";
      }
    };
    

    要管理你的app.js没有漂亮的解决方案,你将一些默认的app.js存储到某个环境并复制粘贴它或者你可以使用:https://github.com/oliverbenns/expo-deploy

    它是一个用bash编写的小库,可以帮助你部署到多个slugs .

    希望能帮助到你!

相关问题