最近项目中需要使用到点击号码然后拨打电话,并且统计用户是否拨打出去电话,然后发现原来的使用WebView方式无法获知是否点击了呼叫按钮来进行通话,网上找到资料又比较老,于是就只能自己开始琢磨,如何实现这个需求将在下篇文章中讲解,这篇文章主要是总结下iOS上三种拨打电话方式,以及优缺点。
1.使用UIWebView拨打:
优点:会弹出提示框,电话结束后会返回到原来的App 内。
缺点:比较卡顿,无法知道用户是否点击了呼叫按钮还是取消按钮。
拨打具体代码:
UIWebView *webV= [[UIWebView alloc]init];
NSURLRequest *request = [NSURLRequest requestWithURL: [NSURL URLWithString:@"tel:18333361588"]];
[webV loadRequest:request];//注意不要让webV释放掉,记得持有webV到拨打出电话时,不然不会显示弹框。
2.使用openURL:方法
优点:反应快,能通过方法返回值来判断是否拨打出去了电话,返回Yes就是拨打出去了电话,相反则没有。
缺点:在iOS9.0以前通话结束后不能返回到原来App内,在iOS10.2以前不会弹出提示框,会直接拨打电话。但是在10.2.1以及以上版本会弹出提示框。
拨打具体代码:
NSURL *phoneUrl = [NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",@"18333361588"]];
bool reuslt = [[UIApplication sharedApplication] openURL:phoneUrl];
//该方法的返回值reuslt是在你点击后才返回结果的。result==Yes表示点击了呼叫按钮,开始呼叫
3.使用iOS10后出现的openURL:options:completionHandler:方法:
优点:反应快,能通过completionHandler中的回调里的参数判断是否打出了电话,返回Yes就拨打了电话。
缺点:不能在iOS10以前的版本上使用,且在iOS10.2以前不会弹出提示框,会直接拨打电话。但是在10.2.1以及以上版本会弹出提示框。
其实该方法就是openURL:上的新方法,在iOS10下系统会提示openURL:方法过期。
拨打代码:
NSURL *phoneURLOne = [NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",@"18770002135"]];
[[UIApplication sharedApplication] openURL:phoneURLOne options:@{} completionHandler:^(BOOL success) {
//点击了呼叫按钮时,这里开始返回,success为Yes,否则为NO
}];
结语
对于这三个方法各有利弊,在这里笔者不推荐只使用这里的某一个方法来进行拨打电话。为了实现又能一直弹出提示框,一直能在通话结束后返回到App,又能不卡顿而且在还要判断用户是否点击了呼叫按钮进行通话,所以上面任何一种方式都是不能实现的。笔者打算将这三种方式综合成一种方式来实现这样一个需求,因为这篇主要是介绍这三种方式的区别,到底如何将他们综合起来,笔者在下一篇文章中讲解。
补充:
其实还有种方式实现电话,使用telprompt:来替换tel:。不过使用这种方式上架是会被拒绝的,所以大家别用。
代码:
NSURL *phoneUrl = [NSURL URLWithString:[NSString stringWithFormat:@"telprompt:%@",@"18333361588"]];
bool reuslt = [[UIApplication sharedApplication] openURL:phoneUrl];