# 运营 SDK 游戏更新

----

## 更新简介

- 全自动更新：所有升级处理逻辑及界面显示，都由 SDK 在初始化时完成。
- 自定义界面升级：游戏方可以拿到升级信息及下载进度，自定义升级界面。

## 全自动更新
游戏在后台提交新版游戏时自动制作差分包，更新时用户只需下载 APK 文件中新旧版本有差异的部分。更新内容和版本提交相关事宜，请联系4399相关运营对接人员。  
当游戏初始化时，SDK 将检查后台是否有新版本游戏上线，如果有，则显示更新内容，并提示用户升级。全自动更新无需配置和代码接入，SDK在初始化时自动检查更新。

## 自定义更新流程
**如果游戏需要自定义更新界面，需告知4399运营人员，由后台关闭全自动更新开关**。由游戏方自主接入更新接口  


### 1.1 检查新版本
```java
/*
 * activity, 游戏 Activity 对象
 * UpgradeProgress<UpgradeInfo> 检查更新回调，返回检查更新的进度、结果
 */
OperateCenter.getInstance().doCheck(activity, new UpgradeProgress<UpgradeInfo>() {
	@Override
	public void onStart() {}
	
	@Override
	public void onProgress(long... ps) {}
	
	@Override
	public void onFinished(int code, String message, UpgradeInfo info) {
	    // 根据 info 对象内容展示更新对话框
	    // 需要区分几种情况：
	    // 1 检查更新成功
	    //     1.1 有新版本
	    //         1.1.1 本地有下载好的文件，展示安装对话框，后续调用doInstall接口
	    //         1.1.2 本地没有下载好的文件，展示下载对话框，后续调用doInstall接口
	    //     1.2 无新版本，游戏方更加需要决定是否需要提升
	    // 2 检查更新失败，游戏方根据需要提供重试按钮，后续调用doCheck接口
	    showUpgradeInfo();
    }
 });
```

### 1.2 显示检查结果
```java
private void showUpdateInfo(final UpgradeInfo info) {
	int code = info.code();

	if (code == UpgradeInfo.STATUS_UP_TO_DATE) {
		// 没有更新，这里可以选择不提示
	}  else if (code == UpgradeInfo.STATUS_NEED_UPGRADE) {
		// 有更新内容
		if (info.havePreparedFile()) {
			// 本地已有下载好的更新包，显示“立即安装”, 即开始安装
	        // OperateCenter.getInstance().doInstall...
		} else {
			// 本地没有下载好的更新包，显示下载 UI
			if (info.isCompel()) {
				// 强制更新
			} else {
				// 非强制更新
			}
		}
	
	} else {
		// 检查更新失败，根据需要决定是否显示失败信息
	}
}
```

### 1.3 下载更新包

```java
OperateCenter.getInstance().doDownload(info, new UpgradeProgress<Void>() {
	@Override
	public void onStart() {
		// 开始下载
	}
	
	@Override
	public void onProgress(long... ps) {
		long written = ps[0]; // 已完成下载的字节
        long total = ps[1];   // 需要下载的字节
		// 正在下载，展示进度
	}
	
	@Override
	public void onFinished(int code, String message, Void aVoid) {
		if (code == SUCCESS || code == SUCCESS_ALREADY) { // 下载成功, 可安装
			// OperateCenter.getInstance().doInstall...
		} else { // 下载失败，提醒重试
			
		}
	}
```

### 1.4 安装更新包

```java
/*
 * 下载成功后，或者本地已有下载好的更新包时，可以调用此函数
 * SDK会根据是增量更新还是全量更新，采取不同的安装方式
 */
OperateCenter.getInstance().doInstall(info, new UpgradeProgress<Void>() {
	@Override
	public void onStart() {
		// 开始安装，SDK 可能会做一些安装准备，如合并包
	}
	
	@Override
        public void onProgress(long... ps) {
		if (ps[0] == UpgradeProgress.PROGRESS_INSTALLING) { 
		    // 内部开始安装流程
		}
	}
	
	@Override
        public void onFinished(int code, String message, Void aVoid) {
		if (code != UpgradeProgress.SUCCESS) { 
			// 安装失败，可以提醒重试
		} 
		// 安装成功，应用进程将自动退出
	}
}
```