今天遇到一個顯示電話號碼的cell點擊后沒反應(yīng)的問題惑淳,按照邏輯應(yīng)該是點擊之后彈出撥號界面的额港,查看代碼發(fā)現(xiàn)cell的點擊事件里是這樣寫的:
NSString *phoneStr = [NSString stringWithFormat:@"tel:%@",phone];
WKWebView * callWebview = [[WKWebView alloc] init];
[callWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:phoneStr]]];
[self.view addSubview:callWebview];
初一看,沒啥問題歧焦,以前加載URL都是這樣寫的移斩,為什么點擊之后沒反應(yīng)呢?
正當(dāng)我百思不得其解之時倚舀,突然想到一個問題叹哭,以前加載URL都是用UIWebView寫的忍宋,難道是iOS8.0帶來的新控件WKWebView的原因痕貌?
于是本著實驗的心態(tài),把WKWebView改成UIWebView試了試糠排,居然能彈出撥號的對話框了舵稠,看來就是WKWebView的問題了,于是上網(wǎng)查了下WKWebView的特性,果然哺徊,是因為WKWebView默認(rèn)禁止了跳轉(zhuǎn)到appStore, 撥打電話, 喚起郵箱等一系列操作室琢,而這些操作UIWebView是默認(rèn)支持的。
知道了原因落追,解決起來就簡單了盈滴,通過查閱資料,找到了一種實現(xiàn)WKWebView撥打電話的方法:
首先遵循WKNavigationDelegate代理:
@interface ViewController ()<WKNavigationDelegate>
callWebview.navigationDelegate = self;
然后調(diào)用WKNavigationDelegate的decidePolicyForNavigationAction方法:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSURL *URL = navigationAction.request.URL;
NSString *scheme = [URL scheme];
UIApplication *app = [UIApplication sharedApplication];
// 打電話
if ([scheme isEqualToString:@"tel"]) {
if ([app canOpenURL:URL]) {
[app openURL:URL];
// 一定要加上這句,否則會打開新頁面
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
}
}
decisionHandler(WKNavigationActionPolicyAllow);
}
代碼運行轿钠,能正常撥打電話了巢钓,但其實還有更簡單的方法,就是直接調(diào)用UIApplication的openURL方法:
NSString *callStr = [NSString stringWithFormat:@"tel://%@",phone];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {
//設(shè)備系統(tǒng)為IOS 10.0或者以上的
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:callStr] options:@{} completionHandler:nil];
}else{
//設(shè)備系統(tǒng)為IOS 10.0以下的
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:callStr]];
ps:上面的代碼是有警告的:'openURL:' is deprecated: first deprecated in iOS 10.0
意思是UIApplication的openURL方法在iOS10以上的系統(tǒng)已經(jīng)棄用了疗垛,但是新的openURL:options:completionHandler
方法在iOS10以下的系統(tǒng)會有閃退的問題症汹,所以在iOS10以下還是得用那個已經(jīng)棄用的方法,這里可以看出蘋果的開發(fā)在向下兼容方面也有所欠缺啊- -