Search
Duplicate

[SwiftUI] 전화 걸기, 메일 보내기 및 전화번호 Formatting

생성일
2024/08/26 04:45
태그
틈틈히 자기개발
SwiftUI

[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
복사

Reference