本文目錄一覽:
如何用js調用ios
基本流程:
先看一下Web中,我們給h1標籤添加一個onclick事件,讓它在被點擊之後,修改當前的url。
Web中的HTML代碼:
html
head
script
function getInfo(name)
{
window.location = “/getInfo/”+name;
}
/script
/head
body
h1 onclick=”getInfo(‘why’)”Name/h1
/body
/html
iOS中,先拖拽WebView,訪問localhost,然後通過WebView的委託事件監聽url跳轉操作,並且把跳轉截取下來。
也就是說,在onclick的時候,普通瀏覽器灰跳轉到那個url,但是在iOS的這個WebView裏面,這個跳轉會被攔截,
用這種方式可以巧妙地實現JS調用iOS的原生代碼:
//
// DWViewController.m
// DareWayApp
//
// Created by why on 14-6-3.
// Copyright (c) 2014年 DareWay. All rights reserved.
//
#import “DWViewController.h”
@interface DWViewController ()
@property (weak, nonatomic) IBOutlet UIWebView *myWebview; // 主頁面
@end
@implementation DWViewController
– (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 適配iOS6的狀態欄
if ([[[UIDevice currentDevice] systemVersion] floatValue] = 7) {
_myWebview.frame = CGRectMake(0,20,self.view.frame.size.width,self.view.frame.size.height-20);
}
// 加載制定的URL
NSURL *url =[NSURL URLWithString:@””];
NSURLRequest *request =[NSURLRequest requestWithURL:url];
[_myWebview setDelegate:self];
[_myWebview loadRequest:request];
}
// 網頁中的每一個請求都會被觸發
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
// 每次跳轉時候判斷URL
if([request.mainDocumentURL.relativePath isEqualToString:@”/getInfo/why”])
{
NSLog(@”why”);
return NO;
}
return YES;
}
– (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
iOS – OC 與 JS 交互六種方式總結
在 APP 中,免不了與 H5頁面打交道,所以掌握 與 JS 交互就顯的至關重要,本文總結了常見的與 JS 交互方式。
注意事項
在 OC 原生中
在 html 文件中
早期的JS與原生交互的開源庫很多都是用得這種方式來實現的,例如:PhoneGap、 WebViewJavascriptBridge 。
效果圖
使用WKNavigationDelegate中的代理方法,攔截自定義的 URL 來實現 JS 調用 OC 方法。
注意點
關於如何區分執行不同的OC 方法,也與UIWebView的處理方式一樣,通過URL 的host 來區分執行不同的方法:
JS 調用OC 方法後,有的操作可能需要將結果返回給JS。這時候就是OC 調用JS 方法的場景。
WKWebView 提供了一個新的方法 evaluateJavaScript:completionHandler: ,實現OC 調用JS 等場景。
注意點
運行結果
在iOS 7之後,apple添加了一個新的庫JavaScriptCore,用來做JS交互,因此JS與原生OC交互也變得簡單了許多。
首先導入JavaScriptCore庫, 然後在OC中獲取JS的上下文。
再然後定義好JS需要調用的方法,例如JS要調用share方法:
則可以在UIWebView加載url完成後,在其代理方法中添加要調用的share方法:
OC 調用 JS 方法有多種,首先介紹使用JavaScriptCore框架的方式。
使用JSContext 的方法 -evaluateScript ,可以實現 OC 調用 JS 方法
效果圖
使用WKWebView的時候,如果想要實現JS調用OC方法,除了攔截URL之外,還有一種簡單的方式。那就是利用WKWebView的新特性MessageHandler來實現JS調用原生方法。
創建 WKWebViewConfiguration 對象,配置各個API對應的MessageHandler。
然後在界面即將顯示的時候添加MessageHandler
需要注意的是addScriptMessageHandler很容易引起循環引用,導致控制器無法被釋放,所以需要移除MessageHandler
這裡實現了兩個協議 WKUIDelegate,WKScriptMessageHandler , WKUIDelegate 是因為我在JS中彈出了alert 。 WKScriptMessageHandler 是因為我們要處理JS調用OC方法的請求。
WKScriptMessage 有兩個關鍵屬性 name 和 body 。
因為我們給每一個OC 方法取了一個name,那麼我們就可以根據name 來區分執行不同的方法。body 中存着JS 要給OC 傳的參數。
關於參數body 的解析,我就舉一個body中放字典的例子,其他的稍後可以看demo。
解析JS 調用OC 實現分享的參數:
message.boby 就是JS 里傳過來的參數。我們不同的方法先做一下容錯性判斷。然後正常取值就可以了。
下面只列舉一個shareClick()方法,其他看Demo
這裡使用WKWebView 實現OC 調用JS方法與之前說的文章一樣,通過
– evaluateJavaScript:completionHandler:
效果圖如下圖所示
詳情看下面文章鏈接
iOS下 JS 與 OC 互相調用(五) – UIWebView+WebViewJavascriptBridge
詳情看下面文章鏈接
iOS下 JS 與 OC 互相調用(六) – WKWebView+WKWebViewJavascriptBridge
iOS下 JS 與OC 互相調用(一) – UIWebView 攔截 URL
iOS下 JS 與OC 互相調用(二) – JavaScriptCore
iOS 下 JS 與 OC 互相調用(三) – WKWebView 攔截 URL
iOS下JS與OC互相調用(四)-MessageHandler
iOS下 JS 與 OC 互相調用(五) – UIWebView+WebViewJavascriptBridge
iOS下 JS 與 OC 互相調用(六) – WKWebView+WKWebViewJavascriptBridge
原生APP中js怎樣與Android和ios進行交互
一、對於Android和ios我們要執行不同的操作,下面是判斷系統的js代碼
// alert(ismobile(1)); 1表示Android,0表示ios
function ismobile(test){
var u = navigator.userAgent, app = navigator.appVersion;
if(/AppleWebKit.*Mobile/i.test(navigator.userAgent) || (/MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alcatel|BIRD|DBTEL|Dopod|PHILIPS|HAIER|LENOVO|MOT-|Nokia|SonyEricsson|SIE-|Amoi|ZTE/.test(navigator.userAgent))){
if(window.location.href.indexOf(“?mobile”)lt;0){
try{
if(/iPhone|mac|iPod|iPad/i.test(navigator.userAgent)){
return ‘0’;
}else{
return ‘1’;
}
}catch(e){}
}
}else if( u.indexOf(‘iPad’) gt; -1){
return ‘0’;
}else{
return ‘1’;
}
}
二、js調用app端函數,下面是js代碼
if(ismobile(1)==1){
Android.setTypeActivity(id,type,href);
}else{
jsToios(id,type,href);
}
setTypeActivity是Android端定義的函數,jsToios是ios端定義的函數,括號里是js端傳遞的參數。
三、至於js端怎樣獲取app端的數據,只需在js端提供給app端函數名字,在通知app端調用即可
四、還有一種方法可以不通過app的方法將數據傳遞給另一個頁面,那就是通過URL的方式
在本頁面將數據拼接在ip後面
在另外一個頁面通過下面方法獲取URL後的參數
function GetRequest() {
var url = location.search; //獲取url中”?”符後的字串
var theRequest = new Object();
if (url.indexOf(“?”) != -1) {
var str = url.substr(1);
strs = str.split(“”);
for(var i = 0; i strs.length; i ++) {
theRequest[strs[i].split(“=”)[0]]=decodeURIComponent(strs[i].split(“=”)[1]);
}
}
return theRequest;
}
// 獲取URL參數
var Request = new Object();
Request = GetRequest();
var name;
name = Request[‘name’];
如何用JS調用幾十萬原生API
《近匠》HBuilder:如何用JS調用幾十萬原生API?
近匠訪談開發工具HBuilder王安DCloudHTML5
摘要:《近匠》第25期:HBuilder是DCloud開發的一套Web開發IDE,它通過完整的語法提示和代碼輸入法、代碼塊等,大幅提升HTML、JS、css的開發效率。更有意思的是,它可以利用JS調用原生API。
CSDN:請講講團隊和您以往的從業經歷?
DCloud CEO王安:我們團隊從03年起開始做手機App,從J2me、Symbian、Win mobile、Brew一直做到現在的Android、iOS和WP。之前一直在為企業市場提供跨平台手機App的無線中間件。
後來我們看好HTML5的前途,而且也經不住toC市場的誘惑,就毅然出來二次創業。成立了 DCloud.io,開始做基於HTML5的生態系統服務,包括開發工具和雲服務。
我們是W3C的會員,也是HTML5中國產業聯盟的發起單位。我們是一個典型的輕團隊,人不多,但極客化。我們的合伙人之一王淮也在Facebook工作了很久,給我們帶來了很多硅谷的模式。
CSDN:為什麼要做HBuilder這樣一款工具?
王安:人稱HTML5是「性、工、能」缺失,其中「工」指工具不給力,確實如此。
任何主流編程語言,都有優秀的開發IDE,不管是java、.net、Obj-C,但HTML5領域卻一直在用低效的文本編輯器開發。我個人用了十幾年文本編輯器,對比我熟悉的其他語言的IDE,效率也實在讓我受不了。我們就動手開發了HBuilder。
HTML十幾年前初生時,是簡單的標記語言,確實文本編輯器足矣。那時候寫頁面的人都不被視為真正的程序員。但時代不同了,現在JS、css已經發展為真正的編程語言,一個工程會非常龐大,此時沒有IDE會很低效。就像用文本編輯器寫java或Obj-C一樣,效率比專業IDE差很多。
過去也確實沒有太好的HTML5 IDE,更不用提免費的好工具。因為web IDE開發確實很困難,web語法庫沒有統一標準,月月更新,JS是無類型的動態語言……
但是有問題,就會有解決問題的人。所以我們花費大力氣,建立最全的語法庫和瀏覽器兼容數據庫,開發動態JS解析引擎,開源框架語法庫。並且我們在開發效率提升上下了非常大的功夫,快是HBuilder最大的特點,能提升數倍開發效率。
另一方面,HTML5的重要價值是開發手機App,HBuilder為開發者提供移動App開發的全套支持,支持插上數據線真機聯調,不需xcode等原生開發環境就能打包手機App。此外,我們有項創新的技術是JS調用幾十萬原生API。
CSDN:HBuilder是針對移動應用的哪一個環節?在這個環節中,現在是一種什麼狀況?格局是什麼樣的?
王安:使用HTML5、JS、css開發跨平台手機App,這類工具其實之前已經有Phonegap、Titanium。從品類相比,Phonegap只有Runtime沒有IDE,Titanuim的IDE是為其特殊API而製作的專有工具。但HBuilder是一個通用的HTML5開發IDE且又內置了手機runtime。也就是開發者只需要HBuilder就夠了,PC web、Mobile web、App,一個工具一套代碼。
我們推崇一個理念叫「響應式應用」:一套代碼根據不同運行環境調用不同能力來優化用戶體驗。比如文本框,在普通瀏覽器下就是一個文本輸入框,在Chrome瀏覽器下運行時加個判斷調Chrome的語音輸入,而運行在App模式下,則再加一個判斷調用原生的語音識別SDK,比如plus.speech。這樣一個應用可以根據設備的不同而最大化的優化用戶體驗,這種模式很有魅力,對用戶而言體驗更好,對開發者而言成本更低。
當然,比其他同類產品更神奇的一點是,HBuilder里能通過JS代碼的寫法操作幾十萬原生API,即Obj-C和Android原生的對象。
CSDN:HTML5在跨平台App開發上有哪些問題?
王安:前景美好,但卻有四個致命缺點阻礙它的爆發,就是「性、工、能」缺失,碎片化嚴重。相對於原生,HTML5的App性能低,工具差,能力弱。原生雖然不跨平台,但HTML5的瀏覽器兼容性也讓開發者撓頭。HBuilder為了解決這些難題做了很多努力。
1. 先說工具
HBuilder大幅提升了HTML5開發效率。並且也擁有最全且實時更新的HTML5新語法庫。瀏覽器更新版本後一周內其新增的語法就可以被HBuilder提示出來。
HBuilder追求快,還有一個目的,就是降低開發者對框架的依賴。PC Web里框架非常流行,很多框架簡化了開發。但是框架的簡化開發建立在性能下降的基礎上,手機上HTML5本來就慢,層層封裝後只會越來越慢。但開發者使用HBuilder會發現,在HBuilder里不用框架開發的速度,比用其他開發編輯器配合框架的速度,更快。
目前主流HTML5開發工具都更新在沒有手機真機聯調等功能,HBuilder提供了這些功能才能有效的語法庫里幫助開發者開發手機App。
2. 瀏覽器兼容性
由於瀏覽器內核不同,自有擴展語法多,新語法增加速度快,導致碎片化很嚴重,而且是持續性的給開發者造成困擾。HBuilder里每個語法,都有瀏覽器兼容性說明,是目前最全的瀏覽器兼容數據庫。見下圖,-webkit-user-select這個屬性的值域all,IE和Firefox自然不支持,圖標為灰色。但同為webkit內核,Chrome支持;而Android瀏覽器不支持,圖標為灰色;Safari也只有7.0以上才支持,圖標是半亮。
有人說手機上都是webkit內核瀏覽器,應該沒有兼容性問題。但上圖告訴開發者殘酷的真相:iOS、Safari、Android瀏覽器、Chrome安卓版,主流的3款手機瀏覽器一樣有兼容性問題。Google和Apple聯手打破IE的壟斷後,又開始分裂,Chrome去年另起了Blink引擎,開始獨立擴展語法。另外雖然Safari的Mac版和iOS版有點差別,但不多;而Chrome的Android版和Android系統自帶的瀏覽器完全是2個產品。作為開發者,我甚至有點懷念IE壟斷市場的日子。
我們努力做出這個瀏覽器兼容庫,希望可以幫助到廣大開發者。
3. 能力
HTML5規範的好處是跨平台的,但壞處是規範能力比原生差非常多。為了解決這個問題,我們推出了兩套方案:HTML5+的跨平台規範和JS直調原生API。
HTML5+的跨平台規範:開發者常用的手機能力,封裝在HTMLplus.org規範里,包括二維碼、語音輸入等,比如在JS里輸入plus.barcode調用二維碼,plus.speech調用語音輸入。開發一次在不同手機上都可以運行。
JS直調原生API:我們提供了plus.ios和plus.android這2個很神奇的對象,使得web開發者不用學習Obj-C,不用買Mac設備,就能在JS里調用原生對象。我們可以這麼定義一個JS變量,但實際上是Obj-C對象:我們可以這麼定義一個JS變量,但實際上是Obj-C對象:JS直調原生API:我們提供了plus.ios和plus.android這2個很神奇的對象,使得web開發者不用學習Obj-C,不用買Mac設備,就能在JS里調用原生對象。我們可以這麼定義一個JS變量,但實際上是Obj-C對象:
var a = plus.ios.implements(“NSObject”,{“authenticationChanged:”:authenticationChanged});
或者如下圖中的:var Intent = plus.android.import(“android.content.Intent”);其中的”android.content.Intent”是Android的原生類。這段代碼就是使用JS方式給在安卓手機桌面創建一個App快捷方式。
這樣,使用HTML5編程的App,在能力方面就和原生一樣強大了。 以前用HTML5做的遊戲都無法調用Game Center,O2O應用也調不了Passbook,現在這些都輕而易舉。我們相信這對於web工程師而言,是極大的能力解放,充滿機會的一扇新窗口!
4. 性能
HTML5應用的性能一直是這個產業發展的瓶頸。
手機硬件比PC差、HTML5作為解釋性語言比原生的編譯型語言性能差、手機瀏覽器的默認控件樣式未優化導致需要在應用層重新封裝UI。這一系列問題疊加在一起,使得性能成為所有HTML5開發者心頭的痛。
另外前端工程師大多長於UI,相比服務器工程師,他們的代碼性能也要低不少。比如前端工程師很習慣使用框架,框架層層封裝越來越慢,性能如何上的去。HBuilder在解決這個問題上也花費了很多心血:
a. 調用原生繪製界面
在HTML5+規範里有一個plus.ui的子集。一些原生樣式或動畫,比如翻頁動畫或下拉刷新,使用HTML5+JS+css模擬要寫很多代碼,執行起來很慢,此時通過plus.ui擴展就可以在窗體上設置一塊區域,交給原生繪製。性能可大幅提升。
b. 性能第一的UI庫
以前宣稱為手機優化的框架,其實都不是把性能作為產品取捨的第一優先,或者為了框架使用者方便、或者為了框架維護者方便而犧牲了執行性能。我們決定自己做一個。這個項目我們還在開發中,不久會上線。
我們沒有把它稱為框架而是叫UI庫,是因為這裡的控件都是使用最簡單的css樣式的,直接寫 class=」xxx」。相比於寫成data-role,然後在JS運行時才替換Dom,使用class的方式要高效的 多。
控件含有的必要的JS代碼,也是本着性能優先的原則開發的,代碼極其精簡高效,沒有$等三方框架,但又可以跨手機瀏覽器。並且這套UI庫會和HBuilder的打包機、Runtime深度整合,做到更高性能的優化。
CSDN:相對於編寫大量JS實現來說,HBuilder利用JS調用原生API,有哪些優點?
王安:JS調用原生API,最大的優點,是大大強化了HTML5的能力,突破了瀏覽器的限制,原生有幾十萬API,數量遠多於HTML5。比如攔截Android來電。
JS的執行效率肯定還是低於原生的,提升性能需要使用前述方案。
這項技術對於JS程序員來講是非常友好易學的,他不需要學習原生語言和配置開發環境,只需要查詢每個原生對象是做什麼用的,然後在JS的plus.ios或plus.andriod里把原生類名作為參數傳進去,就可以通過JS調用該原生對象的方法。
我們還製作了一批常用原生代碼模板,包括創建快捷方式、登錄game center的樣例代碼已經預置在HBuilder里。
CSDN:JS調用原生API,是如何實現的?
王安:這個非常複雜,不同的api需要不同的方法,手機、雲、IDE的共同配合。IDE的顯示代碼、打包機編譯、runtime實際運行這幾種情況下執行碼是不同的。
CSDN:HTML5跨平台開發領域的趨勢是怎麼的?
王安:HTML5的光明前途是毋庸置疑的,當Java被攔在iOS門外時、當終端和屏幕越來越多樣時,HTML5的簡單易用和跨平台這些特點都代表了未來的方向。
現在的問題僅僅是阻礙HTML5發展的那幾個難題,會在何時、會被哪些人解決。當性能、工具、能力、兼容性得到有效突破時,HTML5必將迎來發展爆發。
CSDN:接下來針對HBuilder,Dcloud還有哪些計劃?
王安:除了上面提到的高性能手機UI框架,HBuilder下一步會引入SNS和UGC,強化插件體系,聯合眾多開發者打造大家更滿意的工具和服務。我們很認真的開發着這個免費工具,也希望所有開發者都參與到這個工具的打造中來。目前HBuilder已經在 github.com/dcloudio上設立了3個開源項目,歡迎大家一起打造自己滿意的工具。
轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/311373.html