신속하게 전화 걸기


89

특정 번호를 사용하지 않고 변수로 호출되는 번호로 전화를 걸거나 적어도 전화기에서 번호를 가져 오라고 말하려고합니다. 변수에서 호출되는이 숫자는 파서를 사용하거나 웹 사이트 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)!)

        }

답변:


191

단지 시도:

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

전화 번호가 busPhone.

NSURL의 init(string:)너무 사용하여, 선택 사양 반환을 if let우리가 확인 urlA는 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 나는 단지 편지를 놓치고 있었다. 좋아요 버튼을 눌러도 아무 일도 일어나지 않습니다. 여기 parserDidEndDocument func에 대한 추가 정보를 원하시면 ----------입니다 (파서 : NSXMLParser!) {에 println (busPhone) drawUpdatedView ()}
— 토마스 마르티네즈

1
휴대폰에서 테스트하고 있습니까? tel : // URL을 여는 것은 시뮬레이터가 아닌 실제 iPhone에서만 작동하고 iPod 또는 iPad에서는 작동하지 않을 것이라고 생각합니다.
— Thomas Müller

네, 버튼이 클릭되는 아이폰 4s에서 테스트하고 있지만 내 전화의 SQL 서버에서 busPhone이 호출 한 번호를 가져 오지 않습니다. 전화 번호와 함께 tel : //을 사용하면 전화를 겁니다.
— 토마스 마르티네즈

2
좋아 나는 문제가 무엇인지 알고 있다고 생각하지만 그것을 고치는 방법을 모른다. URL에서 가져온 번호는 정확히 123456-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")하여 전화를 걸 수 있어야합니다 .


아래와 같이 오류가 발생합니다. swift 3에 대한 "이 앱은 scheme tel을 쿼리 할 수 ​​없습니다."시뮬레이터에서 작동합니까?
— Kiran jadhav

1
이 코드는 시뮬레이터에서 작동하지 않습니다. 확인하려면 장치를 사용하십시오.
— Ramakrishna

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

좋아, 도움을 받아 알아 냈어. 또한 전화 번호가 유효하지 않은 경우를 대비하여 멋진 작은 경고 시스템을 설치했습니다. 내 문제는 내가 올바르게 부르고 있었지만 번호에 공백과 ( "123456-7890")과 같은 원하지 않는 문자가있었습니다. UIApplication은 귀하의 번호가 ( "1234567890") 인 경우에만 작동하거나 수락합니다. 따라서 기본적으로 숫자 만 가져 오는 새 변수를 만들어 공백과 유효하지 않은 문자를 제거합니다. 그런 다음 UIApplication을 사용하여 해당 번호를 호출합니다.

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
또한 #은 요청시 사용 된 문자 중 하나입니다. :)
— The iOSDev

9

위의 답변은 부분적으로 정확하지만 "tel : //"에는 한 가지 문제 만 있습니다. 통화가 끝나면 앱이 아닌 홈 화면으로 돌아갑니다. "telprompt : //"를 사용하는 것이 더 좋으므로 앱으로 돌아갑니다.

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

분명히이 앱은 얻을 것이다 거부
— 톰 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)
}

6

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

아래의 누군가는 "tel"대신 "telprompt"를 사용하면 앱이 거부 될 것이라고 말합니다.
— Andy Weinstein

@AndyWeinstein 어 어쩌면 그들이 그것을 잡았다면, 그러나 그들은 나의 것을 거부하지 않았습니다
— grantespo

4

스위프트 3에서는

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

4

번호 유효성 검사와 함께 신속한 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

이것은 Swift 2.0을 사용 하는 @Tom 의 답변에 대한 업데이트입니다. 참고 -이것은 내가 사용하는 전체 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
감가 상각되지 않았습니다. 당신은 신속 3. 사용하고 있기 때문에 구문의 변화입니다
— Hammadzafar

@Hammadzafar, openURl (url) 메서드는 실제로 사용되지 않습니다. 그것의 새로운 버전은 다른 서명을 가지고 있으며, 또한 열 이름이 변경되었습니다 (completionHandler를 URL : 옵션)
— 모방

그게 전부는 빠른 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)
    }
}

추신:

  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)

또한 '+'와 '#'문자 제거
— 아 므르 화가

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

신속한 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.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이 열리지 않는 이유를 사람들에게 알려주는 것이 중요합니다. 전화 번호에 공백이 포함되어 있기 때문에 URL이 0이기 때문입니다. 내가 동의하는 것은 이것이 답변 이라기보다는 코멘트 여야한다는 것입니다. 하지만 댓글이 너무 많습니다.
— catanore

공백에 대한 언급이 도움이 되었습니까?
— catanore
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.