ios #swift #xcode #urlcomponents
#iOS #swift #xcode #url-компоненты
Вопрос:
У меня есть приложение 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, выполнив очистку для другой, если возвращается ошибка. Но я чувствую, что все это неправильно.