โทรเข้าหมายเลขโทรศัพท์อย่างรวดเร็ว


90

ฉันพยายามโทรหาหมายเลขที่ไม่ได้ใช้หมายเลขเฉพาะ แต่เป็นหมายเลขที่ถูกเรียกในตัวแปรหรืออย่างน้อยก็บอกให้ดึงหมายเลขในโทรศัพท์ของคุณ หมายเลขนี้ที่ถูกเรียกในตัวแปรคือตัวเลขที่ฉันดึงมาโดยใช้ตัวแยกวิเคราะห์หรือดึงมาจากเว็บไซต์ sql ฉันสร้างปุ่มเพื่อพยายามโทรไปยังหมายเลขโทรศัพท์ที่เก็บไว้ในตัวแปรด้วยฟังก์ชัน แต่ไม่เป็นประโยชน์ อะไรจะช่วยได้ขอบคุณ!

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

        }

คำตอบ:


193

เพียงแค่พยายามที่:

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

busPhoneสมมติว่าหมายเลขโทรศัพท์ที่อยู่ใน

NSURLเป็นinit(string:)ผลตอบแทนที่เป็นตัวเลือกดังนั้นโดยใช้if letเราให้แน่ใจว่าurlเป็นNSURL(และไม่NSURL?กลับมาโดยinit)


สำหรับ 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)
    }
}

เราจำเป็นต้องตรวจสอบว่าเราใช้ iOS 10 หรือใหม่กว่าเนื่องจาก:

'openURL' เลิกใช้งานแล้วใน iOS 10.0


นี่ทำให้ฉันมีข้อผิดพลาดของตัวระบุ 'url' ที่ยังไม่ได้รับการแก้ไขซึ่งชี้ไปที่. openURL (url) ขอบคุณสำหรับความช่วยเหลือ!
Thomas Martinez

nvm ฉันหายไปแค่ตัวอักษร โอเคเมื่อฉันกดปุ่มก็ไม่มีอะไรเกิดขึ้น นี่คือข้อมูลเพิ่มเติม ---------- func parserDidEndDocument (parser: NSXMLParser!) {println (busPhone) drawUpdatedView ()}
Thomas Martinez

1
คุณกำลังทดสอบสิ่งนี้ทางโทรศัพท์หรือไม่ ฉันสงสัยว่าการเปิด tel: // URL จะใช้ได้เฉพาะกับ iPhone จริงเท่านั้นไม่ใช่ในเครื่องจำลองและไม่ใช้กับ iPod หรือ iPad
Thomas Müller

ใช่ฉันกำลังทดสอบบน iphone 4s ที่ปุ่มคลิก แต่มันไม่ดึงหมายเลขที่เรียกโดย busPhone จากเซิร์ฟเวอร์ sql บนโทรศัพท์ของฉัน เมื่อฉันใช้โทร: // ด้วยหมายเลขโทรศัพท์มันจะโทรออก
Thomas Martinez

2
โอเคฉันคิดว่าฉันรู้ว่าปัญหาคืออะไร แต่ไม่รู้วิธีแก้ไข หมายเลขที่ดึงออกมาจาก URL เขียนแบบนี้ 123 456-7890 และไม่ใช่ 1234567890 นี้ฉันจะแปล tel: // เพื่ออ่าน URL ในรูปแบบที่จะจดจำได้อย่างไร
Thomas Martinez

66

โซลูชันที่มีอยู่ในตัวใน 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)
    }
  }
}

คุณควรจะใช้callNumber("7178881234")โทรออกได้


จะให้ข้อผิดพลาดดังต่อไปนี้ "แอปนี้ไม่ได้รับอนุญาตให้สอบถาม Scheme tel" สำหรับ swift 3 และสิ่งเหล่านี้ใช้งานได้กับโปรแกรมจำลองหรือไม่?
Kiran jadhav

1
รหัสนั้นจะไม่ทำงานในโปรแกรมจำลอง หากต้องการตรวจสอบให้ใช้อุปกรณ์
รามก

24

สวิฟต์ 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 และ ios 10 หรือเก่ากว่า

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

โอเคฉันได้รับความช่วยเหลือและคิดออกแล้ว นอกจากนี้ฉันยังวางระบบเตือนภัยเล็ก ๆ น้อย ๆ ไว้ในกรณีที่หมายเลขโทรศัพท์ไม่ถูกต้อง ปัญหาของฉันคือฉันโทรถูก แต่หมายเลขมีช่องว่างและอักขระที่ไม่ต้องการเช่น ("123 456-7890") แอปพลิเคชันใช้งานได้หรือยอมรับหากหมายเลขของคุณคือ ("1234567890") ดังนั้นคุณจึงลบช่องว่างและอักขระที่ไม่ถูกต้องออกโดยการสร้างตัวแปรใหม่เพื่อดึงเฉพาะตัวเลข จากนั้นเรียกหมายเลขเหล่านั้นด้วยแอปพลิเคชัน 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
คุณควรอนุญาตให้มีเครื่องหมาย "+" ที่ฉันคิด
florian

1
นอกจากนี้ # ยังเป็นหนึ่งในตัวละครที่ใช้ในการร้องขอ :)
iOSDev

9

คำตอบข้างต้นถูกต้องบางส่วน แต่สำหรับ "tel: //" มีเพียงปัญหาเดียว หลังจากสิ้นสุดการโทรสายจะกลับไปที่หน้าจอหลักไม่ใช่แอปของเรา ดีกว่าถ้าใช้ "telprompt: //" มันจะกลับไปที่แอป

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

เห็นได้ชัดว่านี่จะทำให้แอปของคุณถูกปฏิเสธ
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: nilเป็นอาร์กิวเมนต์เริ่มต้นคุณสามารถละเว้นได้
Tim Vermeulen

7

ฉันใช้วิธีนี้ในแอปพลิเคชันของฉันและใช้งานได้ดี ฉันหวังว่านี่อาจช่วยคุณได้เช่นกัน

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

ใช้งานได้กับอุปกรณ์จริงเท่านั้น

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

มีคนด้านล่างบอกว่าหากคุณใช้ "telprompt" แทน "tel" แอปของคุณจะถูกปฏิเสธ
Andy Weinstein

@AndyWeinstein เอ๊ะบางทีถ้าพวกเขาจับมัน แต่พวกเขาไม่ได้ปฏิเสธใด ๆ ของฉัน
grantespo

4

ใน Swift 3

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

4

ฉันใช้โซลูชัน swift 3 พร้อมการตรวจสอบหมายเลข

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

นี่คือการอัปเดตคำตอบของ @ Tom โดยใช้ Swift 2.0 Note - นี่คือคลาส CallComposer ทั้งหมดที่ฉันใช้

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 นี่คือไวยากรณ์ใหม่:

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

1
ไม่คิดค่าเสื่อมราคา การเปลี่ยนแปลงในไวยากรณ์เป็นเพราะคุณใช้ swift 3
Hammadzafar

@Hammadzafar เมธอด openURl (url) เลิกใช้งานแล้วจริงๆ เวอร์ชันใหม่มีลายเซ็นที่แตกต่างกันและได้รับการเปลี่ยนชื่อเพื่อเปิด (url: options: completeHandler)
เลียนแบบ

นั่นเป็นเพราะ swift 2.3 กำลังจะถูกหักค่าเสื่อมราคาในไม่ช้า
Hammadzafar

2

คำตอบอื่น ๆ อีกมากมายใช้ไม่ได้กับ Swift 5 ด้านล่างนี้คือการอัปเดตโค้ดของ 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. ด้วยคำตอบส่วนใหญ่ฉันไม่สามารถรับข้อความแจ้งบนอุปกรณ์ได้ โค้ดด้านบนสามารถแสดงพรอมต์ได้สำเร็จ
  2. ไม่มี//หลังโทร:เหมือนคำตอบส่วนใหญ่ และใช้งานได้ดี

1

โซลูชัน 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)

มันยังลบ '+' และ '#' ถ่าน
Amr Angry

1

นี่เป็นอีกทางเลือกหนึ่งในการลดหมายเลขโทรศัพท์ลงในส่วนประกอบที่ถูกต้องโดยใช้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

สำหรับ 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.")
}

1

สำหรับ Swift 4.2 ขึ้นไป

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
แม้ว่าข้อมูลโค้ดนี้จะช่วยแก้ปัญหาได้ แต่การอธิบายจะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้มาก โปรดจำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและบุคคลเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำโค้ดของคุณ โปรดพยายามอย่าเบียดโค้ดของคุณด้วยความคิดเห็นเชิงอธิบายซึ่งจะช่วยลดความสามารถในการอ่านโค้ดและคำอธิบาย!
Rohan Khude

0

Swift 3.0 และ iOS 10+

UIApplication.shared.openURL(url) ถูกเปลี่ยนเป็น UIApplication.shared.open(_ url: URL, options:[:], completionHandler completion: nil)

ตัวเลือกและตัวจัดการการเสร็จสิ้นเป็นทางเลือกการแสดงผล:

UIApplication.shared.open(url)

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


0

สำหรับวิธีที่เข้ากันได้กับ Swift 3.1 & ย้อนหลังให้ทำดังนี้:

@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

หากหมายเลขโทรศัพท์ของคุณมีช่องว่างให้ลบออกก่อน! จากนั้นคุณสามารถใช้คำตอบที่ยอมรับได้

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

คำถามนี้มีคำตอบ 17 คำตอบและมีอายุมากกว่า 3 ปี ทำไมคุณถึงรู้สึกว่าจำเป็นต้องเพิ่มคำตอบอื่น
Fogmeister

1
เพราะฉันไม่เข้าใจว่าทำไมมันถึงใช้ไม่ได้ถ้าหมายเลขโทรศัพท์มีช่องว่าง อย่ามองในแง่ลบนะมิสเตอร์เมสเตอร์!
catanore

เข้าใจอย่างนั้นแน่นอน ดังนั้นให้เพิ่มคำถามใหม่อย่างชัดเจนเกี่ยวกับการเว้นวรรคในตัวเลขและเพิ่มคำตอบของคุณเอง ไม่มีอะไรผิดในการถามคำถามและตอบคำถามด้วยตัวเอง (แม้ว่าฉันค่อนข้างมั่นใจว่าคำถามนั้นจะถูกปิดว่าซ้ำกัน)
Fogmeister

1
ไม่จำเป็นต้องบอกคนที่นี่ว่าเหตุใดจึงไม่เปิด url เนื่องจากไม่มีการเว้นวรรคเนื่องจากหมายเลขโทรศัพท์มีช่องว่าง สิ่งที่ฉันยอมรับว่านี่ควรเป็นความคิดเห็นมากกว่าคำตอบ แต่มีความคิดเห็นมากเกินไปที่นั่น
catanore

การพูดถึงช่องว่างช่วยคุณได้หรือไม่?
catanore
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.