美文网首页
iOS热修复(阿里EMAS)

iOS热修复(阿里EMAS)

作者: 心猿意码_ | 来源:发表于2022-04-27 10:44 被阅读0次

    一、目标

    二、操作步骤

    准备工作
    • 联系阿里客服,获取阿里官方定制的移动热修复(.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);
            }
        }];
    }
    

    示例:本地校验测试

      1. 工程目录下创建"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);
    }
    
      1. 调用修复文件
    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. 即完成修复
    注:使用过程中出现个问题,“线上场景”使用模拟器运行无法热修复成功,须使用真机运行;本地热修复使用真机/模拟器均可。

    以下是效果演示


    热修复.gif

    三、遇坑总结

    • 上传patch.zip文件失败,应该是加入白名单还未通过所致。
    • 线上场景热修复(使用模拟器运行)失败,使用真机运行热修复成功。此问题已反馈给官方技术支持,证实确有这个问题。

    相关文章

      网友评论

          本文标题:iOS热修复(阿里EMAS)

          本文链接:https://www.haomeiwen.com/subject/gqbkyrtx.html