凡事添加了JSExport協議的協議,所規定的方法變量等,就會對js開放,我們可以通過js調用到
-
如果js是一個參數或者沒有參數的話,就比較簡單,我們的方法名和js的方法名保持一致即可
比如: js方法為 (JS內調用)testobject.TestOneParameter('參數1')
那么 我們在oc中添加的代理方法就為(OC內定義)
-(void)TestOneParameter:(NSString *)message;
- 如果js是多個參數的話 我們代理方法的所有變量前的名字連起來要和js的方法名字一樣比如:
js方法為
testobject.TestTowParameterSecondParameter('參數A','參數B')
他有兩個參數 那么我們的代理方法 就是把js的方法名 TestTowParameterSecondParameter 任意拆分成兩段作為代理方法名(此處我們拆分為 TestTowParameter 和 SecondParameter ) 那么我們的代理方法就是
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
首先創建一個類 繼承NSObject 并且規定一個協議
/#import <Foundation/Foundation.h>
/#import <JavaScriptCore/JavaScriptCore.h>
//首先創建一個實現了JSExport協議的協議
@protocol TestJSObjectProtocol <JSExport>
//此處我們測試幾種參數的情況
-(void)TestNOParameter;
-(void)TestOneParameter:(NSString *)message;
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
@end
//讓我們創建的類實現上邊的協議
@interface TestJSObject : NSObject<TestJSObjectProtocol>
@end
類的實現
/#import "TestJSObject.h"
@implementation TestJSObject
//一下方法都是只是打了個log 等會看log 以及參數能對上就說明js調用了此處的iOS 原生方法
-(void)TestNOParameter
{
NSLog(@"this is ios TestNOParameter");
}
-(void)TestOneParameter:(NSString *)message
{
NSLog(@"this is ios TestOneParameter=%@",message);
}
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2
{
NSLog(@"this is ios TestTowParameter=%@ Second=%@",message1,message2);
}
@end
下面我們在weibview加載完成之后調用測試一下
代碼如下:
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
//網頁加載完成調用此方法
//首先創建JSContext 對象(此處通過當前webView的鍵獲取到jscontext)
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//第二種情況,js是通過對象調用的,我們假設js里面有一個對象 testobject 在調用方法
//首先創建我們新建類的對象,將他賦值給js的對象
TestJSObject *testJO=[TestJSObject new];
context[@"testobject"]=testJO;
//同樣我們也用剛才的方式模擬一下js調用方法
NSString *jsStr1=@"testobject.TestNOParameter()";
[context evaluateScript:jsStr1];
NSString *jsStr2=@"testobject.TestOneParameter('參數1')";
[context evaluateScript:jsStr2];
NSString *jsStr3=@"testobject.TestTowParameterSecondParameter('參數A','參數B')";
[context evaluateScript:jsStr3];
}
結果如下圖