JS調OC函數(shù)步驟:
- 添加庫并導入頭文件#import <JavaScriptCore/JavaScriptCore.h>;
- 定義協(xié)議JSObjectDelegate<JSExport>類,且不能用@optional修飾(原因未知?);
// 此協(xié)議必須遵守 JSExport
// 此協(xié)議中的方法就是 web 定義的方法名
@protocol JSObjectDelegate <JSExport>
#warning 為什么添加了 @optional 下面的方法不會掉用呢 ??
//@optional
- (void)callCamera;
- (void)share:(NSString *)shareContent;
@end
展示webView的類遵守JSObjectDelegate協(xié)議;
@interface BaseWebViewController()
<JSObjectDelegate,UIWebViewDelegate>
@property (nonatomic, strong) UIWebView *webView;
@property (nonatomic, strong) JSContext *jsContext;
@end-
-(void)webViewDidFinishLoad:(UIWebView *)webView 方法中注入OC與web的橋梁對象為self;
- (void)webViewDidFinishLoad:(UIWebView *)webView { // 網頁加載完成 // 首先創(chuàng)建一個 JSContext 對象,通過當前的webView的鍵值獲取 self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScri ptContext"]; // Toyun 為 web 和 OC 定義的 注入橋梁對象名Toyun, self.jsContext[@"Toyun"] = self; self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) { NSLog(@"異常信息:%@", exceptionValue); }; }
JSObjectDelegate 方法實現(xiàn):
#pragma mark -- JSObjectDelegate
- (void)callCamera
{
NSLog(@" /// JS Call OC callCamera ///");
// 執(zhí)行完OC代碼,,有必要則回調 JS
// JSValue *picCallback = self.jsContext[@"picCallback"];
// [picCallback callWithArguments:@[@"images"]];
NSString *jsFuncStr = @"picCallback('images')";
[self.jsContext evaluateScript:jsFuncStr];
}
- (void)share:(NSString *)shareContent
{
NSLog(@" /// JS Call OC Share: %@",shareContent);
// 執(zhí)行完OC代碼,,有必要則回調 JS
// JSValue *shareCallback = self.jsContext[@"shareCallback"];
// [shareCallback callWithArguments:nil];
NSString *jsFuncstr2 = @"shareCallback()";
[self.jsContext evaluateScript:jsFuncstr2];
}
OC回調JS的兩種方法:
1、 讀取回調web頁面的方法轉化為string,用jsContext調用:
NSString *jsFuncStr = @"picCallback('images')";
[self.jsContext evaluateScript:jsFuncStr];
2、將web頁面的方法名轉化為JSValue,再調用:
JSValue *picCallback = self.jsContext[@"picCallback"];
[picCallback callWithArguments:@[@"images"]];