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

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

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

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

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)!)

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);

6

Szybki 3

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

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

    }

3

Odpowiednik Java RoboVM:

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

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)

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

1

Szybki

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

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];
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.