淺談JS與OC相互調(diào)用并傳參(一)

前幾天忙著微信支付,這幾天剛剛抽出時間寫一寫之前在工作中研究的JS調(diào)用OC方法,還有就是OC給JS傳值.我之前工作在APP中加入一個WebView,但是在APP中登錄的同時也要在WebView中同時登陸,我們研究了一個方法就是把token/model/手機(jī)類型(iOS或Android)/ 同時在js中根據(jù)token是否為NULL,來調(diào)用APP的登錄方法.

JS與OC相互相互調(diào)用,我知道的是有三種方法

1.WebViewJavascriptBridge(第三方) 2.WKWebView(據(jù)說以后要代替WebView) 3.JSExport(JavaScrptCore框架) 4.webView shouldStartLoadWithRequest:中截取JS傳過來的URL調(diào)用方法并傳值.
**
博主用的則是最后一種和"JSExport".先主要講一下JSExport的用法吧.
首先需求是,我要把我這邊的token.model.和設(shè)備信息傳給JS
**


**
首先添加JavaScriptCore.framework框架
**

添加JavaScriptCore框架

**
導(dǎo)入頭文件
**
import <JavaScriptCore/JavaScriptCore.h>
**
加載本地HTML
**

    NSString *basePath = [[NSBundle mainBundle]bundlePath];
    NSString *helpHtmlPath = [basePath stringByAppendingPathComponent:@"GroupPay.html"];
    NSURL *url = [NSURL fileURLWithPath:helpHtmlPath];    
    [_webView loadRequest:[NSURLRequest requestWithURL:url]];

**
在 webViewDidFinishLoad:(UIWebView *)webView調(diào)用(前提要給webView加代理)
**


-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    
    if ([BNCUserDefault objectForKey:@"token"] == nil) {
        NSString *token = @"null";
        NSString *model = @"null";
        NSString *ios = @"ios";
        JSValue *picCallback = self.context[@"picCallback"];
        [picCallback callWithArguments:@[token,model,ios]];
    } else {
        NSString *token = [[NSUserDefaults standardUserDefaults] objectForKey:@"token"];
        NSString *model =[BNCUserDefault objectForKey:@"model"];
        NSString *ios = @"ios";
        JSValue *picCallback = self.context[@"picCallback"];
        [picCallback callWithArguments:@[token,model,ios]];

    }

**
在JS端是這樣寫的
**



  
                 var picCallback = function(token,model,app) {
                     alert(token);
                     alert(model);
                     alert(app);
                }

**
我們運行一下看一下效果
**

token的alert
model的alert
設(shè)備信息

**
接下來我使用一種方法調(diào)用JS的方法并返回給參數(shù)
**



self.context[@"model"] = ^() {
        NSLog(@"調(diào)用model的方法");
        NSString *model =[BNCUserDefault objectForKey:@"model"];
       return model;
}

**
在JS端我是這樣寫的
**

        var a = model();
        alert(a);
        
Paste_Image.png

但這個也會有個問題:問題是這個在網(wǎng)頁加載之后我們會把這個值傳給JS,但是JS是要在加載網(wǎng)頁過程中拿到這些值,所以在調(diào)用中往往會獲得一個nil.然而這個問題困擾我好久,最后只能在JS端加了一個延遲加載,這個會對速度和用戶體驗會有影響的.好先寫到這吧


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容