[SwiftUI] 전화 걸기, 메일 보내기 및 전화번호 Formatting
전화 걸기
if restaurant.contactTel != "" {
Text("전화번호 : \(restaurant.contactTel)")
}
Swift
복사
기존 코드에서는
이렇게 나타났었다.
근데 난 이 전화번호를 누르면 통화가 되게 하고 싶다 ㅎㅎㅎㅎ
방법 1: Link 사용
Link 는 SwiftUI에서 간단하게 URL을 열거나 전화 걸기와 같은 작업을 수행할 때 사용할 수 있는 기본적인 컴포넌트이다.
•
Link 는 SwiftUI의 네이티브 방식으로, 사용자가 링크를 클릭하면 자동으로 지정된 URL로 이동한다.
•
하지만 URL을 열기 전에 특정 작업을 수행하거나 URL 생성 로직을 더 복잡하게 구현해야 할 때는 다소 제한적이다.
Link("\(restaurant.contactTel)", destination: URL(string:
"tel://\(restaurant.contactTel)")!)
Swift
복사
방법 2: Button 사용
Button("전화번호") {
let telephone: "tel://" + restaurant.contactTel
guard let url = URL(string: telephone) else { return }
UIApplication.shared.open(url)
}
Swift
복사
URL 앞에 "tel://" 을 붙이면 전화번호로 인식하게 된다.
이를 URL로 변환 후, UIApplication에서 open 해주면 전화로 연결 할 수 있게 된다.
이메일
마찬가지로 메일도 앞에 "mailto:" 을 붙여주고 위와 같은 방식으로 open 해주면 이메일로 연결 할 수 있다.
Button("email") {
let emailAddr = "mailto:" + emailString
guard let url = URL(string: emailAddr) else { return }
UIApplication.shared.open(url)
}
Swift
복사
✚ 추가
또는, 전화번호를 평소 표현하는 방식대로 010-XXXX-XXXX 와 같이 표현하기 위해서는 아래 코드 작성한 후
extension String {
func prettyPhoneNumber() -> String {
let _str = self.replacingOccurrences(of: "-", with: "")
let arr = Array(_str)
if arr.count > 3 {
let prefix = String(format: "%@%@%@", String(arr[0]), String(arr[1]), String(arr[2]))
if prefix == "02" {
if let regex = try? NSRegularExpression(pattern: "([0-9]{2})([0-9]{3,4})([0-9]{4})", options: .caseInsensitive) {
let modString = regex.stringByReplacingMatches(in: _str, options: [],
range: NSRange(_str.startIndex..., in: _str),
withTemplate: "$1-$2-$3")
return modString
}
} else if prefix == "15" || prefix == "16" || prefix == "18" {
if let regex = try? NSRegularExpression(pattern: "([0-9]{4})([0-9]{4})", options: .caseInsensitive) {
let modString = regex.stringByReplacingMatches(in: _str, options: [],
range: NSRange(_str.startIndex..., in: _str),
withTemplate: "$1-$2")
return modString
}
} else if prefix.hasPrefix("05") {
// Handle 050X numbers
if let regex = try? NSRegularExpression(pattern: "([0-9]{3})([0-9]{4})([0-9]{4})", options: .caseInsensitive) {
let modString = regex.stringByReplacingMatches(in: _str, options: [],
range: NSRange(_str.startIndex..., in: _str),
withTemplate: "$1-$2-$3")
return modString
}
} else {
if let regex = try? NSRegularExpression(pattern: "([0-9]{3})([0-9]{3,4})([0-9]{4})", options: .caseInsensitive) {
let modString = regex.stringByReplacingMatches(in: _str, options: [],
range: NSRange(_str.startIndex..., in: _str),
withTemplate: "$1-$2-$3")
return modString
}
}
}
return self
}
}
Swift
복사
아래와 같이 String 변수의 method로 호출해주면 된다.
// 01012345678 -> 010-1234-5678
Text(restaurant.contactTel.prettyPhoneNumber())
Swift
복사