目前JS調用OC主要分為兩種情況
1.JS里面直接調用方法;
2.JS里通過對象調用方法;
方式1:JS里面直接調用方法(使用block),該方式開發中一般不采用,故簡單代過
//網頁加載完成調用此方法
-(void)webViewDidFinishLoad:(UIWebView*)webView
{
? ? ? ?//iOS調用JS ,首先創建JSContext 對象(此處通過當前webView的鍵獲取到jscontext)
? ? ? JSContext*context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
? ? ? //js調用iOS
? ? ? //第一種情況
? ? ? //其中test1就是js的方法名稱,賦給是一個block 里面是iOS代碼
? ? ?//此方法最終將打印出所有接收到的參數,js參數是不固定的 我們測試一下就知道
? ? ?context[@"test1"] = ^() {
? ? ?NSArray*args = [JSContextcurrentArguments];
? ? ?for(id obj in args) {
? ? ?NSLog(@"%@",obj);
? ? ?}
};
? ? ? ? ?//首先準備一下js代碼,來調用js的函數test1 然后執行
? ? ? ? //一個參數
? ? ? ? ?NSString*jsFunctStr=@"test1('參數1')";
? ? ? ? [contextevaluateScript:jsFunctStr];
? ? ? ? //二個參數
? ? ? ?NSString*jsFunctStr1=@"test1('參數a','參數b')";
? ? ? ?[contextevaluateScript:jsFunctStr1];
}
方式2:JS里通過對象調用方法
新建IOSBridge繼承自NSObject,然后導入JS交互類庫頭文件#import<JavaScriptCore/JavaScriptCore.h>
(1).首先創建一個實現了JSExport協議的協議
@protocol IOSBridgeProtocol
-(NSString*)getData:(NSString*)params;
-(NSString*)doAction:(NSString*)params;
@end
(2).定義代理屬性
@property(nonatomic, weak) id delegate;
(3).在IOSBridge.m文件中實現方法
-(NSString*)getData:(NSString*)params
{
? ? ? TTLog(@"調用了getData--- %@",params);
? ? ? ?return @"黃文濤";
}
-(NSString*)doAction:(NSString*)params
{
? ? ?TTLog(@"調用了doAction--- %@",params); ?
? ? ? return @"黃文濤";
}
(4).如何使用
導入#import"IOSBridge.h"
然后,定義私有屬性
@property(nonatomic, strong) JSContext*context;
獲取JSContext
_context= [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
IOSBridge*iOSBridge = [[IOSBridge alloc] init];
self.context[@"IOSBridge"] = iOSBridge;
ok ,兩種方式都完成了,歡迎交流指正, 本人QQ:1334627194