我有一个swift应用程序,我正在尝试使用丰富的链接。
我首先使用以下方法检测一些动态文本中的链接:
do {
let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
let matches = detector.matches(in: text, options: [], range: NSRange(location: 0, length: text.utf16.count))
if let match = matches.first {
guard let range = Range(match.range, in: text) else { return }
let uRLString = text[range]
// .. use
}
} catch {
print(error)
}
这很好用,我可以得到文本中的所有链接。但有时链接的形式是example.com,而不是
https://example.com
或
http://example.com
等
为了使用富文本,我需要将链接传递到以下方法以获取元数据:
func fetchMetadata(for link: String, completion: @escaping (Result<LPLinkMetadata, Error>) -> Void) {
guard let uRL = URL(string: link.lowercased()) else { return }
let metadataProvider = LPMetadataProvider()
metadataProvider.startFetchingMetadata(for: uRL) { (metadata, error) in
if let error = error {
print(error)
completion(.failure(error))
return
}
if let metadata = metadata {
completion(.success(metadata))
}
}
}
只有当链接提供了http或https时,此功能才有效。因此,我决定使用以下内容将http添加到链接中:
extension URL {
var sanitise: URL {
if var components = URLComponents(url: self, resolvingAgainstBaseURL: false) {
if components.scheme == nil {
components.scheme = "https"
}
return components.url ?? self
}
return self
}
}
现在,如果我使用uRL.sanitize而不是uRL,它就可以工作了。
现在我有两个问题。首先,对于那些使用http的网站来说,这是不起作用的,如果我使用https作为方案,那么那些不将http转发到https的网站将不起作用。
第二个富链接中的链接显示为:
没有斜杠(//)的http:example.com。
我想知道是否有更好的方法来解决这个问题。如果返回错误,我想我可以通过清除另一个部分来解决http/https部分。但我觉得我做错了。