iOS学习之在APP中唤起电话呼叫界面
背景
很多时候,在APP里面会有电话号码,我们希望能够在点击后唤起呼叫界面,通话结束后直接返回到APP,而不是返回系统联系人列表。
常见方法
在iOS系统中一般支持如下三种方法唤起电话呼叫界面:
1)利用openURL接口来调用打电话功能,调用系统私有方法:"telprompt://"(可能不能通过审核)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt://10086"]];
2)利用openURL接口来调用打电话功能,调用"tel://"(一般的调用方法)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://10086"]];
使用这种方式拨打电话时,当用户结束通话后,iphone界面会停留在电话界面。
3)用UIWebView加载电话呼叫界面(合法,且在呼叫结束后返回APP)
1 NSString *phoneNum = @"10086";// 电话号码 2 NSURL *phoneURL = [NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",phoneNum]]; 3 if ( !phoneCallWebView ) { 4 phoneCallWebView = [[UIWebView alloc] initWithFrame:CGRectZero];// 这个webView只是一个后台的View 不需要add到页面上来 5 6 } 7 [phoneCallWebView loadRequest:[NSURLRequest requestWithURL:phoneURL]];
Demo
Demo链接:https://github.com/CoCrash/PhoneCallSample
这个Demo主要是利用第三种方法,利用UI WebView加载电话呼叫界面,实现电话的呼叫并在呼叫结束后,返回APP。这个方法是合法的,并且APP Store上审核是OK的。
在Demo里面,我们会对电话号码的合法性进行检查,代码如下:
1 + (BOOL)isMobileNumber:(NSString *)mobileNum 2 { 3 /** 4 * 手机号码 5 * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188 6 * 联通:130,131,132,152,155,156,185,186 7 * 电信:133,1349,153,180,189 8 */ 9 NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$"; 10 /** 11 * 中国移动:China Mobile 12 * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188 13 */ 14 NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$"; 15 /** 16 * 中国联通:China Unicom 17 * 130,131,132,152,155,156,185,186 18 */ 19 NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$"; 20 /** 21 * 中国电信:China Telecom 22 * 133,1349,153,180,189 23 */ 24 NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$"; 25 /** 26 * 大陆地区固话及小灵通 27 * 区号:010,020,021,022,023,024,025,027,028,029 28 * 号码:七位或八位 29 */ 30 NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$"; 31 32 NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE]; 33 NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM]; 34 NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU]; 35 NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT]; 36 NSPredicate *regextestphs = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", PHS]; 37 38 if (([regextestmobile evaluateWithObject:mobileNum] == YES) 39 || ([regextestcm evaluateWithObject:mobileNum] == YES) 40 || ([regextestct evaluateWithObject:mobileNum] == YES) 41 || ([regextestcu evaluateWithObject:mobileNum] == YES) 42 || ([regextestphs evaluateWithObject:mobileNum] == YES)) 43 { 44 return YES; 45 } 46 else 47 { 48 return YES; //暂时不做检查 49 } 50 }
拨打电话入口:
1 //打开拨打电话 2 - (void)openPhoneCallViewWithphoneNumber:(NSString *)phoneNum 3 { 4 if (_phoneCallWebView == nil) { 5 _phoneCallWebView = [[UIWebView alloc] initWithFrame:CGRectZero]; 6 } 7 NSString *newPhoneString = [ViewController dealWithPhoneNumber:phoneNum]; 8 if ([ViewController isMobileNumber:newPhoneString]) { 9 10 NSURL* dialUrl = [NSURL URLWithString:[NSString stringWithFormat:@"tel:%@", newPhoneString]]; 11 if ([[UIApplication sharedApplication] canOpenURL:dialUrl]) 12 { 13 if (_phoneCallWebView) { 14 [_phoneCallWebView loadRequest:[NSURLRequest requestWithURL:dialUrl]]; 15 } 16 else{ 17 [[UIApplication sharedApplication] openURL:dialUrl]; 18 } 19 } 20 else 21 { 22 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"设备不支持" delegate:nil cancelButtonTitle:@"确定 " otherButtonTitles:nil, nil]; 23 [alert show]; 24 alert = nil; 25 } 26 } else { 27 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"您选择的号码不合法" delegate:nil cancelButtonTitle:@"确定 " otherButtonTitles:nil, nil]; 28 [alert show]; 29 alert = nil; 30 } 31 }
Demo需要用真机调试,模拟器不支持电话呼叫。
真机效果如下:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。