采用InjectFix的热更新特性对c#代码进行修复,InjectFix对应的git地址为 https://github.com/Tencent/InjectFix
InjectFix无需对C#工程原有逻辑进行修改,并且可以用C#生成补丁,但是不能新增类和函数,因此更新方式也更加符合苹果审核规范。适合IOS端进行线上问题的修复
开发准备
拷贝InjectFix库文件
IFixToolKit拷贝到Unity项目的Assets同级目录
Assets/IFix,Assets/Plugins拷贝到Unity项目的Assets下
标识要热更新的类型
在Editor目录下创建InterpertConfig文件,对可进行热更的类进行配置。采用标识Namespace的方式,这样在该Namespace下的类均可进行热更新
using System.Collections.Generic;
using IFix;
using System;
using System.Reflection;
using System.Linq;
//1、配置类必须打[Configure]标签
//2、必须放Editor目录
[Configure]
public class InterpertConfig
{
[IFix]
static IEnumerable<Type> ToProcess
{
get
{
return (from type in Assembly.Load("Assembly-CSharp").GetTypes()
where type.Namespace == "YourNamespace" && !type.Name.Contains("<")
select type);
}
}
}
修复流程
生成热更新资源
假定线上版本为1.0.0,此时需要发布一个对应的修复版本1.0.0.001
1、需要修改的文件添加库的命名域using IFix;在修改后的函数上添加[Patch]标签。进行修复后,点击菜单栏的是InjectFix->Fix (新版本会有Fix,Fix(IOS)和Fix(Android)选项,直接选Fix选项)生成Assembly-CSharp.patch.bytes
2、将Assembly-CSharp.patch.bytes 上传到CDN服务器,对应信息和地址填入下方热更新配置表
3、服务器根据配置表下发对应热更新信息
热更新配置表
version | channel | fixVersion | abUrl |
1.0.0 | all | 1.0.0.001 | https://xxx.oss/app/hotfix/all/1.0.0.001 |
1.0.0 | huawei | 1.0.0.001 | https://xxx.oss/app/hotfix/huawei/1.0.0.001 |
1.0.0 | appstore | 1.0.0.001 | https://xxx.oss/app/hotfix/appstore/1.0.0.001 |
version:需要修复的版本号
channel:需要修复的渠道号,如果为all则为针对所有平台的修复包,如果为其他,则为具体渠道的修复包。优先判断具体渠道号的渠道包,如果没有则选择全平台修复包。
fixVersion:修复版本的版本号
abUrl:修复包的地址
客户端更新流程图
注意事项
在发布版本前需要先执行菜单栏InjectFix->Inject确保代码已经注入。否则热更无法生效
常见问题
Exception: can not load type[System.Int32,netstandard, Version=2.0.0.0, Culture = neutral. PublicKeyToken=cc7b13ffcd2ddd51]
这是由于补丁设置的backend和实际打包设置的不一样。补丁设置的是netstandard 2.0。所以把API Level改成.net 4.x 重新生成补丁包