Wykonaj połączenie telefoniczne programowo

138

Jak programowo nawiązać połączenie telefoniczne na telefonie iPhone? Wypróbowałem następujący kod, ale nic się nie stało:

NSString *phoneNumber = mymobileNO.titleLabel.text;
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]];
user564963
źródło
2
Aby uzyskać kod w trybie swift, możesz skorzystać z tej odpowiedzi stackoverflow.com/a/29869456/3950397
Sahil Kapoor

Odpowiedzi:

189

Prawdopodobnie wartość mymobileNO.titleLabel.text nie zawiera schematu tel: //

Twój kod powinien wyglądać następująco:

NSString *phoneNumber = [@"tel://" stringByAppendingString:mymobileNO.titleLabel.text];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]];
Cristian Radu
źródło
3
Nie ma szans, abyśmy mogli wrócić do oryginalnej aplikacji przy takim podejściu.
Artem Oboturov
4
Myślę, że podejście Mellon jest lepsze, ponieważ najpierw monituje użytkownika, a następnie wraca do aplikacji po wywołaniu. Po prostu upewnij się, że używasz canOpenURL: i wróć do zachęty tel :, ponieważ telprompt nie jest oficjalny i może zostać usunięty w przyszłej wersji iOS.
joel.d
Jak mogę zadzwonić z Apple Watch.
Ahad Khan
1
Czy mogę programowo włączyć głośnik dla połączeń nawiązanych w ten sposób na iOS?
uniruddh
even tel: 1234567890 działa tak samo jak tell: // 1234567890 to działa
Durai Amuthan.H
218

Aby wrócić do oryginalnej aplikacji, możesz użyć telprompt: // zamiast tel: // - monit tell najpierw zapyta użytkownika, ale po zakończeniu połączenia powróci do Twojej aplikacji:

NSString *phoneNumber = [@"telprompt://" stringByAppendingString:mymobileNO.titleLabel.text];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]];
Craig Mellon
źródło
9
Mam pytanie: czy aplikacje korzystające z telprompt: // zostaną odrzucone przez Apple?
Smeegol
7
Wiem, że to jest stare, ale znalazłem kilka osób twierdzących, że ich aplikacje zostały zatwierdzone za pomocą telprompt: „Przesłałem moją aplikację, która używa telprompt ze współdzieloną aplikacją bez zestawu uiwebkit i została pomyślnie zatwierdzona przez firmę Apple. Odpowiedział: 19 stycznia 2013 Pablo Alejandro Junge ”
Mark McCorkle
1
telprompt: // jest nieudokumentowany i dlatego nigdy nie należy na nim polegać. Wszystko może się zmienić, na przykład Apple może zdecydować, że dany schemat adresu URL jest czymś, czego potrzebuje wyłącznie lub po prostu nie chce na to zezwalać, wtedy Twoja aplikacja się zepsuje.
DevC,
@DevC: Więc jaka jest alternatywa dla funkcji połączeń telefonicznych w naszej aplikacji?
BaSha
@BaSha tel://nie używajtelprompt://
DevC
24

Łącząc odpowiedzi @Cristian Radu i @Craig Mellon oraz komentarz @ joel.d, powinieneś zrobić:

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
    }
} 

Najpierw spróbuje użyć adresu URL „telprompt: //”, a jeśli to się nie powiedzie, użyje adresu URL „tel: //”. Jeśli oba zawodzą, próbujesz nawiązać połączenie telefoniczne na iPadzie lub iPodzie Touch.

Szybka wersja:

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
źródło
10

Odpowiedzi tutaj działają doskonale. Właśnie konwertuję odpowiedź Craiga Mellona na Swift. Jeśli ktoś przyjdzie szukać szybkiej odpowiedzi, to mu pomoże.

 var phoneNumber: String = "telprompt://".stringByAppendingString(titleLabel.text!) // titleLabel.text has the phone number.
        UIApplication.sharedApplication().openURL(NSURL(string:phoneNumber)!)
Shivaay
źródło
możesz również użyć tel: // zamiast telprompt: //
Shivaay
let phoneNumber: String = "telprompt: // (titleLabel.text)" UIApplication.shared.openURL (URL (string: phoneNumber)!)
tspentzas
8

Jeśli używasz platformy Xamarin do tworzenia aplikacji na iOS, oto odpowiednik C # wykonywania połączenia telefonicznego w aplikacji:

string phoneNumber = "1231231234";
NSUrl url = new NSUrl(string.Format(@"telprompt://{0}", phoneNumber));
UIApplication.SharedApplication.OpenUrl(url);
Michael Kniskern
źródło
6

Szybki 3

let phoneNumber: String = "tel://3124235234"
UIApplication.shared.openURL(URL(string: phoneNumber)!)
Jorge Costa
źródło
4

W wersji 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
źródło
3

Odpowiednik Java RoboVM:

public void dial(String number)
{
  NSURL url = new NSURL("tel://" + number);
  UIApplication.getSharedApplication().openURL(url);
}
EntangledLoops
źródło
3

Wypróbowałem opcję Swift 3 powyżej, ale nie zadziałała. Myślę, że potrzebujesz następujących elementów, jeśli chcesz korzystać z systemu iOS 10+ w Swift 3:

Swift 3 (iOS 10+):

let phoneNumber = mymobileNO.titleLabel.text       
UIApplication.shared.open(URL(string: phoneNumber)!, options: [:], completionHandler: nil)
Charlie Seligman
źródło
1
let phone = "tel://\("1234567890")";
let url:NSURL = NSURL(string:phone)!;
UIApplication.sharedApplication().openURL(url);
Himali Shah
źródło
1

Szybki

if let url = NSURL(string: "tel://\(number)"), 
    UIApplication.sharedApplication().canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
Sazzad Hissain Khan
źródło
0

Adres „openURL:” jest przestarzały: najpierw wycofany w iOS 10.0 - zamiast tego użyj openURL: options: completeHandler:

w przypadku Objective-c iOS 10+:

NSString *phoneNumber = [@"tel://" stringByAppendingString:mymobileNO.titleLabel.text];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber] options:@{} completionHandler:nil];
BoSoud
źródło