如何在Swift 4中获取URL的顶级域名?

时间:2018-07-23 10:14:37

标签: ios swift xcode nsurl

我的要求是通过过滤URL的子域名来获取URL的域名。

我可以使用以下代码获取主机名

if let url = URL(string: "https://blog.abc.in/")  {
    if let hostName = url.host  {
         print("host name = \(hostName)") // output is: blog.mobilock.in
    }
 }

因此,URL中的 blog 是子域,而 mobilock 是域名,我希望通过排除它的子域部分来仅知道/打印 mobilock

在android中,有一个类InternetDomainName返回了域名,我正在寻找iOS的类似解决方案

我尝试了几个答案,但不是任何一个都重复,或者其中一些不起作用,或者是解决方法。

Get the domain part of an URL string?

4 个答案:

答案 0 :(得分:1)

这只是一种解决方法,但效果很好:

    if let url = URL(string: "https://x.y.z.a.b.blog.mobilock.in/")  {
        if let hostName = url.host  {
            print("host name = \(hostName)") // output is: x.y.z.a.b.blog.mobilock.in

            let subStrings = hostName.components(separatedBy: ".")
            var domainName = ""
            let count = subStrings.count
            if count > 2 {
                domainName = subStrings[count - 2] + "." + subStrings[count - 1]
            } else if count == 2 {
                domainName = hostName
            }
            print(domainName)
        }
    }

让我知道您是否遇到任何问题。

答案 1 :(得分:1)

没有简单的方法,与语言无关。请参阅How to extract top-level domain name (TLD) from URL,以很好地讨论所涉及的困难。

答案 2 :(得分:0)

所以最终我找到了解决此问题的更好的标准方法-

Mozilla志愿者维护公共后缀列表,there您可以找到相应语言的库列表。 因此列表Swift library中也存在。 在撰写此答案Swift library时,没有通过CocoPods添加它的证明,因此您必须直接将下载的项目添加到您的项目中。假设将Swift library添加到您的项目中,以获取TLD名称的代码。

import DomainParser

static func getTLD(withSiteURL:String) -> String? {
        do{
            let domainParse = try DomainParser()
            if let publicSuffixName = domainParse.parse(host: withSiteURL)?.publicSuffix {
                if let domainName = domainParse.parse(host: withSiteURL)?.domain {

                    let tldName = domainName.replacingOccurrences(of: publicSuffixName, with: "").replacingOccurrences(of: ".", with: "")
                    print("top level name = \(tldName)")
                    return tldName
                }
            }
        }catch{
        }
        return nil
    }

将Domain解析器库添加为项目的子项目,因为该库的pod尚不可用

答案 3 :(得分:0)

要获取URL的根域,可以使用以下URL扩展名:

extension URL {
    var rootDomain: String? {
        guard let hostName = self.host else { return nil }
        let components = hostName.components(separatedBy: ".")
        if components.count > 2 {
            return components.suffix(2).joined(separator: ".")
        } else {
            return hostName
        }
    }
}