SwiftUI URLからページタイトルを取得
import Combine
import Foundation
class GetTitleForLink: ObservableObject {
@Published var url: String = ""
@Published var title: String = ""
var cancellables = Set<AnyCancellable>()
init() {
$url.sink { [weak self] _ in
guard let self else { return }
self.fetchURLTitle()
}
.store(in: &cancellables)
}
func fetchURLTitle() {
guard let url = URL(string: url) else { return }
URLSession.shared.dataTaskPublisher(for: url)
.map { data, _ in String(data: data, encoding: .utf8) }
.compactMap { $0 }
.replaceError(with: "")
.receive(on: DispatchQueue.global())
.map { html in
guard let range = html.range(of: "<title>.*?</title>", options: .regularExpression, range: nil, locale: nil) else { return "" }
return html[range].replacingOccurrences(of: "</?title>", with: "", options: .regularExpression, range: nil)
}
.receive(on: DispatchQueue.main)
.sink { [weak self] title in
guard let self else { return }
self.title = title
}
.store(in: &cancellables)
}
}
@EnvironmentObject で受け取って使用できる。