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]];
usuario564963
fuente
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]];
Cristian Radu
fuente
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]];
Craig Mellon
fuente
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.
}
Guillaume Boudreau
fuente
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)!)
Shivaay
fuente
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);
Michael Kniskern
fuente
6

Swift 3

let phoneNumber: String = "tel://3124235234"
UIApplication.shared.openURL(URL(string: phoneNumber)!)
Jorge Costa
fuente
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")
        }

    }
Rohit Pathak
fuente
3

El equivalente de Java RoboVM:

public void dial(String number)
{
  NSURL url = new NSURL("tel://" + number);
  UIApplication.getSharedApplication().openURL(url);
}
Enredados
fuente
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)
Charlie Seligman
fuente
1
let phone = "tel://\("1234567890")";
let url:NSURL = NSURL(string:phone)!;
UIApplication.sharedApplication().openURL(url);
Himali Shah
fuente
1

Rápido

if let url = NSURL(string: "tel://\(number)"), 
    UIApplication.sharedApplication().canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
Sazzad Hissain Khan
fuente
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];
BoSoud
fuente