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

歡迎訪問 生活随笔!

生活随笔

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

javascript

js(javascript)与OC(Objective-C)交互

發(fā)布時間:2025/3/20 javascript 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js(javascript)与OC(Objective-C)交互 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

實質(zhì)上oc與js的通信交互就是發(fā)送消息,也即函數(shù)調(diào)用,iOS7以后官方公布JavaScriptCore framework中很方便我們對他們之間的相互調(diào)用。在以前我們只能通過UIWebView的UIWebViewDelegate協(xié)議來實現(xiàn).

1
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

或者

1
- (void)webViewDidStartLoad:(UIWebView *)webView;
  • oc–>js stringByEvaluatingJavaScriptFromString,其參數(shù)是一NSString 字符串內(nèi)容是js代碼(這又可以是一個js函數(shù)、一句js代碼或他們的組合),當(dāng)js函數(shù)有返回值或一句js代碼有值返回可通過stringByEvaluatingJavaScriptFromString的返回值獲取
  • js–>oc 利用webView的重定向原理(即重新在js中指定document.location的值,此為一url),只要在這個url字符串中按自定義的規(guī)則指定好所需調(diào)用oc中的函數(shù)和參數(shù),然后通過OC中的shouldStartLoadWithRequest函數(shù)去捕獲處理請求。

一 JS調(diào)用OC

js調(diào)用iOS分兩種情況

js里面直接調(diào)用方法

js里面通過對象調(diào)用方法

js里面直接調(diào)用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (void)webViewDidStartLoad:(UIWebView *)webView{

//首先創(chuàng)建JSContext 對象(此處通過當(dāng)前webView的鍵獲取到j(luò)scontext)
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//其中g(shù)etCurrentUser就是js的方法名稱,賦給是一個block 里面是iOS代碼
context[@"getCurrentUser"] = ^() {
//在block中寫OC代碼
return [[NSUserDefaults standardUserDefaults]objectForKey:@"MYJSANDOC"];
};
context[@"encodeParam"] = ^() {
NSArray *args = [JSContext currentArguments];
NSString *param = [NSString stringWithFormat:@"%@",args[0]];
NSString *result = [[[YXBaseRequestManager alloc]init]encryptUseAES:param key:@"1%7jhs#Zjasd&tr*"];
return result;
};

}
js里面通過對象調(diào)用方法

在這個方法中我們需要使用到?JSExport
JSExport是一個協(xié)議,自定義協(xié)議后,里面的聲明變量等會對JS開放,我們即可調(diào)用。

首先我們要自定義一個協(xié)議,添加頭文件#import <JavaScriptCore/JavaScriptCore.h>,繼承自NSObject

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>

//首先創(chuàng)建一個實現(xiàn)了JSExport協(xié)議的協(xié)議
@protocol JSObjectText <JSExport>

//此處我們測試幾種參數(shù)的情況
-(void)JSObjectTextPush;

@end

//讓我們創(chuàng)建的類實現(xiàn)上邊的協(xié)議
@interface JSObject : NSObject<JSObjectText>

@end

在.m中實現(xiàn)

1
2
3
4
5
6
7
8
9
10
11
#import "JSObjectText.h"

@implementation JSObjectText

//本地儲存Key,調(diào)用之后, 檢查key是否存在則說明是否條用了原生方法
-(void)JSObjectTextPush
{
[[NSUserDefaults standardUserDefaults]objectForKey:@"MYJSANDOC"];
}

@end

在weibview加載完成之后調(diào)用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
//網(wǎng)頁加載完成調(diào)用此方法

//首先創(chuàng)建JSContext 對象(此處通過當(dāng)前webView的鍵獲取到j(luò)scontext)
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

//第二種情況,js是通過對象調(diào)用的,我們假設(shè)js里面有一個對象 testobject 在調(diào)用方法
//首先創(chuàng)建我們新建類的對象,將他賦值給js的對象

JSObjectText *text=[JSObjectText new];
context[@"testobject"]=text;

//同樣我們也用剛才的方式模擬一下js調(diào)用方法
NSString *jsStr=@"testobject.JSObjectTextPush()";
[context evaluateScript:jsStr];


}

二 OC調(diào)用JS

方法很簡單,在加載webview后,通過點擊事件,或者 返回值,調(diào)用stringByEvaluatingJavaScriptFromString來實現(xiàn)調(diào)用JS代碼

1
2
3
4
5
6
7
8
9
10
/*
* 點擊事件
* 調(diào)用javaScript的方法postStr()并取得返回值
* 輸出返回值到控制臺
*/
-(void)ocFromJs:(id)sender
{
NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"postStr();"];
NSLog(@"JS返回值:%@",str);
}

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

總結(jié)

以上是生活随笔為你收集整理的js(javascript)与OC(Objective-C)交互的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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