ios – 无法拨打电话

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

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

解决方法

如果您的号码中有任何空格,那么它将无法工作,因此需要删除,当使用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文档

我会注意到Apple文档说tel:和telprompt:应该工作,不需要额外的//但我发现它仍然适用于额外的//.这确实让我感到困惑,因为技术上tel:和telprompt:是URL Schemes,并且`URL Schemes中需要额外的//.这是iPhone Development 101之前的一个很好的教程

Here是一些额外的信息

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...