URL主机名弃用,但替代方案崩溃问题

3

URL的host在和macOS 13中已被弃用,但替代方案在某些情况下会崩溃。

替代方案是host(percentEncoded:)

示例:

let url = URL(string: "lorem.com")
print(url?.host) // deprecated warning, prints nil
print(url?.host()) // crash: Thread 1: EXC_BREAKPOINT (code=1, subcode=0x18084f9d4)

虽然 lorem.com 不符合 RFC 1808(URL 的最常见形式),但请求它的主机以前会返回 nil,而不是崩溃。

使用 host(percentEncoded: true)host(percentEncoded: false) 都会出现同样的行为。

有什么解决方法吗?


似乎只有在URL字符串中没有方案时才会崩溃。作为解决方法,您可以使用 let host = url?.scheme == nil ? nil : url?.host(),但实际上,这似乎是一个错误,可能会被修复。因此,保留“旧”的host似乎是更合理的解决方案。 - Gergely
@Gergely,确实,如果URL缺少方案,则如上所述,它不符合RFC 1808。但这里的主要问题是迁移到新功能是不安全的。 - vicegax
1
@Gergely 很遗憾,仅测试方案是不够的,因为您可能会有一个方案,但仍然错过了主机,例如 URL(string: "https://"),似乎使用已弃用的属性是唯一的解决方法。 - wildpeaks
1个回答

3

这似乎是在 Foundation 框架上的一个 bug,我已经在反馈助手上开了一个 bug 报告。

在它被修复之前,我建议继续使用已弃用的 host 版本,否则你将会在之前正常工作的代码中遇到崩溃,特别是如果你依赖 host 在某些情况下返回 nil。


1
你的错误报告有回复吗?在 iOS 16.5 上仍然存在这个问题。 - user1046037
1
@user1046037没有回答或更新我创建的错误报告。我建议你也这样做,因为他们收到的报告越多,就越有可能更早地得到优先处理。 - vicegax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接