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 平台 热更新 功能的发布新补丁 (热更新菜单在应用升级模块下)
然后这个弹窗下,要选择目标版本(一定是集成了bugly之后的版本,才会在这里显示)
先选择开发设备,下发,然后再测试设备上试一下是否生效。
如果想看日志,可以如下操作:
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];
你好,请问一下main.js文件在哪生成