情景假設
眾所周知蘋果的審核機制非常的嚴格碌上,雖然現(xiàn)在審核時間縮短了掀鹅,但是從提交到App Stroe揽碘、審核通過次屠、上線也要數(shù)日。若線上的App出現(xiàn)很嚴重的Bug雳刺,或者臨時改動些小東西(顏色劫灶,字體啊什么的)必須要解決要改的時候。如果下線重新審核掖桦,無形中又會浪費很多的時間本昏。如果App的用戶群很龐大的話,下線重新審核會給公司帶來很大的損失滞详,那可不可以在App不下線的情況下修復些Bug呢凛俱?這個時候我們就需要熱更新。
本文demo地址
JSPatch的配置
1.創(chuàng)建App工程(沒什么好說的料饥,注意在plist中開啟網(wǎng)絡)
2.下載JSPatch的SDK蒲犬,解壓后拖拽到工程里面。注意Copy items if needed 要勾選
3.添加依賴框架 libz.tdb 和 JavaScriptCore.framework 岸啡,紅色框里的依賴框架需要手動導入原叮,正常情況下藍色框系統(tǒng)默認添加(若沒有則手動導入)
JSPatch的簡單例子
1.初始化控制器中的控件
創(chuàng)建一個UILabel控件,設置文字巡蘸,邊框等奋隶。稍后會通過JSPatch改變lable中的文字,控制器中代碼如下:
//
// ViewController.m
// JspathDemo
//
// Created by guo on 16/8/29.
// Copyright ? 2016年 guo. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong)UILabel *label;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width, 100)];
self.label = label;
label.layer.borderWidth = 1;
label.layer.borderColor = [UIColor orangeColor].CGColor;
label.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:label];
[self test];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)test{
self.label.text = @"我是lable";
}
@end
2.在AppDelegate中啟動JSPatch
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//傳入在平臺申請的 appKey悦荒。會自動執(zhí)行已下載到本地的 patch 腳本唯欣。
[JSPatch startWithAppKey:@"fe981ccab3964ba6"];
/*
事件回調(diào)
type: 事件類型,詳見 JPCallbackType 定義
data: 回調(diào)數(shù)據(jù)
error: 事件錯誤
在 `+startWithAppKey:` 之前調(diào)用
*/
[JSPatch setupCallback:^(JPCallbackType type, NSDictionary *data, NSError *error) {
switch (type) {
case JPCallbackTypeUnknow:
NSLog(@"*****");
break;
case JPCallbackTypeRunScript:
NSLog(@"執(zhí)行腳本");
break;
case JPCallbackTypeUpdate:
NSLog(@"已拉取新腳本");
break;
case JPCallbackTypeCondition:
NSLog(@"條件下發(fā)");
break;
case JPCallbackTypeGray:
NSLog(@"灰度下發(fā)");
break;
default:
break;
}
/*
進入開發(fā)模式
平臺下發(fā)補丁時選擇開發(fā)預覽模式搬味,會只對調(diào)用了這個方法的客戶端生效境氢。
在 `+sync:` 之前調(diào)用,建議在 #ifdef DEBUG 里調(diào)碰纬。
*/
[JSPatch setupDevelopment];
/*
與 JSPatch 平臺后臺同步萍聊,
發(fā)請求詢問后臺是否有 patch 更新,如果有更新會自動下載并執(zhí)行
可調(diào)用多次(App啟動時調(diào)用或App喚醒時調(diào))
*/
[JSPatch sync];
return YES;
}
JSPatch服務器腳本
注冊后點擊我的App-》新建App
App名填寫雖然沒有限制但是盡量與應用名一致把這樣規(guī)范些
如不是App沒有上線的話 AppStore AppID可以不用填寫
新建App后得到appKey 在此方法中使用
[JSPatch startWithAppKey:@""];
填寫版本號與App的版本號一致(新建應用默認版本號為1.0)
點擊版本(App Version)選擇補丁文件悦析。(JSPacth支持多個補丁更新寿桨。不需點擊加號,加號意為添加多個補丁强戴,我們這里只加一個補锻っ)
這個時候我們還沒有補丁挡鞍,需要自己創(chuàng)建個main.js補丁
defineClass('ViewController',{
test : function() {
self.label().setText("label改變了9887");
},
})
選擇好補丁后,勾選開發(fā)預覽媒佣,并提交匕累,發(fā)布新補丁。(勾選默伍,以及發(fā)布方式?jīng)]有限制欢嘿,看具體需求吧。)
ok也糊,這個時候可以看看例子中UILabel的文字是不是已經(jīng)被JSPatch改變了炼蹦。
補充
關(guān)于iOS的熱更新有
-
阿里百川HotFix(8月27開始公測)
阿里百川HotFix能夠幫助開發(fā)者將修復Bug的補丁,實時發(fā)布到APP內(nèi)狸剃,當用戶啟動APP時掐隐,補丁將自動加載安裝,用戶全程無感知钞馁,而Bug已經(jīng)修復虑省。相比發(fā)版到應用市場,等待通過審核僧凰,再等到用戶下載更新的冗長路徑探颈,有的用戶甚至對頻繁發(fā)版的APP會有抵觸而不更新,HotFix训措,將幫助您在第一時間伪节,修復多平臺的問題