即使 String 在 Swift 中不为 nil,URL(string:) 也会给出 nil 错误

xsc*_*der 2 string null qr-code ios swift

我有以下代码:

print("CODE STRING SELECTED: \(codeString)")
let aURL = URL(string: codeString)!
if UIApplication.shared.canOpenURL(aURL) { UIApplication.shared.openURL(aURL) }
Run Code Online (Sandbox Code Playgroud)

此代码位于 Button 内,Xcode 控制台codeString正确打印,但事实并非如此,nil因此它应该打开 的 URL codeString,相反,Xcode 会抛出此错误:

CODE STRING SELECTED: mailto:john@doe.com?subject=Subject here&body=Lorem ipsum dolor sit, amet quatum.

Fatal error: Unexpectedly found nil while unwrapping an Optional value
2019-07-08 11:19:56.076467+0200 QRcode[2751:1043394] Fatal error: Unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)

如果是电话号码或短信字符串,也会发生同样的情况(我codeString从扫描的二维码中获取值):

CODE STRING SELECTED: tel:+1 2345678901
Fatal error: Unexpectedly found nil while unwrapping an Optional value

CODE STRING SELECTED: SMSTO:+1012345678:lorem ipsum dolor sit, amet
Fatal error: Unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)

如果是 URL,例如 https://example.com,应用程序不会崩溃,不会出现 nil 错误,文本也相同,等等。所以我真的不明白为什么我会收到该错误,即使codeString不是nil

vad*_*ian 5

该字符串不是nil,但它不代表有效的 URL。您必须对 URL 进行编码。

但是建议安全地打开选项

if let encodedString = codeString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
   let aURL = URL(string: encodedString), UIApplication.shared.canOpenURL(aURL) { 
    UIApplication.shared.openURL(aURL) 
}
Run Code Online (Sandbox Code Playgroud)

2023 年更新:

从文档URL(string:)

重要提示: 对于在 iOS 17 或之后且一致的操作系统版本上链接的应用程序,URL 解析已从过时的 RFC 1738/1808 解析更新为与 URLComponents 相同的 RFC 3986 解析。这统一了 URL 和 URLComponents API 的解析行为。现在,URL 自动对无效字符进行百分比编码和 IDNA 编码,以帮助创建有效的 URL。