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

- (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/

10-10 20:42