Gọi một số điện thoại nhanh chóng


89

Tôi đang cố gắng gọi một số không sử dụng các số cụ thể mà là một số đang được gọi trong một biến số hoặc ít nhất là yêu cầu nó kéo lên số trong điện thoại của bạn. Số này đang được gọi trong một biến là một số mà tôi lấy ra bằng cách sử dụng trình phân tích cú pháp hoặc lấy từ sql trang web. Tôi đã tạo một nút để cố gắng gọi số điện thoại được lưu trữ trong biến bằng một hàm nhưng vô ích. Bất cứ điều gì sẽ giúp đỡ cảm ơn!

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

        }

Câu trả lời:


191

Thử xem:

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

giả sử rằng số điện thoại là trong busPhone.

NSURL's init(string:)trả về một Tùy chọn, vì vậy bằng cách sử dụng, if letchúng tôi đảm bảo rằng đó urlNSURL(và không phải là một NSURL?như được trả về bởi init).


Đối với 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)
    }
}

Chúng tôi cần kiểm tra xem chúng tôi đang sử dụng iOS 10 trở lên vì:

'openURL' không được dùng nữa trong iOS 10.0


điều này khiến tôi gặp lỗi về 'url' định danh chưa được khắc phục - trỏ về phía .openURL (url) Nhân tiện, cảm ơn sự giúp đỡ!
Thomas Martinez

nvm tôi chỉ thiếu một lá thư. không sao, vì vậy khi tôi nhấn nút không có gì xảy ra. đây là thông tin khác ---------- func parserDidEndDocument (parser: NSXMLParser!) {println (busPhone) drawUpdatedView ()}
Thomas Martinez

1
Bạn đang thử nghiệm điều này trên điện thoại? Tôi nghi ngờ việc mở URL tel: // sẽ chỉ hoạt động trên iPhone thực, không phải trong trình mô phỏng và không trên iPod hoặc iPad.
Thomas Müller

Đúng vậy, tôi đang thử nghiệm nó trên iphone 4s, nút bấm nhưng nó không kéo lên số được gọi bởi busPhone từ máy chủ sql trên điện thoại của tôi. Khi tôi sử dụng tel: // với một số điện thoại, nó sẽ quay số đó.
Thomas Martinez

2
Được rồi, tôi nghĩ tôi biết vấn đề là gì nhưng không biết cách khắc phục. Số đang được lấy từ URL được viết chính xác như thế này 123 456-7890 chứ không phải như thế này 1234567890. Làm cách nào để dịch tel: // để đọc URL ở dạng mà nó sẽ nhận ra?
Thomas Martinez

66

Một giải pháp độc lập trong 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)
    }
  }
}

Bạn sẽ có thể sử dụng callNumber("7178881234")để thực hiện cuộc gọi.


nó sẽ cho lỗi như dưới đây; "Ứng dụng này không được phép truy vấn cho chương trình tel" cho swift 3 và những ứng dụng này có hoạt động trên trình mô phỏng hay không?
Kiran jadhav

1
Mã đó sẽ không hoạt động trong trình mô phỏng. Nếu bạn muốn kiểm tra nó, hãy sử dụng một thiết bị.
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 và iOS 10 trở lên

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

Được rồi, tôi nhận được sự giúp đỡ và tìm ra nó. Ngoài ra, tôi đặt một hệ thống cảnh báo nhỏ xinh để đề phòng trường hợp số điện thoại không hợp lệ. Vấn đề của tôi là tôi đã gọi đúng nhưng số có dấu cách và các ký tự không mong muốn như ("123 456-7890"). Ứng dụng UIA chỉ hoạt động hoặc chấp nhận nếu số của bạn là ("1234567890"). Vì vậy, về cơ bản bạn loại bỏ khoảng trắng và các ký tự không hợp lệ bằng cách tạo một biến mới để chỉ kéo các số. Sau đó, gọi những số đó bằng Ứng dụng 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()
        }
        }

6
Tôi nghĩ bạn cũng nên cho phép dấu '+'.
florian

1
Ngoài ra # là một trong những ký tự được sử dụng tại thời điểm đưa ra yêu cầu :)
iOSDev

9

Các câu trả lời trên đúng một phần, nhưng với "tel: //" thì chỉ có một vấn đề. Sau khi cuộc gọi kết thúc, nó sẽ trở lại màn hình chính, không phải ứng dụng của chúng tôi. Vì vậy, tốt hơn nên sử dụng "telprompt: //", nó sẽ quay trở lại ứng dụng.

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

Rõ ràng điều này sẽ được ứng dụng của bạn từ chối
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: nillà các đối số mặc định, bạn có thể bỏ qua chúng.
Tim Vermeulen

7

Tôi đang sử dụng phương pháp này trong ứng dụng của mình và nó hoạt động tốt. Tôi hy vọng điều này cũng có thể giúp bạn.

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

5

Swift 5: iOS> = 10.0

Chỉ hoạt động trên thiết bị vật lý.

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

Ai đó bên dưới nói rằng nếu bạn sử dụng "telprompt" thay vì "tel" thì ứng dụng của bạn sẽ bị từ chối.
Andy Weinstein

@AndyWeinstein eh có thể nếu họ bắt được nó, nhưng họ chưa từ chối bất kỳ cái nào của tôi
Grantespo

4

Trong Swift 3,

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

4

Tôi đang sử dụng giải pháp nhanh 3 với xác thực số

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

Đây là bản cập nhật cho câu trả lời của @ Tom bằng Swift 2.0 Lưu ý - Đây là toàn bộ lớp CallComposer mà tôi đang sử dụng.

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 () đã không còn được dùng trong iOS 10. Đây là cú pháp mới:

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

1
nó không bị mất giá. sự thay đổi trong cú pháp là do bạn đang sử dụng swift 3.
Hammadzafar

@Hammadzafar, phương thức openURl (url) thực sự không được dùng nữa. Phiên bản mới của nó có chữ ký khác và cũng đã được đổi tên thành mở (url: options: completeHandler)
bắt chước

Thats vì nhanh chóng 2.3 được sớm sẽ được khấu hao
Hammadzafar

2

Nhiều câu trả lời khác không hoạt động với Swift 5. Dưới đây là bản cập nhật mã cho 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)
    }
}

Tái bút:

  1. Với hầu hết các câu trả lời, tôi không thể nhận được lời nhắc trên thiết bị. Đoạn mã trên đã có thể hiển thị lời nhắc thành công.
  2. Không có // sau tel: như hầu hết các câu trả lời đều có. Và nó hoạt động tốt.

1

Giải pháp 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)

nó cũng loại bỏ ký tự '+' và '#'
Amr Angry

1

Đây là một cách thay thế để giảm số điện thoại thành các thành phần hợp lệ bằng cách sử dụng 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

1

Đối với nhanh chóng 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.")
}

1

Đối với Swift 4.2 trở lên

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
Mặc dù đoạn mã này có thể giải quyết câu hỏi, nhưng bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Cũng vui lòng cố gắng không chèn mã của bạn với các nhận xét giải thích, điều này làm giảm khả năng đọc của cả mã và giải thích!
Rohan Khude


0

Để có cách tiếp cận Swift 3.1 & tương thích ngược, hãy làm như sau:

@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

Nếu số điện thoại của bạn chứa khoảng trắng, hãy xóa chúng trước! Sau đó, bạn có thể sử dụng giải pháp của câu trả lời được chấp nhận .

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

Câu hỏi này hiện có 17 câu trả lời và đã hơn 3 năm. Tại sao bạn cảm thấy cần phải thêm một câu trả lời khác?
Fogmeister 14/03/18

1
Bởi vì tôi không hiểu tại sao nó không hoạt động nếu một số điện thoại chứa khoảng trắng. Đừng tiêu cực như vậy, thưa ngài!
catanore 14/03/18

Chắc chắn hiểu điều đó. Vì vậy, hãy thêm một câu hỏi mới một cách rõ ràng về khoảng trắng trong số và thêm câu trả lời của riêng bạn vào đó. Không có gì sai khi đặt câu hỏi và tự trả lời câu hỏi đó. (Mặc dù, tôi khá chắc chắn rằng câu hỏi đó sẽ được đóng lại như một bản sao).
Fogmeister

1
Không, điều quan trọng là phải cho mọi người ở đây biết lý do tại sao url không được mở: bởi vì nó không có, bởi vì số điện thoại chứa khoảng trắng. Điều tôi đồng ý, rằng đây nên là một bình luận hơn là một câu trả lời. Nhưng có quá nhiều bình luận ở đó.
catanore 14/03/18

Việc đề cập đến không gian có giúp ích cho bạn không?
catanore
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.