🌐

【Swift】電話番号やURLタップで電話アプリやブラウザを起動する

2023/04/10に公開

概要

電話番号やURLタップで電話アプリやブラウザを起動する実装方法の紹介です。

汎用的に使用できる

  • UIApplication.shared.open
    SwiftUIでのみ使用できる
  • Link
  • @Environment(.openURL)
    を使用した方法3選の紹介です。

環境

この記事は以下のバージョン環境のもと作成されたものです。
【Xcode】14.3
【iOS】16.4
【macOS】Ventuta

UIApplication.shared.openを使用する

使用できる環境が

使用方法に関してはUIApplication.shared.open(url)のurlの部分にURL型の値を代入する事で使用できます。以下サンプルコードです。

func tapedTransitionToPhoneApp(phoneNumber: String) {
    guard let url = URL(string: "tel://" + phoneNumber) else { return }
    UIApplication.shared.open(url)
}

このメソッドを叩くと標準の電話アプリが起動して電話をかけることができます。

Linkを使用する

使用できる環境はiOS14.0以降、SwiftUIでのみ使用できます。
以下ドキュメントです。
https://developer.apple.com/documentation/swiftui/link
Link("View Our Terms of Service",destination: URL(string: "https://www.example.com/TOS.html")!)と1行でViewから処理まで行うことができるので非常に簡潔にコーディングすることができます。標準のものを使用するだけであればこれで事足ります。

@Environment(.openURL)を使用する

こちらも使用できる環境はiOS14.0以降、SwiftUIでのみ使用できます。
以下ドキュメントです。
https://developer.apple.com/documentation/swiftui/environmentvalues/openurl
@Environmentって何?と言う方はこちらのドキュメントを参照ください。
https://developer.apple.com/documentation/swiftui/environmentvalues
また独自のスキームを使用する場合はonOpenURLを使用するようです。以下ドキュメントです。
https://developer.apple.com/documentation/swiftui/view/onopenurl(perform:)

以下サンプルコードです。

struct OpenURLExample: View {
    @Environment(\.openURL) private var openURL
    var body: some View {
        Button {
            if let url = URL(string: "https://www.example.com") {
                openURL(url)
            }
        } label: {
            Label("Get Help", systemImage: "person.fill.questionmark")
        }
    }
}

各サンプルコードのまとめ

上記それぞれを試してみたサンプルコードです。

ContentView
struct ContentView: View {
    var body: some View {
        NavigationStack {
            List {
                NavigationLink {
                    TransitionToPhoneApp()
                } label: {
                    HStack {
                        Image(systemName: "star.fill")
                        Text("TapedTransitionToPhoneApp")
                    }
                }
                NavigationLink {
                    TransitionToBrowserApp()
                } label: {
                    HStack {
                        Image(systemName: "star.fill")
                        Text("TapedTransitionToBrowserApp")
                    }
                }
            }
            .listStyle(GroupedListStyle())
            .navigationTitle("Prototype List")
        }
    }
}
TransitionToPhoneAppView
struct TransitionToPhoneAppView: View {
    let phoneNumber = "0123456789"
    @Environment(\.openURL) var openURL
    var body: some View {
        VStack {
            HStack {
                Text("Tel")
                Button {
                    tapedTransitionToPhoneApp(phoneNumber: phoneNumber)
                } label: {
                    Text(phoneNumber)
                }
            }
            Link(destination: URL(string: "tel://" + phoneNumber)!) {
                Text("open apple")
            }
            Button {
                if let url = URL(string: "tel://" + phoneNumber) {
                    openURL(url)
                }
            } label: {
                Label("open apple", systemImage: "apple.logo")
            }
        }
        .onOpenURL(perform: <#T##(URL) -> ()#>)
    }
    func tapedTransitionToPhoneApp(phoneNumber: String) {
        guard let url = URL(string: "tel://" + phoneNumber) else { return }
        UIApplication.shared.open(url)
    }
}
TransitionToBrowserAppView
struct TransitionToBrowserAppView: View {
    let url = "https://www.apple.com/"
    @Environment(\.openURL) var openURL
    var body: some View {
        VStack {
            HStack {
                Text("URL")
                Button {
                    tapedTransitionToBrowserApp(urlString: url)
                } label: {
                    Text(url)
                }
            }
            Link(destination: URL(string: url)!) {
                Text("open apple")
            }
            Button {
                if let url = URL(string: url) {
                    openURL(url)
                }
            } label: {
                Label("open apple", systemImage: "apple.logo")
            }
        }
    }
    func tapedTransitionToBrowserApp(urlString: String) {
        guard let url = URL(string: url) else { return }
        UIApplication.shared.open(url)
    }
}

まとめ

以上電話番号やURLタップで電話アプリやブラウザを起動する方法でした。

Discussion