Memanggil nomor telepon dengan cepat

90

Saya mencoba menelepon nomor yang tidak menggunakan nomor tertentu tetapi nomor yang dipanggil dalam variabel atau setidaknya memberitahu nomor tersebut untuk menarik nomor di telepon Anda. Nomor yang dipanggil dalam variabel ini adalah nomor yang saya ambil dengan menggunakan parser atau mengambil dari situs sql. Saya membuat tombol mencoba memanggil nomor telepon yang disimpan dalam variabel dengan fungsi tetapi tidak berhasil. Apapun akan membantu terima kasih!

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

        }
Thomas Martinez
sumber

Jawaban:

193

Coba saja:

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

dengan asumsi bahwa nomor telepon masuk busPhone.

NSURLIni init(string:)kembali Opsional, sehingga dengan menggunakan if letkami memastikan bahwa urladalah NSURL(dan bukan NSURL?sebagai dikembalikan oleh init).


Untuk Swift 3:

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

Kami perlu memeriksa apakah kami menggunakan iOS 10 atau lebih baru karena:

'openURL' sudah tidak digunakan lagi di iOS 10.0

Thomas Müller
sumber
ini memberi saya kesalahan pengenal 'url' yang belum terselesaikan - menunjuk ke .openURL (url) Terima kasih atas bantuannya!
Thomas Martinez
nvm saya kehilangan hanya sebuah surat. oke jadi ketika saya menekan tombol tidak ada yang terjadi. ini info selengkapnya ---------- func parserDidEndDocument (parser: NSXMLParser!) {println (busPhone) drawUpdatedView ()}
Thomas Martinez
1
Apakah Anda menguji ini di ponsel? Saya menduga membuka tel: // URL hanya akan berfungsi di iPhone yang sebenarnya, tidak di simulator dan tidak di iPod atau iPad.
Thomas Müller
Ya, saya mengujinya di iphone 4s tombol klik tetapi tidak menarik nomor yang dipanggil oleh busPhone dari server sql di ponsel saya. Ketika saya menggunakan tel: // dengan nomor telepon, ia memanggilnya.
Thomas Martinez
2
Oke saya rasa saya tahu apa masalahnya tetapi tidak tahu bagaimana memperbaikinya. Nomor yang ditarik dari URL ditulis persis seperti ini 123 456-7890 dan tidak seperti ini 1234567890. Bagaimana cara menerjemahkan tel: // untuk membaca URL dalam bentuk yang dikenali?
Thomas Martinez
66

Solusi mandiri di 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)
    }
  }
}

Anda harus bisa menggunakan callNumber("7178881234")untuk melakukan panggilan.

Zorayr
sumber
ini akan memberikan error seperti dibawah; "Aplikasi ini tidak diizinkan untuk meminta skema tel" untuk swift 3 dan apakah ini berfungsi pada simulator atau tidak?
Kiran jadhav
1
Kode itu tidak akan berfungsi di simulator. Jika Anda ingin memeriksanya gunakan perangkat.
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)

            }
        }
    }
}
Teja
sumber
13

Swift 3.0 dan ios 10 atau yang lebih lama

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)
        }
    }
}
Gandom
sumber
9

Oke, saya mendapat bantuan dan menemukan jawabannya. Juga saya memasang sistem peringatan kecil yang bagus kalau-kalau nomor telepon tidak valid. Masalah saya adalah saya menelepon dengan benar tetapi nomor tersebut memiliki spasi dan karakter yang tidak diinginkan seperti ("123 456-7890"). Aplikasi UIA hanya berfungsi atau menerima jika nomor Anda adalah ("1234567890"). Jadi pada dasarnya Anda menghapus spasi dan karakter yang tidak valid dengan membuat variabel baru untuk hanya menarik angka. Kemudian panggil nomor tersebut dengan aplikasi 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()
        }
        }
Thomas Martinez
sumber
6
Saya rasa Anda juga harus mengizinkan tanda '+'.
florian
1
Juga # adalah salah satu karakter yang digunakan pada saat membuat permintaan :)
iOSDev
9

Jawaban di atas sebagian benar, tetapi dengan "tel: //" hanya ada satu masalah. Setelah panggilan berakhir, itu akan kembali ke layar beranda, bukan ke aplikasi kita. Jadi lebih baik menggunakan "telprompt: //", itu akan kembali ke aplikasi.

var url:NSURL = NSURL(string: "telprompt://1234567891")!
UIApplication.sharedApplication().openURL(url)
Dipen Gajjar
sumber
Tampaknya ini akan membuat aplikasi Anda ditolak
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)
            }
        }
  }
LuAndre
sumber
options: [:], completionHandler: niladalah argumen default, Anda dapat menghilangkannya.
Tim Vermeulen
7

Saya menggunakan metode ini di aplikasi saya dan itu berfungsi dengan baik. Saya harap ini dapat membantu Anda juga.

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)
}
Ayath Khan
sumber
7

Swift 5: iOS> = 10.0

Hanya berfungsi di perangkat fisik.

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)
}
grantespo
sumber
Seseorang di bawah ini mengatakan bahwa jika Anda menggunakan "telprompt" dan bukan "tel", aplikasi Anda akan ditolak.
Andy Weinstein
@AndyWeinstein eh mungkin jika mereka menangkapnya, tetapi mereka belum menolak satu pun milik saya
grantespo
4

Di Swift 3,

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

Saya menggunakan solusi swift 3 dengan validasi nomor

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

Ini adalah pembaruan untuk jawaban @ Tom menggunakan Swift 2.0 Note - Ini adalah seluruh kelas CallComposer yang saya gunakan.

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
 }
}
Michael McKenna
sumber
2

openURL () sudah tidak digunakan lagi di iOS 10. Berikut sintaks barunya:

if let url = URL(string: "tel://\(busPhone)") {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
Torre Lasley
sumber
1
itu tidak disusutkan. perubahan sintaks ini karena Anda menggunakan swift 3.
Hammadzafar
@Hammadzafar, metode openURl (url) benar-benar usang. Versi barunya memiliki tanda tangan yang berbeda dan juga telah diganti namanya menjadi terbuka (url: options: completeHandler)
meniru
Itu karena swift 2.3 akan segera disusutkan
Hammadzafar
2

Banyak dari jawaban lain tidak berfungsi untuk Swift 5. Di bawah ini adalah pembaruan kode untuk 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:

  1. Dengan sebagian besar jawaban, saya tidak bisa mendapatkan prompt di perangkat. Kode di atas berhasil menampilkan prompt.
  2. Tidak ada // setelah tel: seperti kebanyakan jawaban. Dan itu bekerja dengan baik.
Mahendra Liya
sumber
1

Solusi 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)
mazorati.dll
sumber
itu juga menghapus '+' dan '#' char
Amr Angry
1

Berikut cara alternatif untuk mengurangi nomor telepon menjadi komponen yang valid menggunakan 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
Ashley Mills
sumber
1

Untuk 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.")
}
Hardik Thakkar
sumber
1

Untuk Swift 4.2 dan yang lebih baru

if let phoneCallURL = URL(string: "tel://\(01234567)"), UIApplication.shared.canOpenURL(phoneCallURL)
{
    UIApplication.shared.open(phoneCallURL, options: [:], completionHandler: nil)
}
iHarshil
sumber
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)
Jithin Pankaj k
sumber
2
Meskipun cuplikan kode ini dapat menyelesaikan pertanyaan, menyertakan penjelasan sangat membantu meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa mendatang, dan orang-orang itu mungkin tidak tahu alasan saran kode Anda. Harap juga mencoba untuk tidak membanjiri kode Anda dengan komentar penjelasan, ini mengurangi keterbacaan kode dan penjelasannya!
Rohan Khude
0

Swift 3.0 & iOS 10+

UIApplication.shared.openURL(url) diubah menjadi UIApplication.shared.open(_ url: URL, options:[:], completionHandler completion: nil)

opsi dan penangan penyelesaian adalah opsional, rendering:

UIApplication.shared.open(url)

https://developer.apple.com/reference/uikit/uiapplication/1648685-open

RLoniello
sumber
0

Untuk pendekatan Swift 3.1 & yang kompatibel ke belakang, lakukan ini:

@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)
   }
}
Lauren Roth
sumber
0

Jika nomor telepon Anda berisi spasi, hapus spasi terlebih dahulu! Kemudian Anda dapat menggunakan solusi jawaban yang diterima .

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)
    }
}
catanore
sumber
Pertanyaan ini sekarang berisi 17 jawaban dan berusia lebih dari 3 tahun. Mengapa Anda merasa perlu menambahkan jawaban lain?
Fogmeister
1
Karena saya tidak mengerti mengapa tidak berfungsi jika nomor telepon berisi spasi. Jangan terlalu negatif, mister meister!
catanore
Sangat mengerti itu. Jadi tambahkan pertanyaan baru secara eksplisit tentang spasi dalam angka dan tambahkan jawaban Anda sendiri. Tidak ada salahnya mengajukan pertanyaan dan menjawabnya sendiri. (Meskipun, saya cukup yakin pertanyaan itu akan ditutup sebagai duplikat).
Fogmeister
1
Tidak, penting untuk memberi tahu orang-orang di sini mengapa url tidak dibuka: karena nihil, karena nomor telepon mengandung spasi. Yang saya setujui, bahwa ini lebih merupakan komentar daripada jawaban. Tapi ada terlalu banyak komentar di sana.
catanore
Apakah penyebutan spasi membantu Anda?
catanore