JSPatch 是一個 iOS 動態(tài)更新框架妇汗,只需在項目中引入極小的引擎帘不,就可以使用 JavaScript 調(diào)用任何 Objective-C 原生接口,獲得腳本語言的優(yōu)勢:為項目動態(tài)添加模塊杨箭,或替換項目原生代碼動態(tài)修復(fù) bug寞焙。
因?yàn)檫€要部署線上的js文件,所以直接用JSPatch SDK,該平臺可以幫助管理補(bǔ)丁文件,加密等
點(diǎn)擊去JSPatch平臺注冊
根據(jù)文檔的提示把SDK集成進(jìn)自己的項目,文檔講的很詳細(xì),此處略
具體代碼
導(dǎo)入 #import <JSPatch/JSPatch.h>
在上線之前需要對腳本進(jìn)行本地測試,看看運(yùn)行是否正常互婿。SDK 提供了方法
+testScriptInBundle
用于發(fā)布前的測試:
注意在 JSPatch 平臺的規(guī)范里捣郊,JS腳本的文件名必須是main.js
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[JSPatch testScriptInBundle];//為了線下測試js文件的可用性,線上代碼是不同的,下面有寫
}
調(diào)用這個方法后,JSPatch 會在當(dāng)前項目的 bundle 里尋找 main.js 文件執(zhí)行慈参,效果與最終線上用戶下載腳本執(zhí)行一樣呛牲,測試完后就可以準(zhǔn)備上線這個腳本。
下面是重點(diǎn) -- js文件中寫什么
舉個例子吧,下面是我的某一個控制中的代碼
#import "JPViewController.h"
@interface JPViewController ()
{
}
@end
@implementation JPViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self loadButton];
// Do any additional setup after loading the view.
}
- (void)loadButton {
UIButton *tipBtn = [[UIButton alloc] initWithFrame:CGRectMake(10, 50, 200, 30)];
[tipBtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[tipBtn setTitle:@"hello_jspatch" forState:UIControlStateNormal];
[tipBtn addTarget:self action:@selector(clickedBtn:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:tipBtn];
}
- (void)clickedBtn:(UIButton *)sender {
sender.backgroundColor = [UIColor redColor];
}
@end
頁面上有一個按鈕,文字為"hello_jspatch",點(diǎn)擊事件是讓自己的背景顏色變?yōu)榧t色
假設(shè)這是我線上的版本,但這是有錯誤的,我的文字不應(yīng)該是"hello_jspatch",應(yīng)該是"success_jspatch",點(diǎn)擊事件不該是變紅而是變綠色
(這時我們就可以通過JSPatch熱更新,具體原理不解釋.)
利用運(yùn)行時特性處理這個控制器中的loadButton
和clickedBtn:
這兩個方法
js文件中的語法不會?不要緊,JSPatch的作者還有一個開源項目,直接把我們需要的oc代碼轉(zhuǎn)為需要的js
把我們需要更改的兩處代碼, 改為"succcess_jspatch"和greenColor()
注意
現(xiàn)在的代碼也不一定是一定能用的,因?yàn)镴SPatch作者對語法做了一些規(guī)定,有好多地方這個轉(zhuǎn)換器并不能幫助完美的轉(zhuǎn)換
這就要去github中看具體的規(guī)定
點(diǎn)此跳轉(zhuǎn)到github--JSPatch-Wiki
下面附上修改完的代碼
require('UIButton,UIColor');
defineClass('JPViewController', {
loadButton: function() {
var tipBtn = UIButton.alloc().initWithFrame({x:10, y:50, width:200, height:30});
tipBtn.setTitleColor_forState(UIColor.redColor(), 0);
tipBtn.setTitle_forState("success_jspatch", 0);
tipBtn.addTarget_action_forControlEvents(self, "clickedBtn:", 1<<6);
self.view().addSubview(tipBtn);
},
clickedBtn: function(sender) {
sender.setBackgroundColor(UIColor.greenColor());
}
});
** 我修改了1. initWithFrame后面的CGRectMake()的樣式 2. UIControlStateNormal UIControlEventTouchUpInside 這類枚舉改為對應(yīng)枚舉值 這在Wiki中都是有提到的,一定要仔細(xì)看**
現(xiàn)在就可以運(yùn)行了~~~~(但是不要忘了,咱們這是在線下測試呢)
線上的版本appdelegate中是這樣的才對
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[JSPatch startWithAppKey:@"你自己的appkey"];//JSPatch SDK 平臺上添加應(yīng)用得到的key
[JSPatch sync];
//自動去平臺下載補(bǔ)丁包
}