在开发项目中经常会使用到和Js交互的事情,我也是小菜鸟,以我遇到的项目截取的一小段demo与大家分享,这是OC调用Js的电话号码拨打电话功能,话不多说
#import "ViewController.h"
#import <WebKit/WebKit.h>
//1.HTML 要标记添加标记电话代码 2.WKWebView 调用 <WKNavigationDelegate> 代理
@interface ViewController ()<WKNavigationDelegate, WKUIDelegate,WKScriptMessageHandler>
@property (nonatomic, strong) WKWebView *wkWebView;
@end
在viewDidLoad去实现JS交互初始化
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.preferences.minimumFontSize = 50;
self.wkWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height) configuration:config];
[self.view addSubview:self.wkWebView];
self.wkWebView.UIDelegate = self;
self.wkWebView.navigationDelegate = self;
// https://m.benlai.com/huanan/zt/1231cherry
// http://47.105.214.158:8081/h5/service.jsp
NSURL *url = [NSURL URLWithString:@"http://47.105.214.158:8081/h5/service.jsp"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.wkWebView loadRequest:request];
WKUserContentController *userCC = config.userContentController;
[userCC addScriptMessageHandler:self name:@"showToast"]; //showMessage showToast
}
去调用和JS约定好的名称
#pragma mark - WKScriptMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
NSLog(@"11---%@",NSStringFromSelector(_cmd));
NSLog(@"message--%@",message);
NSLog(@"message.body--%@",message.body);
NSLog(@"message.name--%@",message.name);
UIApplication *app = [UIApplication sharedApplication];
//这个是注入JS代码后的处理效果,尽管html已经有实现了,但是没用,还是执行JS中的实现
if ([message.name isEqualToString:@"showToast"]) { //showMessage showToast
NSString *arrayStr = message.body;
NSString *str = [NSString stringWithFormat:@"tel://%@",arrayStr]; //拨打电话
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];
// [self showMsg:str];
}
}
还有一种方法调用拨打电话的功能,和以上代码无关
/****************以下方法均没有用到*****************************************************/
#pragma mark - 3.实现代理方法 js页面拨打电话 处理拨打电话以及Url跳转等等 showToast 客服电话:400-090-8851
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
// NSString *telNumber = [NSString stringWithFormat:@"tel:%@", @"88888888"];
UIApplication *app = [UIApplication sharedApplication];
NSURL *URL = navigationAction.request.URL;
// NSURL *URL = [NSURL URLWithString:telNumber];
NSString *scheme = [URL scheme];
if ([scheme isEqualToString:@"showToast"]) {
if ([app canOpenURL:URL]) {
CGFloat version = [[[UIDevice currentDevice]systemVersion]floatValue];
if (version >= 10.0) {
if (@available(iOS 10.0, *)) {
[[UIApplication sharedApplication]openURL:URL options:@{} completionHandler:nil];
} else {
// Fallback on earlier versions
}
}else{
}
}
NSString *resourceSpecifier = [URL resourceSpecifier];
NSString *callPhone = [NSString stringWithFormat:@"tel://%@", resourceSpecifier];
/// 防止iOS 10及其之后,拨打电话系统弹出框延迟出现
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:callPhone]];
});
}
decisionHandler(WKNavigationActionPolicyAllow);
}
网友评论