代码之家  ›  专栏  ›  技术社区  ›  alionthego

如何将http或https添加到swift URL?

  •  0
  • alionthego  · 技术社区  · 3 年前

    我有一个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部分。但我觉得我做错了。

    0 回复  |  直到 3 年前