當App上線后,難免不會出現bug.由于AppStore需要審核的原因,出現的bug就無法及時修復.而JSPatch可以實現在App啟動時,自動發(fā)送網絡請求補丁,替換自身的方法或屬性,因此可以用來在線上緊急修復bug.
下面是官方地址:
http://www.jspatch.com/
按照官方文檔,使用流程很簡單.測試時,在工程內新建main.js文件.下面是我寫的Demo的源碼.
在ViewController類的.m文件中的代碼如下:
#import "ViewController.h"
#import "TestCell.h"
#import "ViewController+CategoryTest.h"
@interface ViewController ()
@property (nonatomic,assign) NSInteger count;
@property (nonatomic,strong) NSString *name;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.tableView registerClass:[TestCell class] forCellReuseIdentifier:@"TestCell"];
self.tableView.estimatedRowHeight = 100;
self.tableView.rowHeight = UITableViewAutomaticDimension;
[ViewController testLogOne];
[ViewController testLogTwo];
NSLog(@"*******count%zd**********", _count);
[self blockTest:^(NSString *str) {
NSLog(@"*******%@******",str);
}];
}
- (void)blockTest: (void (^)(NSString *))block{
block(@"blockTest");
}
+ (void)testLogOne{
NSLog(@"*******classTestLogOne*******");
}
+ (void)testLogTwo{
NSLog(@"*******classTestLogTwo*******");
}
- (void)testLog{
NSLog(@"*******testLog*******");
[self categoryTest];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 10;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
TestCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TestCell"];
if (!cell) {
cell = [[TestCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TestCell"];
}
return cell;
}
@end
下面是main.js中的代碼:
//defineClass("類名", [屬性],{實例方法},{類方法})
defineClass("ViewController",[],{
tableView_numberOfRowsInSection: function(tableView, indexPath){
// console.log('***********');
return 1;
},
},{})
//調用未覆蓋前的實例方法
defineClass("ViewController", {
viewDidLoad: function() {
self.ORIGviewDidLoad();
self.testLog();
},
})
//覆蓋類方法
defineClass("ViewController", {}, {
testLogOne: function(){
console.log('*****ModifyClassFunctionOne******');
},
testLogTwo: function(){
console.log('*****ModifyClassFunctionTwo******');
}
})
//覆蓋分類方法
defineClass("ViewController",{
categoryTest: function(){
console.log('*****ModifycategoryTest******');
},
})
//修改屬性
defineClass("ViewController", {
viewDidLoad: function() {
self.ORIGviewDidLoad();
self.setValue_forKey(10,"_count");
var num = 10;
console.log('%d ******',self.count());
},
})
//修改block
defineClass("ViewController", {
blockTest: function(){
},
});
在mian.js文件中,通過defineClass方法分別覆蓋了原ViewController類中的實例方法,類方法,分類方法,屬性和block.
使用過程中需要注意一些細節(jié)問題:
1 JSPatch實現走的是http網絡請求,需要在info.plist中進行ATS注入.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2 如果按步驟操作后,效果無法實現,需要將XCode退出后嘗試.
下面是Demo的github鏈接:
https://github.com/zhudong10/JSPatchDemo.git