我的iOS应用程序,我想解决域名的DNS服务记录(SRV)。
我找到了一些允许这样做的库,但响应是空的。我尝试的一个库是DNS。代码看起来像这样:
import UIKit
import DNS
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let url = "_registration._tcp.gateway.zeeotp.com"
print("Starting discovery")
do {
let request = Message(
type: .query,
authoritativeAnswer: false,
questions: [Question(name: url, type: .service)]
)
let requestData = try request.serialize()
// Decoding a message
let responseData = requestData
let response = try Message.init(deserialize: responseData)
print(response)
} catch {
print("Unexpected error: \(error).")
}
}
}
字符串
我得到的输出是:
DNS请求(id:0、权威答案:false,截断:false,recursionDesired:false,递归可用:false,问题:[DNS.问题(名称:“_registration._tcp.gateway.zeeotp.com.",键入:SRV,唯一:false,internetClass:答:[],当局:[],附加:[])
在我的研究过程中,我接触到了SRVResolver,但它是在Objective-C,我不知道如何使它与Swift一起工作。
我在ablove代码中是否遗漏了一些东西,使其正确工作?
3条答案
按热度按时间sshcrbum1#
在尝试了各种方法之后,我终于能够完成这项工作。正如@Paulw11的评论中提到的,库DNS没有发送实际的DNS请求,因此我没有得到想要的结果。
选项一:
我最终决定将Apple提供的Objective-C示例集成到我的Swift应用程序中。为此
1.我将SRVResolver. h和SRVResolver.m添加到我的项目中
1.已创建桥接头文件并添加:
字符串
1.在目标的 Build Phases 下的 Link Binary With Libraries 部分中添加了
libresolv.tbd
现在,在我的
ViewController.swift
中,我可以使用它来获得priority
,weight
和hostname
的值:型
选项:2
我还发现了一个外部库NioDNS,它允许我们做一些DNS操作。使用这个库,我也能够检索SRV记录。在我的
ViewController.swift
中,我添加了以下代码:型
gmol16392#
对于以后发现这一点的任何人,现在可以在没有遗留目标C SRVResolver的纯Swift中完成此操作,也没有任何第三方库。使用DNSServiceQueryRecord API:https://developer.apple.com/documentation/dnssd/1804747-dnsservicequeryrecord
请参阅如何用于SRV记录的示例代码:https://github.com/jamf/NoMAD-2/blob/main/NoMAD/SRVLookups/SRVResolver.swift的
链接中有更多的细节,但要熟悉的主要部分是首先设置一个DNSServiceQueryRecordReply作为听到结果返回时的回调
字符串
然后调用DNSServiceQueryRecord发送请求,指定kDNSServiceType_SRV只接收SRV结果。
型
最后,调用DNSServiceProcessResult开始阅读DNS查询的结果
型
然后可以使用前面RecordReply回调中的rdata来解析数据
型
13z8s7eq3#
使用第三方库似乎矫枉过正。您可以通过URLSession实现您想要的结果。本例使用dns query tools,但还有其他可用的。
字符串
我认为扩展最初来自优秀的Paw应用程序,所以请查看:Paw Cloud的