신속하게 전화 걸기


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.

NSURLinit(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.