如何在 SwiftUI 中创建可点击的 url/phone 数字

How to create tappable url/phone number in SwiftUI

我想在 SwiftUI 文本(或任何视图)中显示一个 phone 数字,然后使其可点击,以便打开 'Phone'。

有没有办法用 SwiftUI 做到这一点,或者我应该尝试在 SwiftUI 中包装一个 UITextView,然后用老式的方法用 NSAttributed 字符串等来做?

我已阅读 SwiftUI 中文本的文档,但找不到有关如何执行此操作的任何信息。目前正尝试在 Xcode 11 beta 5 中执行此操作。

我在 SwiftUI.h

的 SwiftUI API 中搜索了 'text'

我还用 "make phone number/url tappable"、"Tappable link/url swiftUI" 等查询搜索了 Whosebug [swiftui] 和 google。

Text("123-456-7890")
    .onTapGesture {
    // do something here
}

(文本将是日语 phone 数字)

通过动作使其成为 Button(),而不是通过手势成为 Text()

试试这个,

let strNumber = "123-456-7890"

Button(action: {
    let tel = "tel://"
    let formattedString = tel + strNumber 
    guard let url = URL(string: formattedString) else { return }
    UIApplication.shared.open(url) 
   }) {
   Text("123-456-7890")
}

感谢 Ashish 的回答,我找到了解决此问题所需的必要代码:

在 Button 的 里面 中 - 你需要调用这个方法:

UIApplication.shared.open(url)

实际进行 phone 调用/在 SwiftUI 视图中打开 link。

当然,一开始我不明白如何格式化我的 phone 号码,我在这些答案中找到了:

How to use openURL for making a phone call in Swift?

不要忘记将 'tel://' 添加到 string/format 的开头,如 URL..

有效的完整代码是

Button(action: {

    // validation of phone number not included
    let dash = CharacterSet(charactersIn: "-")

    let cleanString =     
    hotel.phoneNumber!.trimmingCharacters(in: dash)

    let tel = "tel://"
    var formattedString = tel + cleanString
    let url: NSURL = URL(string: formattedString)! as NSURL

    UIApplication.shared.open(url as URL)

}) {
Text(verbatim: hotel.phoneNumber!)
}

亲吻答案:

Button("url") {UIApplication.shared.open(URL(string: "https://google.com")!)}

从iOS14开始,Apple默认为我们提供了Link视图。所以,你可以只使用这个,

Link("Anyone can learn Swift", destination: URL(string: "https://ohmyswift.com")!)

iOS以前的版本,比如iOS13.0,还是要用

Button("Anyone can learn Swift") {
   UIApplication.shared.open(URL(string: "https://ohmyswift.com")!)
}
 

使用 iOS 14 / Xcode 12.0 beta 5

使用 SwiftUI 中的新 link 功能 phone 和电子邮件 links。

    // Link that will open Safari on iOS devices
    Link("Apple", destination: URL(string: "https://www.apple.com")!)
    
    //  Clickable telphone number
    Link("(800)555-1212", destination: URL(string: "tel:8005551212")!)

    //  Clickable Email Address
    Link("apple@me.com", destination: URL(string: "mailto:apple@me.com")!)
    

使用 iOS 14 / Xcode 12.5
如果您想使用视图,我会添加这个。

点击视图拨打电话

Link(destination: URL(string: "tel:1234567890")!, label: {
  SomeView()
})

点击字符串拨打电话

Link("1234567890", destination: URL(string: "tel:1234567890")!)
Button {

  var cleanNum = selectedItem.phoneNum
  let charsToRemove: Set<Character> = [" ", "(", ")", "-"] // "+" can stay
  cleanNum.removeAll(where: { charsToRemove.contains([=10=]) })
  
  guard let phoneURL = URL(string: "tel://\(cleanNum)") else { return }
  UIApplication.shared.open(phoneURL, options: [:], completionHandler: nil)

} label: {
  // ...
}

iOS 15(测试版)

利用支持链接的 SwiftUI 中的 Markdown!

struct ContentView: View {
    var body: some View {
        Text("Call [123-456-7890](tel:1234567890)")
    }
}

结果:

如果您需要在点击 link 时记录任何事件,您也可以这样做:

    struct exampleView: View {

    @SwiftUI.Environment(\.openURL) private var openURL

    var body: some View {
      
        Button {
            if let url = URL(string: "https://www.google.com") {
                openURL(url)
             }
         } label: {
               Text("Link")
                .foregroundColor(Color("EyrusDarkBlue"))
            }

    }


    }