#描述
rnpack是一个rn项目的打包构建工具，支持ios和android渠道提交，支持自建服务的增量更新

#v1.2.2
新增支持android

#v1.2.1
新增支持新版的xocdebuild

# 设计功能
## 命令工具安装

`npm install rnpack-cli -g`

##rnpack工具使用
* 打包android
    * 编译项目
    * rnpack buildApk --buildType {alpha|beta|release} --apkName {项目名称}
    * 上传
    * rnpack uploadApk --buildType {alpha|beta|release} --file  {文件路径}
    * 发布到fir.im
    * rnpack firApk --token {fir.im的token} --apkName {项目名称} --buildType {alpha|beta|release}  --file  {文件路径}
    * 上传和发布到fir.im
    * rnpack publishApkFile --token {fir.im的token} --apkName {项目名称} --buildType {alpha|beta|release} --file {文件路径}
    * 总和以上的操作：编译 上传 发布
    * rnpack publishApk  --token {fir.im的token} --buildType {alpha|beta|release} --apkName {项目名称}
    
* 打包ios
    * 打包项目
    * rnpack archiveIpa --configuration {Alpha|Beta|Release} --scheme {项目名称} --provisioningProfile {证书配置}
    * 上传和发布到fir.im
    * rnpack publishIpaFile --token {fir.im的token} --configuration {Alpha|Beta|Release} --scheme {项目名称} --file {文件路径}
    * 总和以上的操作：编译 上传 发布
    * rnpack publishIpa --token {fir.im的token} --configuration {Alpha|Beta|Release} --scheme {项目名称} --provisioningProfile {证书配置}
    
* 用户命令
    * 登陆（登陆成功后，会生成.rnpack_token的文件）
    * rnpack login
    * 登出
    * rnpack logout
    * 登陆用户信息
    * rnpack me
 
* 项目命令
    * 创建
    * createApp
    * 删除
    * deleteApp
    * 列出
    * apps
    * 选择（会生成rnpack_app.json的文件，保存选择的项目key)
    * selectApp
    * 设置服务地址(会生成rnpack_app.json的文件，保存设置的服务器)
    * setHost
    
* 打包热更新命令
    * 发布热更新版本
    * bundle
    * 比对差异
    * diff
    * 与apk文件的bundle比对差异
    * diffFromApk
    * 与ipa文件的bundle比对差异
    * diffFromIpa
      
* 热更新与大版本的关联管理
    * 用文件发布热更新
    * publish
    * 列出所有热更新
    * versions
    * 更新关联
    * update
    
* 1024图片直接替换ios和andorid项目图标，android图片支持圆角转换
    * 尚未完成

##客户端使用
`npm install react-native-pack --save`

##工具客户端库：
* api
    * Env {alpha|beta|release} 打包环境变量
    * packageVersion 大版本号
    * currentBundle 热更新版本号
    * currentVersion 热更新hash值
    * isFirstTime 是否是热更新后的首次打开
    * isRolledBack 是否是热更新失败后的首次打开
    * getHost 热更新服务地址
    * checkUpdate 检查更新
    * downloadApk 下载android更新包
    * downloadUpdate 热更新
    * switchVersion 切换版本，立即执行
    * switchVersionLater 切换版本，下次执行
    * markSuccess 更新成功标记
  
* 示例代码

```
import {Platform, Alert, Linking} from "react-native";
import {checkUpdate, packageVersion, currentVersion, downloadUpdate, switchVersion, Env, downloadApk} from "react-native-pack";
import _updateConfig from "../../rnpack_app.json";
const {appKey} = _updateConfig[Platform.OS];

const doUpdate = info => {
    console.log("doUpdate info:", info);
    downloadUpdate(info).then(hash => {
        console.log("doUpdate 应用更新");
        //不再提示,默认下次启动应用更新
        // Alert.alert('提示', '检查到新的版本'+info.name+',是否重启应用?', [
        //     {text: '立即重启', onPress: ()=>{switchVersion(hash);}},
        //     {text: '下次启动时应用更新', onPress: ()=>{switchVersionLater(hash);}},
        // ]);
        switchVersion(info.hash, info.name).then((data)=>{
            console.log("switchVersion hash:", info.hash);
            console.log("switchVersion name:", info.name);
        }).catch((err)=>{
            console.log("switchVersion err:", err);
        });
    }).catch(err => {
        Alert.alert('提示', '更新失败.');
        console.log("doUpdate 更新失败:", err);
    });
};


export const checkVersionUpdate = (isLaunch) => {
    console.log("checkVersionUpdate");
    checkUpdate(appKey, Env).then(info => {
        console.log("check info:", info);
        if (info.type == "Package") {
            if(Platform.OS == "ios"){
                let url = info.opt.url || "https://itunes.apple.com/cn/app/wan-wu-she/id1156373629?l=en&mt=8";
                Alert.alert('提示', '您的应用版本已更新,请前往应用商店下载新的版本',
                    [{
                        text: '确定',
                        onPress: ()=>{
                            Linking.openURL(url);
                        }
                    }],
                    {cancelable:false}
                );
            }else{
                Alert.alert('提示', '您的应用版本已更新,是否更新？',
                    [
                        {
                            text: '取消', onPress: () => {}
                        },
                        {
                            text: '确定', onPress: () => {
                                downloadApk(info.data.url, info.data.hash).then((res)=>{
                                    console.log("downloadApk res:", res);
                                }).catch((err)=>{
                                    console.log("downloadApk err:", err);
                                })
                            }
                        }
                    ],
                    {
                        cancelable: false
                    }
                );
            }

        } else if (info.type == "Bundle") {
            doUpdate(info.updateInfo);
        } else {
            // Alert.alert('提示', '您的应用版本已是最新.');
            console.log("您的应用版本已是最新:", currentVersion + " packageVersion:" + packageVersion);
            if(!isLaunch){
                utils.toast("已经是最新版本");
            }
        }
    }).catch(err => {
        //Alert.alert('提示', '检测更新失败.');
        console.log("checkVersionUpdate 检测更新失败 err:", err);
    });
};

```

##工具服务端：
* 存储android和ios的各类版本{alpha|beta|release}
* 各个版本的增量更新包
* 支持diff更新包
* 支持阿里oss




