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需要用真机调试,模拟器不支持电话呼叫。

真机效果如下:

iOS学习之在APP中唤起电话呼叫界面,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。