Как я могу добавить http или https к URL-адресу swift?

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, выполнив очистку для другой, если возвращается ошибка. Но я чувствую, что все это неправильно.