一、目标
- 无需改动项目工程代码情况下,应急处理线上项目出现bug/崩溃。
- 官方地址:https://help.aliyun.com/product/65109.html
二、操作步骤
准备工作
- 联系阿里客服,获取阿里官方定制的移动热修复(.framework)文件,通知添加热修复白名单。
- 登录阿里EMAS —> 选择《移动研发平台EMAS产品使用调研》—> 创建工作空间 —> 创建应用 —> 按指引配置plist文件
- 替换项目中出现bug/崩溃方法的文件,文件格式[.lua]
项目接入及使用
- 库添加
# 热修复
pod 'AlicloudLua'
pod 'AlicloudBeacon'
pod 'AlicloudUtils'
pod 'ZipArchive', '~> 1.4.0'
pod 'AlicloudHotFixDebug', '~> 1.0.1' # 本地调试
- 初始化
#import "AppDelegate.h"
// 热更新
#import <AlicloudHotFix/AlicloudHotFix.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
ViewController *vc = [[ViewController alloc] init];
_navigationController = [[UINavigationController alloc] initWithRootViewController:vc];
_window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[_window setRootViewController:_navigationController];
[_window setBackgroundColor:[UIColor whiteColor]];
[_window makeKeyAndVisible];
// 热修复
[self hotfixSdkInit];
return YES;
}
// 热修复
- (void)hotfixSdkInit {
AlicloudHotFixService *hotfixService = [AlicloudHotFixService sharedInstance];
// 打开Log
[hotfixService setLogEnabled:YES];
// 手动设置App版本号
[hotfixService setAppVersion:@"1.0"];
[hotfixService initWithAppId:appId appSecret:appSecret rsaPrivateKey:appRsaPrivateKey callback:^(BOOL res, id data, NSError *error) {
if (res) {
NSLog(@"HotFix SDK init success.");
} else {
NSLog(@"HotFix SDK init failed, error: %@", error);
}
}];
}
示例:本地校验测试
- 工程目录下创建"EMASCrash.lua"文件,示例代码
interface{"EMASCrashVC"}
function aClick(self)
local arrary = {"1","2"}
local str = arrary[1]
print(str)
self:view():setBackgroundColor(UIColor:redColorr())
end
对应项目中崩溃的方法:
//
// EMASCrashVC.m
// crash
- (void)aClick{
NSArray *array = @[];
NSString *str = array[1];
NSLog(@"%@",str);
}
- 调用修复文件
NSString *patch = [[NSBundle mainBundle] pathForResource:@"EMASCrash" ofType:@"lua"];
[AlicloudHotFixDebugService loadLocalPachFile:patch];
结果:项目中崩溃的方法(- (void)aClick)不再崩溃,打印值:1,背景变成红色。
示例:线上使用
- 新建文件夹(名:patch),
- 将创建的"EMASCrash.lua"文件(文件代码同上)放入“patch”文件夹中。
- 压缩“patch”文件夹 —> patch.zip
- 进入控制台:移动研发平台EMAS / 移动热修复 / 补丁管理 / 添加版本 / 上传补丁(即:上传patch.zip文件)
注意:如果上传失败,问下客服白名单是否通过。
- 修复方法调用
[[AlicloudHotFixService sharedInstance] loadPatch:^(BOOL res, id data, NSError *error) {
if (res) {
NSLog(@"Load patch success.");
} else {
NSLog(@"Load patch failed, error: %@", error);
}
}];
结果返回:Load patch success. 即完成修复
注:使用过程中出现个问题,“线上场景”使用模拟器运行无法热修复成功,须使用真机运行;本地热修复使用真机/模拟器均可。
以下是效果演示
三、遇坑总结
- 上传patch.zip文件失败,应该是加入白名单还未通过所致。
- 线上场景热修复(使用模拟器运行)失败,使用真机运行热修复成功。此问题已反馈给官方技术支持,证实确有这个问题。