https://blog.csdn.net/wds326598/article/details/105009622/
需求:
需要在手机端用WKWebView加载链接展示html,并且需要与html中按钮做交互
实现:
-
-
-
@interface ViewController ()<WKScriptMessageHandler,WKNavigationDelegate>
-
@property(nonatomic,strong) WKWebView *webView ;
-
@end
-
static NSString *strID = @"pullnewactive";
-
- (void)viewDidLoad {
-
[super viewDidLoad];
-
// Do any additional setup after loading the view.
-
self.title = self.titleName;
-
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
-
//strID: H5界面的标识符
-
WKUserContentController * wkUController = [[WKUserContentController alloc] init];
-
[wkUController addScriptMessageHandler:self name:strID];
-
config.userContentController = wkUController;
-
//创建WKWebView
-
self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight) configuration:config];
-
self.webView.navigationDelegate = self;
-
[self.view addSubview:self.webView];
-
//加载url
-
NSURL * baseUrl = [NSURL URLWithString:self.urlStr];
-
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:baseUrl];
-
[_webView loadRequest:request];
-
}
-
-
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
-
// NSDictionary * parameter = message.body; 如果带参数可以从parameter获取
-
if([message.name isEqualToString:strID]){//点击按钮执行的方法
-
-
}
-
}
-
-
//WKWebView自带可以长按保存图片,加上下面代码,可以取消长按保存图片
-
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
-
//禁止保存图片
-
[self.webView evaluateJavaScript:@"document.documentElement.style.webkitUserSelect='none'" completionHandler:nil];
-
[self.webView evaluateJavaScript:@"document.documentElement.style.webkitTouchCallout='none'" completionHandler:nil];
-
-
}
-
//移除注册的js方法(注意需要移除)
-
-(void)dealloc{
-
[[_webView configuration].userContentController removeScriptMessageHandlerForName:strID];
-
}
-
//如果H5界面有电话需要添加,拨打电话时调用
-
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
-
NSURL *URL = navigationAction.request.URL;
-
NSString *scheme = [URL scheme];
-
if ([scheme isEqualToString:@"tel"]) {
-
NSString *resourceSpecifier = [URL resourceSpecifier];
-
NSString *callPhone = [NSString stringWithFormat:@"telprompt://%@", resourceSpecifier];
-
/// 防止iOS 10及其之后,拨打电话系统弹出框延迟出现
-
dispatch_async(dispatch_get_global_queue(0, 0), ^{
-
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:callPhone]];
-
});
-
}
-
decisionHandler(WKNavigationActionPolicyAllow);
-
}
HTML中需要在按钮点击事件中实现:
-
//不带参数 (pullnewactive)标识符
-
function jsToOcFunction1(){
-
window.webkit.messageHandlers.pullnewactive.postMessage({});
-
}
-
//带参数 (jsToOcWithPrams)标识符
-
function jsToOcFunction2(){
-
window.webkit.messageHandlers.jsToOcWithPrams.postMessage({"params":"我是参数"});
-
}