URL(string:)给出nil错误,即使Swift中的String不是nil

8ehkhllq  于 2023-11-16  发布在  Swift
关注(0)|答案(2)|浏览(186)

我有以下代码:

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

字符串
这段代码在一个Button里面,Xcode控制台正确地打印了codeString,它不是nil,所以它应该打开codeString的URL,相反,Xcode抛出这个错误:

CODE STRING SELECTED: mailto:[email protected]?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


同样的事情发生在电话号码或短信字符串的情况下(我从扫描的QR码中获得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


在一个URL的情况下,如https//example.com,应用程序不会崩溃,没有零错误,同样的文本等,所以我真的不明白为什么我得到这个错误,即使codeString不是nil

50pmv0ei

50pmv0ei1#

字符串不是nil,但它不代表有效的URL。您必须对URL进行编码。
但是,建议您安全地打开选项

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

字符串

2023年更新:

来自URL(string:)的文档

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

txu3uszq

txu3uszq2#

URL是nil,因为它不能在没有转义空格的情况下创建。
这将工作:

guard let escapedString = codeString.addingPercentEncoding(withAllowedCharacters: urlQuoeryAllowed), 
      let url = URL(string: escapedString) else {
 return
}

字符串

相关问题