亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

JSPatch庫,一個Apple官方支持的實現在線更新iOS應用的庫

2019-11-14 17:57:54
字體:
來源:轉載
供稿:網友

簡介

JSPatch 可以讓你用 javaScript 書寫原生 iOS APP。只需在項目引入極小的引擎,就可以使用 Javascript 調用任何 Objective-C 的原生接口,獲得腳本語言的優勢:為項目動態添加模塊,或替換項目原生代碼動態修復 bug。

優勢

  • 在項目中引入JSPatch,就可以在發現bug時下發JS腳本替換原生方法,可以做到無需更新整個APP即時修復bug!

  • JSPatch用iOS內置的 JavaScriptCore.framework作為引擎;JSPatch也符合蘋果的規則。蘋果不允許動態下發可執行代碼,但通過蘋果 JavaScriptCore.framework 或 WebKit 執行的代碼除外,JS 正是通過 JavaScriptCore.framework 執行的。

  • JSPatch非常小巧

實例預覽

@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    [JPEngine startEngine];    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"];    NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];    [JPEngine evaluateScript:script];        self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];    [self.window addSubview:[self genView]];    [self.window makeKeyAndVisible];        return YES;}- (UIView *)genView{    return [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];}@end
// demo.jsrequire('UIView, UIColor, UILabel')defineClass('AppDelegate', {  // 替換這個 -genView 方法  genView: function() {    var view = self.ORIGgenView();    view.setBackgroundColor(UIColor.greenColor())    var label = UILabel.alloc().initWithFrame(view.frame());    label.setText("JSPatch");    label.setTextAlignment(1);    view.addSubview(label);    return view;  }});

安裝

通過Cocopods安裝

pod 'JSPatch' # 在線更新應用.

手動導入

  1. 下載https://github.com/bang590/JSPatch并解壓

  2. 復制JSPatch文件夾到你的工程

使用

objective-C:

  1. 導入頭文件#import "JPEngine.h"

  2. 導入本地JS(demo.js)見文首github示例demo(可選,實際項目中,根據自己實際需要進行.)

  3. 調用[JPEngine startEngine] 加載引擎
  4. 通過[JPEngine evaluateScript:@""]接口執行 JavaScript。

[JPEngine startEngine];// 直接執行js[JPEngine evaluateScript:@"/ var alertView = require('UIAlertView').alloc().init();/ alertView.setTitle('Alert');/ alertView.setMessage('AlertView from js'); / alertView.addButtonWithTitle('OK');/ alertView.show(); /"];// 從網絡拉回js腳本執行[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://cnbang.net/test.js"]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {    NSString *script = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];    [JPEngine evaluateScript:script];}];// 執行本地js文件NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"js"];NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];[JPEngine evaluateScript:script];
// 另一個例子// 加載引擎[JPEngine startEngine];    //  本地JS,動態更新技術就是通過服務器獲取JS更新這個JSNSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"];NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];[JPEngine evaluateScript:script]

JavaScript:

基礎使用方式

// 調用require引入要使用的OC類require('UIView, UIColor, UISlider, NSIndexPath')// 調用類方法var redColor = UIColor.redColor();// 調用實例方法var view = UIView.alloc().init();view.setNeedsLayout();// set PRoertyview.setBackgroundColor(redColor);// get property var bgColor = view.backgroundColor();// 多參數方法名用'_'隔開:// OC:NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:1];var indexPath = NSIndexPath.indexPathForRow_inSection(0, 1);// 方法名包含下劃線'_',js用雙下劃線表示// OC: [JPObject _privateMethod];JPObject.__privateMethod()// 如果要把 `NSArray` / `NSString` / `NSDictionary` 轉為對應的 JS 類型,使用 `.toJS()` 接口.var arr = require('NSMutableArray').alloc().init()arr.addObject("JS")jsArr = arr.toJS()console.log(jsArr.push("Patch").join(''))  //output: JSPatch// 在JS用字典的方式表示 CGRect / CGSize / CGPoint / NSRangevar view = UIView.alloc().initWithFrame({x:20, y:20, width:100, height:100});var x = view.bounds.x;// block 從 JavaScript 傳入 Objective-C 時,需要寫上每個參數的類型。// OC Method: + (void)request:(void(^)(NSString *content, BOOL success))callbackrequire('JPObject').request(block("NSString *, BOOL", function(ctn, succ) {  if (succ) log(ctn)}));// GCDdispatch_after(function(1.0, function(){  // do something}))dispatch_async_main(function(){  // do something})

詳細文檔請參考wiki頁面:基礎用法

定義類/替換方法

defineClass() 定義 Objective-C 的類,對類和實例方法進行動態替換。

// OC@implementation JPTableViewController...- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{  NSString *content = self.dataSource[[indexPath row]];  //may cause out of bound  JPViewController *ctrl = [[JPViewController alloc] initWithContent:content];  [self.navigationController pushViewController:ctrl];}- (NSArray *)dataSource{  return @[@"JSPatch", @"is"];}- (void)customMethod{  NSLog(@"callCustom method")}@end
// JSdefineClass("JPTableViewController", {  // instance method definitions  tableView_didSelectRowAtIndexPath: function(tableView, indexPath) {    var row = indexPath.row()    if (self.dataSource().count() > row) {  //fix the out of bound bug here      var content = self.dataSource().objectAtIndex(row);      var ctrl = JPViewController.alloc().initWithContent(content);      self.navigationController().pushViewController(ctrl);    }  },  dataSource: function() {    // get the original method by adding prefix 'ORIG'    var data = self.ORIGdataSource().toJS();    return data.push('Good!');  }}, {})

詳細文檔請參考wiki頁面:defineClass的用法

擴展

一些自定義的struct類型、C函數調用以及其他功能可以通過擴展實現,調用 +addExtensions: 可以加載擴展接口:

@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    [JPEngine startEngine];    //添加擴展    [JPEngine addExtensions:@[@"JPInclude", @"JPCGTransform"]];    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"];    NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];    [JPEngine evaluateScript:script];}
include('test.js')   //`include()`方法在擴展 JPInclude.m 里提供var view = require('UIView').alloc().init()//struct CGAffineTransform 類型在 JPCGTransform.m 里提供支持view.setTransform({a:1, b:0, c:0, d:1, tx:0, ty:100})

擴展可以在JS動態加載,更推薦這種加載方式,在需要用到時才加載:

require('JPEngine').addExtensions(['JPInclude', 'JPCGTransform'])// `include()` and `CGAffineTransform` is avaliable now.

可以通過新增擴展為自己項目里的 struct 類型以及C函數添加支持,詳情請見wiki頁面:添加新擴展

安全性

JSPatch非常強大,因而最好將通過服務器獲取JS的鏈接進行加密,本地JS也最好加密處理


注: 文章由我們 iOS122 的小伙伴 * 整理,喜歡就一起參與: iOS122 任務池


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕av一区中文字幕天堂| 久久久国产91| 欧美做受高潮1| 精品久久久久久久久久久久久久| 国产成人精品在线视频| 日韩中文字幕不卡视频| 亚洲aⅴ日韩av电影在线观看| 久久精品国产2020观看福利| 国产视频久久久| 国产一区二区三区高清在线观看| 欧美日韩亚洲天堂| 亚洲第一在线视频| 亚洲国产精品女人久久久| 中文字幕欧美日韩在线| 九九热精品视频国产| 亚洲人成在线电影| 国产91在线播放九色快色| 国产啪精品视频| 欧美精品videosex性欧美| 欧美大片欧美激情性色a∨久久| 91国偷自产一区二区三区的观看方式| 日韩美女视频在线观看| 亚洲精品99久久久久中文字幕| 一个人看的www久久| 久久精品国产99国产精品澳门| 欧美激情xxxx| 精品久久久久久久久久久久| 国产一区二区三区精品久久久| 亚洲国产精品久久91精品| 日av在线播放中文不卡| 亚洲a∨日韩av高清在线观看| 欧美激情视频三区| 欧美一级高清免费| 在线播放国产一区中文字幕剧情欧美| 欧美视频在线免费看| 热久久免费国产视频| 91国产美女视频| 久久夜色精品国产| 国产精品嫩草视频| 97碰在线观看| 久久成人人人人精品欧| 青青草原成人在线视频| 日韩免费av片在线观看| 色妞色视频一区二区三区四区| 国产精品久久久久久亚洲调教| 国产精品视频专区| 日韩精品极品视频免费观看| 日韩国产精品亚洲а∨天堂免| 成人字幕网zmw| 亚洲精品久久久久中文字幕二区| 国产精品久久久久影院日本| 成人夜晚看av| 久久久久久免费精品| 91高清视频免费观看| 狠狠色狠狠色综合日日五| 最近2019年手机中文字幕| 亚洲区中文字幕| 日韩视频一区在线| 欧美一级在线亚洲天堂| 欧美激情国产日韩精品一区18| 欧美亚洲免费电影| 亚洲国产小视频在线观看| 最近2019年中文视频免费在线观看| 97精品伊人久久久大香线蕉| 日韩精品久久久久| 欧美黄色片在线观看| 国产成人精品久久久| 亚洲第一区第一页| 中文字幕亚洲激情| 国产成人亚洲综合青青| 国产成人av在线播放| 成人日韩在线电影| 欧洲永久精品大片ww免费漫画| 91精品久久久久久久久不口人| 国产精自产拍久久久久久蜜| 国产成人精品在线播放| 日韩欧美精品中文字幕| 欧美午夜女人视频在线| 久久久精品日本| 亚洲一区二区免费在线| 亚洲精品久久久久中文字幕二区| 中文字幕国产精品久久| 中文字幕日韩在线视频| 成人午夜在线观看| 国产精品国产亚洲伊人久久| 日本一欧美一欧美一亚洲视频| 国产一区二区丝袜高跟鞋图片| 日韩电影在线观看永久视频免费网站| 国产亚洲欧美aaaa| 992tv在线成人免费观看| 日韩国产精品视频| 国产剧情久久久久久| 久久久久久综合网天天| 久久亚洲私人国产精品va| 成人精品福利视频| 欧美—级高清免费播放| 伊人久久综合97精品| 538国产精品视频一区二区| 国产精品免费看久久久香蕉| 国产精品视频专区| 奇米影视亚洲狠狠色| 国产日韩欧美日韩大片| 亚洲午夜精品久久久久久性色| 两个人的视频www国产精品| 久久久久久久久久久国产| 米奇精品一区二区三区在线观看| xxxxx91麻豆| 欧美一区视频在线| 精品久久久国产精品999| www.亚洲人.com| 午夜剧场成人观在线视频免费观看| 91成人精品网站| 久久久久久久亚洲精品| 中文字幕国产日韩| 91在线看www| 久久久999精品视频| 日本亚洲欧洲色| 亚洲高清不卡av| 久久国产精品久久精品| 成人欧美一区二区三区在线湿哒哒| 国产视频久久久久久久| 日韩免费观看在线观看| 欧美国产日韩一区二区三区| 爽爽爽爽爽爽爽成人免费观看| 亚洲色图第一页| 中国人与牲禽动交精品| 久久久亚洲福利精品午夜| 久久久免费观看视频| 欧美丰满少妇xxxxx| 国产在线精品成人一区二区三区| 欧美视频一区二区三区…| 亲子乱一区二区三区电影| 国产亚洲免费的视频看| 成人免费福利视频| 亚洲精品国产精品国自产观看浪潮| 中国china体内裑精亚洲片| 日韩成人在线电影网| 欧美成人午夜影院| 日韩av在线导航| 久久人人爽人人| 欧美激情videoshd| 国产欧美一区二区三区久久| 一区二区三区动漫| 国产精品久久久久久搜索| 日本国产精品视频| 欧美黑人性视频| 久久99久久久久久久噜噜| 国产美女久久精品香蕉69| 亚洲欧美日韩精品久久亚洲区| 在线电影av不卡网址| 91高清视频免费观看| 91丝袜美腿美女视频网站| 亚洲欧美一区二区精品久久久| 国产精品视频色| 91黑丝在线观看| 国产成人精品综合| 国外视频精品毛片| 国产亚洲美女久久| 亚洲毛片在线免费观看| 92裸体在线视频网站| 51精品国产黑色丝袜高跟鞋| 91在线看www| 亚洲少妇中文在线| 欧美亚洲成人网|