我想拨打电话,然后使用下面的代码。
- (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停止应用程序,那么应用程序就应该放置离子背景。但我也在设备主屏幕上看到确认提醒。如何在设备的主屏幕上显示,而不是在应用程序中显示?
以前有人遇到过吗?可能是什么原因?
编辑:我也试过下面的代码。但它有同样的问题。每当上面的webview代码工作时,代码也可以工作。当它不起作用时也一样。
NSString *phoneNumberURL = [NSString stringWithFormat:@"telprompt:%@", phoneNumber];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumberURL]];
编辑:为操作表和委托添加代码。
我首先显示警告。按下警告按钮我显示操作表。从行动表中选择选项我打电话。
# 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"];
}
}
答案 0 :(得分:1)
如果您的号码中有空格,则无法使用,因此需要将其删除,同时使用tel:
和telprompt:
时需要tel://
或{{1}请注意额外的telprompt://
。
如果您需要其他任何评论,我已经评论了我的代码并解释了每个步骤,我会提供更多信息。
//
编辑额外备注
阅读围绕此here
的Apple文档我会注意到Apple文档说- (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];
}
}
}
和tel:
应该有效,不需要额外的telprompt:
,但我发现它仍然适用于额外{{1} }}。这确实让我感到困惑,因为技术上//
和//
是tel:
,并且`URL方案中需要额外的telprompt:
。这是iPhone Development 101
Here是一些额外的信息
答案 1 :(得分:0)
使用OpenURL使用网址进行通话。
- (void)callPhoneNumber:(NSString *)phoneNumber
{
// Remove non-digits from phone number
phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];
// Make a call
NSURL * url = [NSURL URLWithString:[NSString stringWithFormat:@"tel:%@", phoneNumber]];
[[UIApplication sharedApplication] openURL:url];
}
答案 2 :(得分:0)
请尝试以下方法,而不是使用UIWebView:
NSURL *phoneUrl = [NSURL URLWithString:[NSString stringWithFormat:@"telprompt:%@",phoneNumber]];
if ([[UIApplication sharedApplication] canOpenURL:phoneUrl]) {
[[UIApplication sharedApplication] openURL:phoneUrl];
}
<强>编辑:强> 通过放置断点来检查是否调用了电话呼叫功能。 如果未调用该电话呼叫功能,请按以下步骤更换操作表的按钮索引检查功能:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0)
{
//Code for cancel button
}
if (buttonIndex == 1)
{
//Code for calling phone call
[self callPhoneNumber:@"1234567890"];
}
}
已编辑2:
现在这样说:
- (void)checkCallAlert :(NSInteger)index
{
UIAlertView *checkCallAlert = [[UIAlertView alloc] initWithTitle:@"Check?" message:@"Are you sure you want to continue?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Call", nil];
[checkCallAlert setTag:index];
[checkCallAlert show];
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0)
{
//Code for cancel button
}
if (buttonIndex == 1)
{
[self checkCallAlert : buttonIndex];
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if(alertView.tag == 1){
//Destination 1 clicked
//Code for calling phone call
[self callPhoneNumber:@"1234567890"];
}
}
这将是我的最终解决方案。
答案 3 :(得分:0)
在完成当前更新循环后,尝试使用以下代替[self callPhoneNumber ... ]
来调用callPhoneNumber
:
[self performSelector:@selector(callPhoneNumber:) withObject:@"1234567890" afterDelay:0];
UIActionSheet
参考文件也指出:
在iOS 4.0及更高版本中,当应用程序移至后台时,操作表不会自动解除
因此,您需要检查applicationWillResignActive
是否正在显示actionSheet
并以编程方式将其解除。
答案 4 :(得分:0)
NSString * telephoneNumber;
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:telephoneNumber]];
[telephoneNumber release];
答案 5 :(得分:0)
尝试调用didDismissWithButtonIndex:
,以便UIActionSheet已被解雇,也许它会阻止某些内容。