KSWebView?基于 WKWebview 進行二次封裝的 WebView
KSWebView,最好的 WKWebView 繼承者。
KSWebView是基于WKWebview進行2次封裝的WebView。
KSWebView具有:
-
用JS語句的方式調(diào)用原生類/對象,方便快捷,老板提出來的臨時需求也能馬上解決的方式。
-
無縫JS與原生交互 (原生與JS獲得各自的Return值) (一句語句注冊JS方法調(diào)用回調(diào))
-
無縫JS與原生數(shù)據(jù)交互 丟棄cookie,數(shù)據(jù)由自己自由的管理,而且與原生互通。
-
本地數(shù)據(jù)存儲模塊支持KVO,當數(shù)值發(fā)生變化時,注冊了該值的觀察者無論原生還是JS端都可以收到更新回調(diào)
KSWebView的整體結(jié)構(gòu)如下圖
用JS語句的方式調(diào)用原生類/對象
例如我們想要在JS中執(zhí)行下列OC代碼
Objective-C:
UIViewController *vc = [[UIViewController alloc]init]; [vc setTitle:@"測試標題"]; UIColor *whiteColor = [UIColor whiteColor]; [[vc view] setBackgroundColor:whiteColor]; [[vc view] setTag:17287]; UINavigationController *nav = [[[UIApplication sharedApplication] keyWindow] rootViewController]; [nav pushViewController:vc animated:YES];
JavaScript:
//先導入要用到的OC類
var tools = window.OCTools;
var UIViewController = tools.importClass("UIViewController");
var UIColor = tools.importClass("UIColor");
var UIApplication = tools.importClass("UIApplication");
var vc = UIViewController.alloc().init();
vc.setTitle("測試標題");
var white = UIColor.whiteColor();
vc.view().setBackgroundColor(white);
vc.view().setTag(17287);
var nav = UIApplication.sharedApplication().keyWindow().rootViewController();
nav.pushViewControlleranimated(vc, true);
tools.releaseObjects();//調(diào)用完畢后為了防止內(nèi)存溢出必須釋放
是不是很簡單?只要先導入要用到的類,然后就和用JS寫一個OC代碼一樣簡單!需要注意的是,調(diào)用多個參數(shù)的方法時需要去掉所有的冒號,然后將參數(shù)一次按順序放入傳參括號內(nèi),就可以了。例如:
Objective-C:
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"描述信息" delegate:nil cancelButtonTitle:@"關(guān)閉" otherButtonTitles:nil]; [alert show];
JavaScript:
var UIAlertView = window.OCTools.importClass("UIAlertView");
var alert = UIAlertView.alloc().initWithTitlemessagedelegatecancelButtonTitleotherButtonTitles("提示","描述信息",null,"關(guān)閉",null);
alert.show();
window.OCTools.releaseObjects();//調(diào)用完畢后為了防止內(nèi)存溢出必須釋放
返回值類型
一切js可以識別的格式都是可以被js直接使用的(例如:string,number 等等).oc對象結(jié)構(gòu)體等變量承接之后只可以當作方法傳的值,因為js無法識別。這是必然,js是無法使用oc對象的。例如:
Objective-C:
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"描述信息" delegate:nil cancelButtonTitle:@"關(guān)閉" otherButtonTitles:nil]; [alert setTag:15269]; [alert setTitle:@"新標題"]; NSInteger tag = [alert tag]; NSString *title = [alert title]; [alert show];
JavaScript:
var UIAlertView = window.OCTools.importClass("UIAlertView");
var alert = UIAlertView.alloc().initWithTitlemessagedelegatecancelButtonTitleotherButtonTitles("提示","描述信息",null,"關(guān)閉",null);
alert.setTag(15269);
alert.setTitle("新標題");
var tag = alert.tag();//返回的number是可以直接使用的
var title = alert.title();//返回的string是可以直接使用的
alert.show();
window.OCTools.releaseObjects();//調(diào)用完畢后為了防止內(nèi)存溢出必須釋放
Dictionary與Array
快速的將JS對象轉(zhuǎn)換為NSDictionary或?qū)S數(shù)組轉(zhuǎn)換為NSArray
Dictionary:
var data = {
'key': 'value',
'anyKey': 'anyValue'
};
//將JS對象轉(zhuǎn)換為NSDictionary
var NSDictionary = window.OCTools.importClass("NSDictionary");
var dict = NSDictionary.dictionaryWithDictionary(data);
//將NSDictionary轉(zhuǎn)換為JS對象
var jsonString = dict.mj_JSONString();
var jsObject = JSON.parse(jsonString);
window.OCTools.releaseObjects();//調(diào)用完畢后為了防止內(nèi)存溢出必須釋放
Array:
var data = ["NO.1", "NO.2", "NO.3", "NO.4"];
//將JS對象轉(zhuǎn)換為NSDictionary
var NSArray = window.OCTools.importClass("NSArray");
var arr = NSArray.arrayWithArray(data);
//將NSDictionary轉(zhuǎn)換為JS對象
var jsonString = arr.mj_JSONString();
var jsArray = JSON.parse(jsonString);
window.OCTools.releaseObjects();//調(diào)用完畢后為了防止內(nèi)存溢出必須釋放
其實本質(zhì)上JS的對象/數(shù)組可以直接當做NSDictionary/NSArray參數(shù)傳遞,上述只是提供了互相轉(zhuǎn)換的方法。
importClass: 該方法在內(nèi)部已經(jīng)實現(xiàn)了不管你重復import多少次相同的Class都拿到的是相同的一個,所以放心大膽的用,不用擔心,不過最好將其放在界面加載完成后importClass,防止出現(xiàn)問題。
releaseObjects: 因為內(nèi)部對象都是有引用的所以只有調(diào)用了此方法才會銷毀所有對象,如果長期不銷毀內(nèi)存會越來越大,嚴重就會導致崩潰,所以請盡量在使用完oc調(diào)用后調(diào)用此方法來銷毀所有oc對象。
關(guān)于無縫JS與原生交互/本地數(shù)據(jù)存儲模塊支持KVO的介紹請查看demo
