Próbuję zadzwonić pod numer, który nie używa określonych numerów, ale numer, który jest wywoływany w zmiennej lub przynajmniej każę mu wywołać numer w telefonie. Ta liczba, która jest wywoływana w zmiennej, to liczba, którą pobrałem za pomocą parsera lub pobierając z witryny sql. Zrobiłem przycisk, próbując połączyć się z numerem telefonu przechowywanym w zmiennej z funkcją, ale bezskutecznie. Wszystko pomoże, dzięki!
func callSellerPressed (sender: UIButton!){
//(This is calls a specific number)UIApplication.sharedApplication().openURL(NSURL(string: "tel://######")!)
// This is the code I'm using but its not working
UIApplication.sharedApplication().openURL(NSURL(scheme: NSString(), host: "tel://", path: busPhone)!)
}
ios
swift
phone-number
phone-call
Thomas Martinez
źródło
źródło
Samodzielne rozwiązanie w iOS 10, Swift 3 :
private func callNumber(phoneNumber:String) { if let phoneCallURL = URL(string: "tel://\(phoneNumber)") { let application:UIApplication = UIApplication.shared if (application.canOpenURL(phoneCallURL)) { application.open(phoneCallURL, options: [:], completionHandler: nil) } } }
Powinieneś być w stanie
callNumber("7178881234")
wykonać połączenie.źródło
Swift 4,
private func callNumber(phoneNumber:String) { if let phoneCallURL = URL(string: "telprompt://\(phoneNumber)") { let application:UIApplication = UIApplication.shared if (application.canOpenURL(phoneCallURL)) { if #available(iOS 10.0, *) { application.open(phoneCallURL, options: [:], completionHandler: nil) } else { // Fallback on earlier versions application.openURL(phoneCallURL as URL) } } } }
źródło
Swift 3.0 i iOS 10 lub starszy
func phone(phoneNum: String) { if let url = URL(string: "tel://\(phoneNum)") { if #available(iOS 10, *) { UIApplication.shared.open(url, options: [:], completionHandler: nil) } else { UIApplication.shared.openURL(url as URL) } } }
źródło
Ok, mam pomoc i rozgryzłem to. Dodałem też mały, fajny system ostrzegawczy na wypadek, gdyby numer telefonu był nieprawidłowy. Mój problem polegał na tym, że dzwoniłem dobrze, ale numer zawierał spacje i niepożądane znaki, takie jak („123 456-7890”). UIApplication działa lub akceptuje tylko wtedy, gdy Twój numer to („1234567890”). Więc zasadniczo usuwasz spację i nieprawidłowe znaki, tworząc nową zmienną, aby pobierać tylko liczby. Następnie dzwoni na te numery za pomocą aplikacji UIA.
func callSellerPressed (sender: UIButton!){ var newPhone = "" for (var i = 0; i < countElements(busPhone); i++){ var current:Int = i switch (busPhone[i]){ case "0","1","2","3","4","5","6","7","8","9" : newPhone = newPhone + String(busPhone[i]) default : println("Removed invalid character.") } } if (busPhone.utf16Count > 1){ UIApplication.sharedApplication().openURL(NSURL(string: "tel://" + newPhone)!) } else{ let alert = UIAlertView() alert.title = "Sorry!" alert.message = "Phone number is not available for this business" alert.addButtonWithTitle("Ok") alert.show() } }
źródło
Powyższe odpowiedzi są częściowo poprawne, ale z „tel: //” jest tylko jeden problem. Po zakończeniu połączenia powróci do ekranu głównego, a nie do naszej aplikacji. Więc lepiej użyć „telprompt: //”, powróci do aplikacji.
var url:NSURL = NSURL(string: "telprompt://1234567891")! UIApplication.sharedApplication().openURL(url)
źródło
Swift 3, iOS 10
func call(phoneNumber:String) { let cleanPhoneNumber = phoneNumber.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "") let urlString:String = "tel://\(cleanPhoneNumber)" if let phoneCallURL = URL(string: urlString) { if (UIApplication.shared.canOpenURL(phoneCallURL)) { UIApplication.shared.open(phoneCallURL, options: [:], completionHandler: nil) } } }
źródło
options: [:], completionHandler: nil
są argumentami domyślnymi, możesz je pominąć.Używam tej metody w mojej aplikacji i działa dobrze. Mam nadzieję, że to też może ci pomóc.
func makeCall(phone: String) { let formatedNumber = phone.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("") let phoneUrl = "tel://\(formatedNumber)" let url:NSURL = NSURL(string: phoneUrl)! UIApplication.sharedApplication().openURL(url) }
źródło
Swift 5: iOS> = 10.0
Działa tylko na urządzeniu fizycznym.
private func callNumber(phoneNumber: String) { guard let url = URL(string: "telprompt://\(phoneNumber)"), UIApplication.shared.canOpenURL(url) else { return } UIApplication.shared.open(url, options: [:], completionHandler: nil) }
źródło
W Swift 3
if let url = URL(string:"tel://\(phoneNumber)"), UIApplication.shared.canOpenURL(url) { UIApplication.shared.openURL(url) }
źródło
Używam rozwiązania Swift 3 z walidacją liczb
var validPhoneNumber = "" phoneNumber.characters.forEach {(character) in switch character { case "0"..."9": validPhoneNumber.characters.append(character) default: break } } if UIApplication.shared.canOpenURL(URL(string: "tel://\(validNumber)")!){ UIApplication.shared.openURL(URL(string: "tel://\(validNumber)")!) }
źródło
To jest aktualizacja odpowiedzi @ Toma przy użyciu Swift 2.0 Uwaga - to jest cała klasa CallComposer, której używam.
class CallComposer: NSObject { var editedPhoneNumber = "" func call(phoneNumber: String) -> Bool { if phoneNumber != "" { for i in number.characters { switch (i){ case "0","1","2","3","4","5","6","7","8","9" : editedPhoneNumber = editedPhoneNumber + String(i) default : print("Removed invalid character.") } } let phone = "tel://" + editedPhoneNumber let url = NSURL(string: phone) if let url = url { UIApplication.sharedApplication().openURL(url) } else { print("There was an error") } } else { return false } return true } }
źródło
Funkcja openURL () została wycofana w iOS 10. Oto nowa składnia:
if let url = URL(string: "tel://\(busPhone)") { UIApplication.shared.open(url, options: [:], completionHandler: nil) }
źródło
Wiele innych odpowiedzi nie działa w przypadku Swift 5. Poniżej znajduje się aktualizacja kodu do Swift 5:
let formattedNumber = phoneNumberVariable.components(separatedBy: NSCharacterSet.decimalDigits.inverted).joined(separator: "") if let url = NSURL(string: ("tel:" + (formattedNumber)!)) { if #available(iOS 10.0, *) { UIApplication.shared.open(url as URL, options: [:], completionHandler: nil) } else { UIApplication.shared.openURL(url as URL) } }
PS:
źródło
Rozwiązanie Swift 3.0:
let formatedNumber = phone.components(separatedBy: NSCharacterSet.decimalDigits.inverted).joined(separator: "") print("calling \(formatedNumber)") let phoneUrl = "tel://\(formatedNumber)" let url:URL = URL(string: phoneUrl)! UIApplication.shared.openURL(url)
źródło
Oto alternatywny sposób zredukowania numeru telefonu do prawidłowych komponentów za pomocą
Scanner
…let number = "+123 456-7890" let scanner = Scanner(string: number) let validCharacters = CharacterSet.decimalDigits let startCharacters = validCharacters.union(CharacterSet(charactersIn: "+#")) var digits: NSString? var validNumber = "" while !scanner.isAtEnd { if scanner.scanLocation == 0 { scanner.scanCharacters(from: startCharacters, into: &digits) } else { scanner.scanCharacters(from: validCharacters, into: &digits) } scanner.scanUpToCharacters(from: validCharacters, into: nil) if let digits = digits as? String { validNumber.append(digits) } } print(validNumber) // +1234567890
źródło
Dla Swift 3.0
if let url = URL(string: "tel://\(number)"), UIApplication.shared.canOpenURL(url) { if #available(iOS 10, *) { UIApplication.shared.open(url) } else { UIApplication.shared.openURL(url) } } else { print("Your device doesn't support this feature.") }
źródło
if let phoneCallURL = URL(string: "tel://\(01234567)"), UIApplication.shared.canOpenURL(phoneCallURL) { UIApplication.shared.open(phoneCallURL, options: [:], completionHandler: nil) }
źródło
let formatedNumber = phone.components(separatedBy: NSCharacterSet.decimalDigits.inverted).joined(separator: "") print("calling \(formatedNumber)") let phoneUrl = "tel://\(formatedNumber)" let url:URL = URL(string: phoneUrl)! UIApplication.shared.openURL(url)
źródło
Swift 3.0 i iOS 10+
UIApplication.shared.openURL(url)
został zmieniony naUIApplication.shared.open(_ url: URL, options:[:], completionHandler completion: nil)
opcje i obsługa uzupełniania są opcjonalne, renderowanie:
UIApplication.shared.open(url)
https://developer.apple.com/reference/uikit/uiapplication/1648685-open
źródło
Aby uzyskać podejście zgodne ze standardem Swift 3.1 i wstecz, wykonaj następujące czynności:
@IBAction func phoneNumberButtonTouched(_ sender: Any) { if let number = place?.phoneNumber { makeCall(phoneNumber: number) } } func makeCall(phoneNumber: String) { let formattedNumber = phoneNumber.components(separatedBy: NSCharacterSet.decimalDigits.inverted).joined(separator: "") let phoneUrl = "tel://\(formattedNumber)" let url:NSURL = NSURL(string: phoneUrl)! if #available(iOS 10, *) { UIApplication.shared.open(url as URL, options: [:], completionHandler: nil) } else { UIApplication.shared.openURL(url as URL) } }
źródło
Jeśli Twój numer telefonu zawiera spacje, najpierw je usuń! Następnie możesz użyć rozwiązania zaakceptowanej odpowiedzi .
let numbersOnly = busPhone.replacingOccurrences(of: " ", with: "") if let url = URL(string: "tel://\(numbersOnly)"), UIApplication.shared.canOpenURL(url) { if #available(iOS 10, *) { UIApplication.shared.open(url) } else { UIApplication.shared.openURL(url) } }
źródło