Hacer una llamada telefónica mediante programación


138

¿Cómo puedo hacer una llamada telefónica mediante programación en iPhone? Intenté el siguiente código pero no pasó nada:

NSString *phoneNumber = mymobileNO.titleLabel.text;
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]];

2
Para obtener un código rápido, puede seguir esta respuesta stackoverflow.com/a/29869456/3950397
Sahil Kapoor

Respuestas:


189

Probablemente el valor de mymobileNO.titleLabel.text no incluye el esquema tel: //

Su código debería verse así:

NSString *phoneNumber = [@"tel://" stringByAppendingString:mymobileNO.titleLabel.text];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]];

3
No hay posibilidad de que podamos volver a la aplicación original con este enfoque.
Artem Oboturov

44
Creo que el enfoque de Mellon es mejor, ya que primero incita al usuario y luego vuelve a su aplicación después de la llamada. Solo asegúrese de usar canOpenURL: y recurrir al indicador tel: ya que telprompt no es oficial y podría eliminarse en una futura versión de iOS.
joel.d

¿Cómo puedo hacer una llamada telefónica desde Apple Watch?
Ahad Khan

1
¿Puedo activar el altavoz mediante programación para llamadas originadas de esta manera en ios?
uniruddh

incluso tel: 1234567890 también funciona igual que how tell: // 1234567890 funciona
Durai Amuthan.H

218

Para volver a la aplicación original, puede usar telprompt: // en lugar de tel: // - El indicador tell avisará primero al usuario, pero cuando finalice la llamada volverá a su aplicación:

NSString *phoneNumber = [@"telprompt://" stringByAppendingString:mymobileNO.titleLabel.text];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]];

9
Tengo una pregunta: ¿Apple rechazará las aplicaciones que usan telprompt: //?
Smeegol

77
Sé que esto es antiguo, pero encontré un par de personas que afirman que sus aplicaciones fueron aprobadas usando telprompt: "He enviado mi aplicación que usa telprompt con una aplicación compartida sin el uiwebkit y Apple la aprobó con éxito. 19 de enero de 2013 Pablo respondió Alejandro Junge "
Mark McCorkle

1
telprompt: // no está documentado y, por lo tanto, nunca se debe confiar en él. Las cosas pueden cambiar, por ejemplo, Apple podría decidir que un esquema de URL dado es algo que necesitan exclusivamente o simplemente no desean permitir, entonces su aplicación se romperá.
DevC

@DevC: Entonces, ¿cuál es la alternativa para tener la función de llamada telefónica en nuestra aplicación?
BaSha

@BaSha tel://no usotelprompt://
DevC

24

Combinando las respuestas de @Cristian Radu y @Craig Mellon, y el comentario de @ joel.d, deberías hacer:

NSURL *urlOption1 = [NSURL URLWithString:[@"telprompt://" stringByAppendingString:phone]];
NSURL *urlOption2 = [NSURL URLWithString:[@"tel://" stringByAppendingString:phone]];
NSURL *targetURL = nil;

if ([UIApplication.sharedApplication canOpenURL:urlOption1]) {
    targetURL = urlOption1;
} else if ([UIApplication.sharedApplication canOpenURL:urlOption2]) {
    targetURL = urlOption2;
}

if (targetURL) {
    if (@available(iOS 10.0, *)) {
        [UIApplication.sharedApplication openURL:targetURL options:@{} completionHandler:nil];
    } else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
        [UIApplication.sharedApplication openURL:targetURL];
#pragma clang diagnostic pop
    }
} 

Primero intentará usar la URL "telprompt: //", y si eso falla, usará la URL "tel: //". Si ambos fallan, está intentando realizar una llamada telefónica en un iPad o iPod Touch.

Versión rápida:

let phone = mymobileNO.titleLabel.text
let phoneUrl = URL(string: "telprompt://\(phone)"
let phoneFallbackUrl = URL(string: "tel://\(phone)"
if(phoneUrl != nil && UIApplication.shared.canOpenUrl(phoneUrl!)) {
  UIApplication.shared.open(phoneUrl!, options:[String:Any]()) { (success) in
    if(!success) {
      // Show an error message: Failed opening the url
    }
  }
} else if(phoneFallbackUrl != nil && UIApplication.shared.canOpenUrl(phoneFallbackUrl!)) {
  UIApplication.shared.open(phoneFallbackUrl!, options:[String:Any]()) { (success) in
    if(!success) {
      // Show an error message: Failed opening the url
    }
  }
} else {
    // Show an error message: Your device can not do phone calls.
}

10

Las respuestas aquí están funcionando perfectamente. Solo estoy convirtiendo la respuesta de Craig Mellon a Swift. Si alguien busca una respuesta rápida, esto lo ayudará.

 var phoneNumber: String = "telprompt://".stringByAppendingString(titleLabel.text!) // titleLabel.text has the phone number.
        UIApplication.sharedApplication().openURL(NSURL(string:phoneNumber)!)

también puede usar tel: // en lugar de telprompt: //
Shivaay

let phoneNumber: String = "telprompt: // (titleLabel.text)" UIApplication.shared.openURL (URL (string: phoneNumber)!)
tspentzas

8

Si está utilizando Xamarin para desarrollar una aplicación de iOS, este es el equivalente de C # para hacer una llamada telefónica dentro de su aplicación:

string phoneNumber = "1231231234";
NSUrl url = new NSUrl(string.Format(@"telprompt://{0}", phoneNumber));
UIApplication.SharedApplication.OpenUrl(url);

6

Swift 3

let phoneNumber: String = "tel://3124235234"
UIApplication.shared.openURL(URL(string: phoneNumber)!)

4

En Swift 3.0,

static func callToNumber(number:String) {

        let phoneFallback = "telprompt://\(number)"
        let fallbackURl = URL(string:phoneFallback)!

        let phone = "tel://\(number)"
        let url = URL(string:phone)!

        let shared = UIApplication.shared

        if(shared.canOpenURL(fallbackURl)){
            shared.openURL(fallbackURl)
        }else if (shared.canOpenURL(url)){
            shared.openURL(url)
        }else{
            print("unable to open url for call")
        }

    }

3

El equivalente de Java RoboVM:

public void dial(String number)
{
  NSURL url = new NSURL("tel://" + number);
  UIApplication.getSharedApplication().openURL(url);
}

3

Intenté la opción Swift 3 anterior, pero no funcionó. Creo que necesitas lo siguiente si quieres correr contra iOS 10+ en Swift 3:

Swift 3 (iOS 10+):

let phoneNumber = mymobileNO.titleLabel.text       
UIApplication.shared.open(URL(string: phoneNumber)!, options: [:], completionHandler: nil)

1
let phone = "tel://\("1234567890")";
let url:NSURL = NSURL(string:phone)!;
UIApplication.sharedApplication().openURL(url);

1

Rápido

if let url = NSURL(string: "tel://\(number)"), 
    UIApplication.sharedApplication().canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

0

'openURL:' está en desuso: primero en desuso en iOS 10.0 - Utilice openURL: opciones: completeHandler: en su lugar

en el uso de Objective-c iOS 10+:

NSString *phoneNumber = [@"tel://" stringByAppendingString:mymobileNO.titleLabel.text];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber] options:@{} completionHandler:nil];
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.