日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JSPatch – 动态更新iOS APP

發(fā)布時(shí)間:2025/3/15 javascript 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSPatch – 动态更新iOS APP 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JSPatch是最近業(yè)余做的小項(xiàng)目,只需在項(xiàng)目中引入極小的引擎,就可以使用JavaScript調(diào)用任何Objective-C的原生接口,獲得腳本語言的能力:動(dòng)態(tài)更新APP,替換項(xiàng)目原生代碼修復(fù)bug。?

用途?

是否有過這樣的經(jīng)歷:新版本上線后發(fā)現(xiàn)有個(gè)嚴(yán)重的bug,可能會(huì)導(dǎo)致crash率激增,可能會(huì)使網(wǎng)絡(luò)請求無法發(fā)出,這時(shí)能做的只是趕緊修復(fù)bug然后提交等待漫長的AppStore審核,再盼望用戶快點(diǎn)升級,付出巨大的人力和時(shí)間成本,才能完成此次bug的修復(fù)。?

使用JSPatch可以解決這樣的問題,只需在項(xiàng)目中引入JSPatch,就可以在發(fā)現(xiàn)bug時(shí)下發(fā)JS腳本補(bǔ)丁,替換原生方法,無需更新APP即時(shí)修復(fù)bug。?

例子?

@implementation JPTableViewController ... - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {NSString *content = self.dataSource[[indexPath row]]; //可能會(huì)超出數(shù)組范圍導(dǎo)致crashJPViewController *ctrl = [[JPViewController alloc] initWithContent:content];[self.navigationController pushViewController:ctrl]; } ... @end

上述代碼中取數(shù)組元素處可能會(huì)超出數(shù)組范圍導(dǎo)致crash。如果在項(xiàng)目里引用了JSPatch,就可以下發(fā)JS腳本修復(fù)這個(gè)bug:?

#import “JPEngine.m" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[JPEngine startEngine];[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://cnbang.net/bugfix.JS"]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {NSString *script = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];if (script) {[JPEngine evaluateScript:script];} }];….return YES; } @end //JS defineClass("JPTableViewController", {//instance method definitionstableView_didSelectRowAtIndexPath: function(tableView, indexPath) {var row = indexPath.row()if (self.dataSource().length > row) { //加上判斷越界的邏輯var content = self.dataArr()[row];var ctrl = JPViewController.alloc().initWithContent(content);self.navigationController().pushViewController(ctrl);}} }, {})

這樣 JPTableViewController 里的 -tableView:didSelectRowAtIndexPath: 就替換成了這個(gè)JS腳本里的實(shí)現(xiàn),在用戶無感知的情況下修復(fù)了這個(gè)bug。?

更多的使用文檔和demo請參考github項(xiàng)目主頁。?

原理?

JSPatch用iOS內(nèi)置的JavaScriptCore.framework作為JS引擎,但沒有用它JSExport的特性進(jìn)行JS-OC函數(shù)互調(diào),而是通過Objective-C Runtime,從JS傳遞要調(diào)用的類名函數(shù)名到Objective-C,再使用NSInvocation動(dòng)態(tài)調(diào)用對應(yīng)的OC方法。詳細(xì)的實(shí)現(xiàn)原理以及實(shí)現(xiàn)過程中遇到的各種坑和hack方法會(huì)另有文章介紹。?

方案對比?

目前已經(jīng)有一些方案可以實(shí)現(xiàn)動(dòng)態(tài)打補(bǔ)丁,例如WaxPatch,可以用Lua調(diào)用OC方法,相對于WaxPatch,JSPatch的優(yōu)勢是:?

1.JS語言
JS比Lua在應(yīng)用開發(fā)領(lǐng)域有更廣泛的應(yīng)用,目前前端開發(fā)和終端開發(fā)有融合的趨勢,作為擴(kuò)展的腳本語言,JS是不二之選。?

2.符合Apple規(guī)則
JSPatch更符合Apple的規(guī)則。iOS Developer Program License Agreement里3.3.2提到不可動(dòng)態(tài)下發(fā)可執(zhí)行代碼,但通過蘋果JavaScriptCore.framework或WebKit執(zhí)行的代碼除外,JS正是通過JavaScriptCore.framework執(zhí)行的。?

3.小巧
使用系統(tǒng)內(nèi)置的JavaScriptCore.framework,無需內(nèi)嵌腳本引擎,體積小巧。?

4.支持block
wax在幾年前就停止了開發(fā)和維護(hù),不支持Objective-C里block跟Lua程序的互傳,雖然一些第三方已經(jīng)實(shí)現(xiàn)block,但使用時(shí)參數(shù)上也有比較多的限制。?

相對于WaxPatch,JSPatch劣勢在于不支持iOS6,因?yàn)樾枰隞avaScriptCore.framework。另外目前內(nèi)存的使用上會(huì)高于wax,持續(xù)改進(jìn)中。?

風(fēng)險(xiǎn)?

JSPatch讓腳本語言獲得調(diào)用所有原生OC方法的能力,不像web前端把能力局限在瀏覽器,使用上會(huì)有一些安全風(fēng)險(xiǎn):?

1.若在網(wǎng)絡(luò)傳輸過程中下發(fā)明文JS,可能會(huì)被中間人篡改JS腳本,執(zhí)行任意方法,盜取APP里的相關(guān)信息??梢詫鬏斶^程進(jìn)行加密,或用直接使用https解決。?

2.若下載完后的JS保存在本地沒有加密,在未越獄的機(jī)器上用戶也可以手動(dòng)替換或篡改腳本。這點(diǎn)危害沒有第一點(diǎn)大,因?yàn)椴僮髡呤鞘謾C(jī)擁有者,不存在APP內(nèi)相關(guān)信息被盜用的風(fēng)險(xiǎn)。若要避免用戶修改代碼影響APP運(yùn)行,可以選擇簡單的加密存儲(chǔ)。?

其他用途?

JSPatch可以動(dòng)態(tài)打補(bǔ)丁,自由修改APP里的代碼,理論上還可以完全用JSPatch實(shí)現(xiàn)一個(gè)業(yè)務(wù)模塊,甚至整個(gè)APP,跟wax一樣,但不推薦這么做,因?yàn)?#xff1a;?

  • JSPatch和wax一樣都是通過Objective-C Runtime的接口通過字符串反射找到對應(yīng)的類和方法進(jìn)行調(diào)用,這中間的字符串處理會(huì)損耗一定的性能,另外兩種語言間的類型轉(zhuǎn)換也有性能損耗,若用來做一個(gè)完整的業(yè)務(wù)模塊,大量的頻繁來回互調(diào),可能有性能問題。?
  • 開發(fā)過程中需要用OC的思維寫JS/Lua,喪失了腳本語言自己的特性。?
  • JSPatch和wax都沒有IDE支持,開發(fā)效率低。?
  • 若想動(dòng)態(tài)為APP添加模塊,目前React Native給出了很好的方案,解決了上述三個(gè)問題:?

  • JS/OC不會(huì)頻繁通信,會(huì)在事件觸發(fā)時(shí)批量傳遞,提高效率。(詳見React Native通信機(jī)制詳解)?
  • 開發(fā)過程無需考慮OC的感受,遵從React框架的思想進(jìn)行純JS開發(fā)就行,剩下的事情React Native幫你處理好了。?
  • React Native連IDE都準(zhǔn)備好了。?
  • 所以動(dòng)態(tài)添加業(yè)務(wù)模塊目前還是推薦嘗試React Native,但React Native并不會(huì)提供原生OC接口的反射調(diào)用和方法替換,無法做到修改原生代碼,JSPatch以小巧的引擎補(bǔ)足這個(gè)缺口,配合React Native用統(tǒng)一的JS語言讓一個(gè)原生APP時(shí)刻處于可擴(kuò)展可修改的狀態(tài)。?

    —?

    目前JSPatch處于開發(fā)階段,穩(wěn)定性和功能還存在一些問題,歡迎大家提建議/bug/PR,一起來做這個(gè)項(xiàng)目。
    github地址:?https://github.com/LazyDuan/JSPatch
    來自:http://blog.cnbang.net/works/2767

    轉(zhuǎn)載于:https://www.cnblogs.com/LazyDuan/p/4968887.html

    總結(jié)

    以上是生活随笔為你收集整理的JSPatch – 动态更新iOS APP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。