iOS React Native应用不会从CodePush服务器更新

时间:2018-10-24 10:15:07

标签: ios react-native code-push

我已按照说明正确设置了CodePush。首先,我推送到AppCenter:

$ appcenter codepush release-react -a myUser/appName -d Production
Detecting ios app version:

Using the target binary version value "1.0" from "ios/reactnative/Info.plist".

Running "react-native bundle" command:

node node_modules/react-native/local-cli/cli.js bundle --assets-dest /var/folders/gy/737c70fj7tq3pwdw758glxz00000gp/T/code-push118924-95814-1e6qqdj.df3g/CodePush --bundle-output /var/folders/gy/737c70fj7tq3pwdw758glxz00000gp/T/code-push118924-95814-1e6qqdj.df3g/CodePush/main.jsbundle --dev false --entry-file index.js --platform ios
Loading dependency graph, done.
bundle: Writing bundle output to: /var/folders/gy/737c70fj7tq3pwdw758glxz00000gp/T/code-push118924-95814-1e6qqdj.df3g/CodePush/main.jsbundle
bundle: Done writing bundle output
bundle: Copying 6 asset files
bundle: Done copying assets

Releasing update contents to CodePush:

Successfully released an update containing the "/var/folders/gy/737c70fj7tq3pwdw758glxz00000gp/T/code-push118924-95814-1e6qqdj.df3g/CodePush" directory to the "Production" deployment of the "appName" app.

第二,我访问AppCenter网站,选择成功推送的版本,然后强制将其推广到每个应用程序。

我尝试重新启动应用程序,重新安装应用程序等...但是该应用程序无法从CodePush服务器更新。

在我的XCode控制台中,我看到:

loading - codepush2018-10-24 12:10:10.837955+0200 reactnative[5546:3916480] 
[CodePush] Loading JS bundle from file:///Users/myUser/Library/Developer/CoreSimulator/Devices/4E7D0B07-B6B2-4D3C-B5B8-F28F3DA47077/data/Containers/Bundle/Application/081FD17C-B182-488D-B2D1-C786A3B25AAB/reactnative.app/main.jsbundle

这是否意味着CodePush正在从 local 加载?

我相信我正在正确运行release方案:

release mode

class App extends React.Component {
    constructor(props){
        super(props)
    }
    componentDidMount() {
        codePush.sync({
            updateDialog: true,
            installMode: codePush.InstallMode.IMMEDIATE
        });
    }
    render(){
        return <Main screenProps={this.props} />
    }
}
const codePushOptions = { checkFrequency: codePush.CheckFrequency.ON_APP_RESUME };
const ConnectedApp = codePush(codePushOptions)(connect(state => state)(App))

firebase.auth().onAuthStateChanged(auth => {
    if(auth){
        store.dispatch(setUser(auth))
    }else{
        store.dispatch(logout())
    }
})

export default () => (
    <Provider store={store}> 
        <ConnectedApp />
    </Provider>
)

在安装应用程序时,我也没有看到updateDialog: true

2 个答案:

答案 0 :(得分:1)

  

代码推送键必须与要发布应用程序的环境和构建应用程序的环境相同,以便接收更改。

为了避免这种冲突,有两种可能的解决方案。

  • 定义单独的构建方案。
  • 添加一个自定义脚本,该脚本会随着环境的变化而更改Code Push键。

构建方案/类型

Android

android {
    ...
    buildTypes {
        releaseStaging {
            ...
            buildConfigField "String", "CODEPUSH_KEY", '"<INSERT_STAGING_KEY>"'
            ...
        }
        release {
            ...
            buildConfigField "String", "CODEPUSH_KEY", '"<INSERT_PRODUCTION_KEY>"'
            ...
        }
    }
    ...
}

Source

android/app/build.gradle中,您可以定义各种buildTypes并根据其构建应用程序

IOS

信息标签下,点击+Configurations中的Duplicate "Release" Configuration按钮,并将其名称设置为Staging

现在,您可以配置User Defined Settings并定义新设置CODEPUSH_KEY并将${CODEPUSH_KEY}变量设置为不同的方案。

详细步骤如下:Source

自定义脚本

或者,如果您不想添加更多的构建方案/类型,则可以添加一个自定义脚本,该脚本可以根据环境来更改键。

change-environment.sh

#!/usr/bin/env bash

#################################
# Change the environment variable
#################################

environment=$1
# Read Directory Path
parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
cd "$parent_path"
rm ../.env
# Set NODE_ENV in your .env file based on the script
echo "NODE_ENV=${environment}" > ../.env


#################################
# Change the code push key
#################################

if [ "$environment" = "staging" ]
then
    echo "Change Code Push Key - Staging"
    sed -i '' -E 's/CODEPUSH_KEY ?= ?".+"/CODEPUSH_KEY = "${YOUR_STAGING_IOS_CODEPUSH_KEY}"/' ../ios/YourProj.xcodeproj/project.pbxproj
    sed -i '' -E 's/buildConfigField "String", "CODEPUSH_KEY", '\''".+"'\''/buildConfigField "String", "CODEPUSH_KEY", '\''"${YOUR_STAGING_ANDROID_CODEPUSH_KEY}"'\''/' ../android/app/build.gradle
elif [ "$environment" = "production" ]
then
    echo "Change Code Push Key - Production"
    sed -i '' -E 's/CODEPUSH_KEY ?= ?".+"/CODEPUSH_KEY = "${YOUR_PRODUCTION_IOS_CODEPUSH_KEY}"/' ../ios/YourProj.xcodeproj/project.pbxproj
    sed -i '' -E 's/buildConfigField "String", "CODEPUSH_KEY", '\''".+"'\''/buildConfigField "String", "CODEPUSH_KEY", '\''"${YOUR_PRODUCTION_ANDROID_CODEPUSH_KEY}"'\''/' ../android/app/build.gradle
fi

现在您可以运行.${SCRIPT_PATH}/change-environment.sh ${ENV}

示例:./change-environment.sh staging

此脚本将android buildConfigFieldbuildTypes中的CODEPUSH_KEY更改为ios中的预定义方案。

将此脚本与package.json

中的react native的packager start命令结合起来会很方便
"start": "./change-environment.sh development && node node_modules/react-native/local-cli/cli.js start",
"start:staging": "./change-environment.sh staging && node node_modules/react-native/local-cli/cli.js start",
"start:production": "./change-environment.sh production && node node_modules/react-native/local-cli/cli.js start",

答案 1 :(得分:0)

CodePush并非从完全加载,而是从CodePush服务器下载捆绑软件。因此,您所看到的路径是模拟器文件系统中的路径部分。

请参阅此处以了解如何设置部署目标

https://docs.microsoft.com/en-us/appcenter/distribution/codepush/react-native