iOS撥打電話有三種方法。
注意:最新的iOS12上測試 三種方法效果沒有區別 也不要開線程
第一種:
NSMutableString *str=[[NSMutableString alloc] initWithFormat:@"tel:%@",@"186xxxx6979"]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];
第二種:
NSMutableString *str2=[[NSMutableString alloc] initWithFormat:@"tel:%@",@"186xxxx6979"]; UIWebView * callWebview = [[UIWebView alloc] init]; [callWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str2]]]; [self.view addSubview:callWebview];
第三種:
NSMutableString *str3=[[NSMutableString alloc] initWithFormat:@"telprompt://%@",@"186xxxx6979"]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str3]];
三種方法優缺點:
網上有解釋為第一種打完電話留在打電話界面,第二種打完電話回到原來的app
真實測試:兩種打完電話都是回到原來的app界面,
方法一:在iOS10.2之前沒問題,沒有提示直接撥打,但是在iOS10.2后新增彈出提示,彈出提示有延遲。修改方法有幾種
1. 調用[[UIApplication sharedApplication] openURL:[NSURL URLWithString:str] options:@{} completionHandler:nil];這個方法但是需要判斷版本,在iOS10之后才用。10之前用原來的 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];
2.關於撥打電話的方法,自己憑喜好選擇,導致彈出框延遲的原因,目前初步診斷就是openURL在iOS 10及其之后會阻塞主線程
NSMutableString * str=[[NSMutableString alloc] initWithFormat:@"tel:%@",@"18511089439"]; dispatch_async(dispatch_get_global_queue(0, 0), ^{ [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]]; });
方法二:點擊有提示。但是照此方法寫的會不停創建webview。應當聲明一個web,每次都調用同一個以節省資源
方法三:點擊有提示。用這個的時候要小心,因為apple的文檔里邊沒出現過telprompt這個。之前是有過被reject的案例。
總結:推薦第二種,都是在第一種延遲取消后,還是可以用第一種的