我想打电话,我使用下面的代码。
- (void)callPhoneNumber:(NSString *)phoneNumber
{
UIWebView * webView2 = [[UIWebView alloc] init];
// Remove non-digits from phone number
phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];
// Make a call
NSURL * url = [NSURL URLWithString:[NSString stringWithFormat:@"tel:%@", phoneNumber]];
[webView2 loadRequest:[NSURLRequest requestWithURL:url]];
[self.view addSubview:webView2];
}
在打电话之前,我要求用户使用
UIActionSheet
选择一个选项。当用户选择一个选项时,我会根据该选项拨打电话。问题是,如果我不显示
UIActionSheet
并直接拨打电话,则上述代码可以正常工作。它会提示一个警报,要求用户确认拨打电话。但是在显示 UIActionSheet
后,如果我调用上述方法,则不会显示确认警报。奇怪的是,在此之后,如果我从 Xcode 停止应用程序,那么应用程序将按原样放置 ionic 背景。但我也在设备的主屏幕上看到了确认警报。它如何显示在设备的主屏幕上而不是在应用程序中?
有没有人遇到过?原因是什么?
编辑: 我也试过下面的代码。但它有同样的问题。每当上面的 webview 代码有效时,下面的代码也有效。当它不起作用时也是如此。
NSString *phoneNumberURL = [NSString stringWithFormat:@"telprompt:%@", phoneNumber];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumberURL]];
编辑: 添加操作表和委托(delegate)的代码。
我首先显示一个警报。按下警报按钮时,我会显示操作表。并从操作表中选择选项我打电话。
# pragma mark - ALERT VIEW DELEGATE
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if(alertView.tag == MY_TAG)
{
// Ask to select option
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Select Option" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Option1", @"Option2", nil];
actionSheet.actionSheetStyle = UIActionSheetStyleDefault;
[actionSheet showInView:self.view];
}
}
#pragma mark - UIActionSheet Methods
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
// If not pressed cancel button.i.e. selected one of the options
if (buttonIndex != actionSheet.cancelButtonIndex)
{
// Place a call
[self callPhoneNumber:@"1234567890"];
}
}
最佳答案
如果您的号码中有任何空格,它将不起作用,因此需要将其删除,同样在使用 tel:
和 telprompt:
时,它需要是 tel://
或 telprompt://
请注意额外的 //
。
如果您还需要其他任何内容,请评论我的代码并解释每个步骤,我会提供更多信息。
- (void)callPhoneNumber:(NSString *)phoneNumber
{
// If statement to check we actually have something
if(phoneNumber) {
// Remove any unwanted whitespace, if there is any whitespace it will not work
phoneNumber = [phoneNumber stringByReplacingOccurrencesOfString:@" " withString:@""];
// Create an NSURL instance of your number
// Note the extra `//` in the string
// Also note you can also use: `telprompt://` instead of `tel://`
NSURL *urlPhoneNumber = [NSURL URLWithString:[NSString stringWithFormat:@"tel://%@", phoneNumber]];
// Check to make sure we can open this because iPad and iPod will not respond to phone calls
if([[UIApplication sharedApplication] canOpenURL:urlPhoneNumber]) {
// If we can (So if iPhone really) make the call.
[[UIApplication sharedApplication] openURL:urlPhoneNumber];
}
}
}
编辑额外的笔记
阅读有关此 here 的 Apple 文档
我会注意到苹果文档说
tel:
和 telprompt:
应该可以工作,不需要额外的 //
但我发现它仍然可以使用额外的 //
。这确实让我有点困惑,因为从技术上讲,tel:
和 telprompt:
是 URL Schemes
,而 URL Schemes 中需要额外的 //
。这是 iPhone Development 101 关于它们的一个很好的教程Here 是一些附加信息
关于ios - 无法拨打电话,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23540413/