iOS接入Bugly的JSPatch热更新服务

JSPatch诞生于2015年5月,最初是腾讯广研高级iOS开发@bang的个人项目。
它能够使用JavaScript调用Objective-C的原生接口,从而动态植入代码来替换旧代码,以实现修复线上bug。

JSPatch在一定限制的条件下(对于部分语法不支持)实现了OC->JS以及JS->OC的这两个过程,但是对于js是如何下发到客户端的,JSPatch并未做出定义。

近期,Bugly团队将JSPatch集成进了系统,并提供了服务端。接入非常简单,本文探索一下整个接入入过程:

1、CocoaPods中集成Bugly的Hotfix

Podfile里添加

pod 'BuglyHotfix'

然后

pod install

如果找不到,需要更新下master repo

pod repo update master --verbose

需要注意的是,如果你以前已经集成过了"Bugly"这个Pod,要把它删掉,因为BuglyHotfix = Bugly + Hotfix。如果不删除Bugly的话,后面编译会冲突

2、AppDelegate中设置development设备

建议给debug包都设置成developmentDevice,这样后面测试下发时候,可以多测一些机器。

OC

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [Bugly startWithAppId:@"此处替换为你的AppId"
#ifdef DEBUG
        developmentDevice:YES
#endif
                   config:nil];
    return YES;
}

Swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
   #if DEBUG
   Bugly.start(withAppId: "900001055",
               developmentDevice: true,
               config: nil)
   #else
   Bugly.start(withAppId: "900001055",
               developmentDevice: false,
               config: nil)
   #endif
   return true
}

3、编写JSPatch

一般来说,JSPatch是需要纯JS写的,幸运的是,原作者提供了一个非常好的工具,可以把OC代码转换成JS代码

比如,我们要替换AAVC类的如下方法,

- (void)bbButtonPressed:(id)sender {
    // Logic abcdefg
}

那么,我们可以把如下代码粘贴到工具的左侧:

@implementation TTUserInfoViewController
- (void)bbButtonPressed:(id)sender {
    // Logic new patched
}
@end

然后点击Convert就可以得到如下代码:

require('JPRequest,JPParser');
defineClass('SampleClass', {
    requestUrl_param_callback: function(url, dict, callback) {
        self.super().requestUrl_param_callback(url, dict, callback);
        var obj = JPRequest.alloc().initWithUrl_param(url, dict);
        obj.setSuccessBlock(block('id,NSError*', function(data, err) {
            var content = JPParser.parseData(data);
            if (callback) callback({
                "content": content
            }, err);
            self.dataSource().refresh();
            self.handleRequestSuccess()(data);
        }));
    },
});

将转化好后的代码,存储为main.js,这一步就结束了。

注意:一定要是main.js这个文件名,别的是没法生效的!我卡在这个地方大概1小时。。。

需要说明的是,JSPatch不是万能的,部分语法不支持,甚至会崩溃,具体可以看JSPatch的Wiki

4、发布测试补丁

将main.js压缩成zip包,点击 Bugly 平台 热更新 功能的发布新补丁 (热更新菜单在应用升级模块下)1483705932-4915-hotfix

然后这个弹窗下,要选择目标版本(一定是集成了bugly之后的版本,才会在这里显示)

1483705932-5731-hotfix

先选择开发设备,下发,然后再测试设备上试一下是否生效。

如果想看日志,可以如下操作:

    BuglyConfig *config = [[BuglyConfig alloc] init];
    config.hotfixDebugMode = NO;
    config.debugMode = YES;
    [Bugly startWithAppId:kBuglyAppId
#ifdef DEBUG
        developmentDevice:YES
#endif
                   config:config];

5、发布正式补丁

运行没问题后,可以编辑补丁,然后选择全量设备。

注意,如果你之前同版本下已经下发了其他补丁,最好把他们都撤回。

6、其他

如果你想本地调试补丁,可以这么搞,就会禁用Bugly的远程下载jspatch,只用资源文件夹下面的main.js

    BuglyConfig *config = [[BuglyConfig alloc] init];
    config.hotfixDebugMode = YES;
    [Bugly startWithAppId:appId
#ifdef DEBUG
        developmentDevice:YES
#endif
                   config:config];

 

1 thought on “iOS接入Bugly的JSPatch热更新服务

Leave a Reply

Your email address will not be published. Required fields are marked *