无法拨打电话

时间:2014-05-08 11:25:14

标签: ios objective-c ios7 uiwebview telprompt

我想拨打电话,然后使用下面的代码。

- (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"];
    }
}

6 个答案:

答案 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已被解雇,也许它会阻止某些内容。