1 為什么要自己解析?
典型場景 | 說明 |
---|---|
劫持/污染檢測 | 比較 系統解析 與 自建 DNS 的差異 |
QoS / CDN 選路 | 對每個候選 IP 做 RT/丟包測速 |
系統 API(NSURLSession
/ Network.framework
)在「真正建立連接之前」不會把解析結果暴露出來,因此需要主動解析一步。
2 API 選型概覽
API | 是否過時 | 線程模型 | 返回 IPv4/6 | 備注 | |
---|---|---|---|---|---|
getaddrinfo | ? | 阻塞,需要自己放到隊列 | ?? | POSIX,底層穩定 | |
CFHost | ? iOS 15 標記為 Deprecated | RunLoop + 回調 | ?? | 僅維護舊代碼時可用 | |
Network.framework (NWConnection ) | — | 建立連接后才能拿到 endpoint | 僅在已連通后 | 不適合「只解析」 | |
SCNetworkReachability | — | 回調 | ? | 只能拿到 是否可達,不給 IP |
結論:2025 年仍推薦
getaddrinfo
—— 標準、安全、跨平臺;若真要用 CFHost 必須接受棄用風險。
3 getaddrinfo —— 最硬核也最好用
3.1 Objective-C 同步示例
+ (NSArray<NSString *> *)pug_resolve:(NSString *)hosterror:(NSError **)error {struct addrinfo hints = {0}, *res = NULL;hints.ai_family = AF_UNSPEC; // 同時拿到 IPv4 + IPv6hints.ai_socktype = SOCK_STREAM; // TCP/UDP 都行int gai = getaddrinfo(host.UTF8String, NULL, &hints, &res);if (gai != 0) {if (error) *error = [NSError errorWithDomain:NSPOSIXErrorDomaincode:gaiuserInfo:@{NSLocalizedDescriptionKey:@(