No puedo hacer llamadas telefónicas.

Quiero hacer una llamada telefónica y uso el código siguiente para eso.

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

Antes de hacer una llamada, pido al usuario que elija una opción usando UIActionSheet . Cuando el usuario selecciona una opción, en function de que realice una llamada.

El problema es que el código anterior funciona bien si no UIActionSheet y directamente UIActionSheet una llamada. Se solicita una alerta para solicitar la confirmación del usuario para realizar una llamada. Pero después de mostrar UIActionSheet si llamo al método anterior, no muestra la alerta de confirmación.

Lo extraño es que después de esto, si paro la aplicación de Xcode, la aplicación se pondrá en segundo plano como debería. Pero también veo esa alerta de confirmación en la pantalla de inicio del dispositivo. ¿Cómo se muestra en la pantalla de inicio del dispositivo y no en la aplicación?

¿Alguien lo ha enfrentado antes? cual puede ser la razon?

EDIT: También probé debajo del código. Pero tiene el mismo problema. Siempre que el código de la vista web funciona debajo del código, también funciona. Lo mismo para cuando no funciona.

 NSString *phoneNumberURL = [NSString stringWithFormat:@"telprompt:%@", phoneNumber]; [[UIApplication shanetworkingApplication] openURL:[NSURL URLWithString:phoneNumberURL]]; 

Editar: Agregar código para la hoja de acción y delegar.

Primero muestro una alerta. Al presionar el button de alerta, muestro la hoja de acción. Y eligiendo la opción de la hoja de acción, coloco una llamada.

 # 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.ie selected one of the options if (buttonIndex != actionSheet.cancelButtonIndex) { // Place a call [self callPhoneNumber:@"1234567890"]; } } 

Si hay algún espacio en blanco en su número, no funcionará, así que debe eliminarse, también al usar tel: y telprompt: debe ser tel:// o telprompt:// tenga en count el // adicional.

He comentado mi código con la explicación de cada paso si necesitas algo más que comentar y voy a proporcionar más.

 - (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 shanetworkingApplication] canOpenURL:urlPhoneNumber]) { // If we can (So if iPhone really) make the call. [[UIApplication shanetworkingApplication] openURL:urlPhoneNumber]; } } } 

Editar notas adicionales

Lea aquí la documentation de Apple aquí.

telprompt: que la Documentación de Apple dice que tel: y telprompt: debería funcionar y que no es necesario el extra // pero he descubierto que todavía funciona con el // adicional. Esto me confunde un poco como técnicamente tel: y telprompt: son URL Schemes y se requieren // extra en un `Esquemas de URL. Aquí hay un buen tutorial sobre ellos por iPhone Development 101

Aquí hay un poco de información adicional

Use OpenURL para realizar llamadas usando la URL.

 - (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 shanetworkingApplication] openURL:url]; } 

En lugar de utilizar UIWebView, intente lo siguiente:

 NSURL *phoneUrl = [NSURL URLWithString:[NSString stringWithFormat:@"telprompt:%@",phoneNumber]]; if ([[UIApplication shanetworkingApplication] canOpenURL:phoneUrl]) { [[UIApplication shanetworkingApplication] openURL:phoneUrl]; } 

Editado: compruebe si se llama o no a la function de llamada telefónica colocando el punto de interrupción. Si no se llama a esa function de llamada telefónica, reemplace la function de comprobación del índice del button de la hoja de acciones de la siguiente manera:

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

Editado 2:

Ahora diga de esta manera:

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

Esta sería mi solución final para esto.

 NSString * telephoneNumber; [[UIApplication shanetworkingApplication] openURL:[NSURL URLWithString:telephoneNumber]]; [telephoneNumber release]; 

Intente utilizar el siguiente en lugar de [self callPhoneNumber ... ] para invocar callPhoneNumber después de completar el ciclo de actualización actual:

 [self performSelector:@selector(callPhoneNumber:) withObject:@"1234567890" afterDelay:0]; 

También el documento de reference de UIActionSheet dice:

En iOS 4.0 y posteriores, las hojas de acción no se rechazan automáticamente cuando una aplicación se mueve al background

Por lo tanto, debe verificar applicationWillResignActive si se muestra actionSheet y descartarlo mediante progtwigción.

Intente llamar a didDismissWithButtonIndex: para que la UIActionSheet ya se descarte, tal vez esté bloqueando algo.