Hızlı bir telefon numarasını aramak


90

Belirli numaraları değil, değişkende aranan bir numarayı aramaya veya en azından telefonunuzdaki numarayı açmasını söylemeye çalışıyorum. Bir değişkende çağrılan bu numara, bir çözümleyici kullanarak veya bir web sitesi sql'den kaparak aldığım bir sayı. Değişkende depolanan telefon numarasını bir işlevle aramaya çalışırken bir düğme yaptım ama boşuna. Her şey yardımcı olacak teşekkürler!

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

        }

Yanıtlar:


193

Sadece dene:

if let url = NSURL(string: "tel://\(busPhone)") where UIApplication.sharedApplication().canOpenURL(url) {
  UIApplication.sharedApplication().openURL(url)
}

telefon numarasının içinde olduğunu varsayarak busPhone.

NSURL's init(string:)bir İsteğe Bağlı döndürür, bu nedenle kullanarak if letbunun urla olduğundan NSURL(ve NSURL?tarafından döndürüldüğü gibi a olmadığından) emin oluruz init.


Swift 3 için:

if let url = URL(string: "tel://\(busPhone)"), UIApplication.shared.canOpenURL(url) {
    if #available(iOS 10, *) {
        UIApplication.shared.open(url)
    } else {
        UIApplication.shared.openURL(url)
    }
}

İOS 10 veya sonraki sürümlerde olup olmadığımızı kontrol etmemiz gerekiyor çünkü:

"openURL", iOS 10.0'da kullanımdan kaldırıldı


bu bana çözülmemiş tanımlayıcı 'url' hatası veriyor - .openURL (url) 'yi gösteriyor Bu arada yardım için teşekkürler!
Thomas Martinez

nvm sadece bir mektup eksikti. tamam yani düğmeye bastığımda hiçbir şey olmuyor. işte daha fazla bilgi ---------- func parserDidEndDocument (ayrıştırıcı: NSXMLParser!) {println (busPhone) drawUpdatedView ()}
Thomas Martinez

1
Bunu bir telefonda mı test ediyorsunuz? Bir tel: // URL açmanın sadece gerçek bir iPhone'da çalışacağından şüpheleniyorum, simülatörde ve iPod veya iPad'de çalışmayacaktır.
Thomas Müller

Evet, bir iphone 4s üzerinde test ediyorum düğme tıklıyor ama busPhone tarafından çağrılan numarayı telefonumdaki bir sql sunucusundan almıyor. Bir telefon numarası ile tel: // kullandığımda onu çeviriyor.
Thomas Martinez

2
Tamam, sanırım sorunun ne olduğunu biliyorum ama nasıl düzelteceğimi bilmiyorum. URL'den alınan numara aynen 123 456-7890 gibi yazılır ve bu 1234567890 gibi değildir. Tel: // 'yi tanıyacağı biçimde URL'yi okumak için nasıl çevirebilirim?
Thomas Martinez

66

İOS 10, Swift 3'te kendi kendine yeten bir çözüm :

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

callNumber("7178881234")Çağrı yapmak için kullanabilmelisiniz .


aşağıdaki gibi hata verecektir; Swift 3 için "Bu uygulamanın şema telini sorgulamasına izin verilmiyor" ve bunlar simülatörde çalışıyor mu, değil mi?
Kiran jadhav 08

1
Bu kod simülatörde çalışmayacaktır. Kontrol etmek istiyorsanız bir cihaz kullanın.
Ramakrishna

24

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)

            }
        }
    }
}

13

Swift 3.0 ve ios 10 veya daha eski

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

9

Tamam, yardım aldım ve çözdüm. Ayrıca telefon numarasının geçerli olmaması durumunda küçük bir uyarı sistemi de ekledim. Sorunum, onu doğru arıyordum, ancak numarada boşluklar ve ("123 456-7890") gibi istenmeyen karakterler vardı. UIApplication yalnızca numaranız ("1234567890") ise çalışır veya kabul eder. Dolayısıyla, yalnızca sayıları çekmek için yeni bir değişken oluşturarak boşluğu ve geçersiz karakterleri kaldırırsınız. Daha sonra bu numaraları UIApplication ile arar.

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

6
Ayrıca '+' işaretine de izin vermelisiniz.
florian

1
Ayrıca #, istekte
bulunurken

9

Yukarıdaki cevaplar kısmen doğrudur, ancak "tel: //" ile yalnızca bir sorun vardır. Çağrı bittikten sonra, uygulamamıza değil ana ekrana dönecektir. Bu yüzden "telprompt: //" kullanmak daha iyidir, uygulamaya geri dönecektir.

var url:NSURL = NSURL(string: "telprompt://1234567891")!
UIApplication.sharedApplication().openURL(url)

Görünüşe göre bu, uygulamanızın reddedilmesine neden olacak
Tom Knapen

8

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

options: [:], completionHandler: nilvarsayılan bağımsız değişkenlerdir, bunları atlayabilirsiniz.
Tim Vermeulen

7

Uygulamamda bu yöntemi kullanıyorum ve iyi çalışıyor. Umarım bu da size yardımcı olabilir.

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

7

Swift 5: iOS> = 10.0

Yalnızca fiziksel cihazda çalışır.

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

Aşağıdaki biri, "tel" yerine "telprompt" kullanırsanız uygulamanızın reddedileceğini söylüyor.
Andy Weinstein

@AndyWeinstein eh belki yakalarlarsa, ama benim hiçbirini reddetmediler
grantespo

4

Swift 3'te,

if let url = URL(string:"tel://\(phoneNumber)"), UIApplication.shared.canOpenURL(url) {
     UIApplication.shared.openURL(url)
}

4

Numara doğrulamalı hızlı 3 çözümü kullanıyorum

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

3

Bu, @ Tom'un Swift 2.0 kullanarak yanıtına yapılan bir güncellemedir. Not - Bu, kullandığım CallComposer sınıfının tamamı.

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

2

openURL (), iOS 10'da kullanımdan kaldırılmıştır. Yeni sözdizimi şöyledir:

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

1
amortismana tabi değil. sözdizimindeki değişiklik, hızlı 3 kullanıyor
olmanızdır

@Hammadzafar, openURl (url) yöntemi gerçekten kullanımdan kaldırıldı. Yeni sürümünün farklı imzası var ve aynı zamanda açılacak şekilde yeniden adlandırıldı (url: options: completeHandler)
taklit

bu çünkü hızlı 2.3 yakında değer kaybına
uğrayacak

2

Diğer cevapların çoğu Swift 5 için işe yaramıyor. Aşağıda Swift 5 kod güncellemesi var:

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

Not:

  1. Cevapların çoğunda, cihazdaki istemi alamadım. Yukarıdaki kod, istemi başarıyla görüntüleyebildi.
  2. Çoğu cevapta olduğu gibi tel: ' ten sonra // yoktur . Ve iyi çalışıyor.

1

Swift 3.0 çözümü:

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)

aynı zamanda '+' ve '#' karakterini de kaldırır
Amr Angry

1

Aşağıda, bir telefon numarasını bir Scanner… kullanarak geçerli bileşenlere indirgemenin alternatif bir yolu verilmiştir .

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

1

Swift 3.0 için

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

1

Swift 4.2 ve üzeri için

if let phoneCallURL = URL(string: "tel://\(01234567)"), UIApplication.shared.canOpenURL(phoneCallURL)
{
    UIApplication.shared.open(phoneCallURL, options: [:], completionHandler: nil)
}

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

2
Bu kod parçacığı soruyu çözebilirken, bir açıklama eklemek, yayınınızın kalitesini artırmaya gerçekten yardımcı olur. Gelecekte okuyucular için soruyu yanıtlayacağınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın. Lütfen kodunuzu açıklayıcı yorumlarla doldurmamaya çalışın, bu hem kodun hem de açıklamaların okunabilirliğini azaltır!
Rohan Khude


0

Swift 3.1 ve geriye dönük uyumlu bir yaklaşım için şunu yapın:

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

0

Telefon numaranız boşluk içeriyorsa, önce boşlukları kaldırın! Ardından kabul edilen cevabın çözümünü kullanabilirsiniz.

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

Bu soru şimdi 17 cevap içeriyor ve 3 yaşın üzerinde. Neden bir cevap daha eklemeye ihtiyaç duydunuz?
Fogmeister

1
Çünkü bir telefon numarasında boşluk varsa neden çalışmadığını anlamadım. Bu kadar olumsuz olmayın bay ahbap!
catanore

Bunu kesinlikle anlayın. Bu nedenle, sayılardaki boşluklarla ilgili yeni bir soru ekleyin ve buna kendi cevabınızı ekleyin. Bir soru sormanın ve kendi kendinize cevaplamanın yanlış bir tarafı yoktur. (Yine de, bu sorunun bir kopya olarak kapatılacağından oldukça eminim).
Fogmeister

1
Hayır, buradaki insanlara url'nin neden açılmadığını söylemek önemlidir: çünkü bu sıfır, çünkü telefon numarası boşluklar içeriyor. Bunun bir cevaptan ziyade bir yorum olması gerektiğine katılıyorum. Ama orada çok fazla yorum var.
catanore

Boşluklardan bahsetmek size yardımcı oldu mu?
catanore
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.