🌐
【Swift】電話番号やURLタップで電話アプリやブラウザを起動する
概要
電話番号やURLタップで電話アプリやブラウザを起動する実装方法の紹介です。
汎用的に使用できる
- UIApplication.shared.open
SwiftUIでのみ使用できる - Link
- @Environment(.openURL)
を使用した方法3選の紹介です。
環境
この記事は以下のバージョン環境のもと作成されたものです。
【Xcode】14.3
【iOS】16.4
【macOS】Ventuta
UIApplication.shared.openを使用する
使用できる環境が
- iOS10.0以降
- UIKit及びSwiftUIで使用可能
の為、汎用的に使用できます。
ドキュメントは以下の通りです。
https://developer.apple.com/documentation/uikit/uiapplication/1648685-open
今回はURLスキームに標準のものを使用していますが独自のスキームを使用する場合はcanOpenURLメソッドを利用して使用可能かどうか予め確認する必要があります。
canOpenURLについては以下のドキュメントを参考にしてください。
https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl
スキームとはについては以下の記事が参考になるかと思います。
https://wa3.i-3-i.info/word1814.html
使用方法に関しては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でのみ使用できます。
以下ドキュメントです。
Link("View Our Terms of Service",destination: URL(string: "https://www.example.com/TOS.html")!)
と1行でViewから処理まで行うことができるので非常に簡潔にコーディングすることができます。標準のものを使用するだけであればこれで事足ります。
@Environment(.openURL)を使用する
こちらも使用できる環境はiOS14.0以降、SwiftUIでのみ使用できます。
以下ドキュメントです。
@Environmentって何?と言う方はこちらのドキュメントを参照ください。
また独自のスキームを使用する場合はonOpenURLを使用するようです。以下ドキュメントです。
以下サンプルコードです。
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