iOS Swift-URL(string :)给出nil错误,即使String不为nil

时间:2019-07-08 09:35:05

标签: ios swift string null qr-code

我有以下代码:

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: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


如果使用电话号码或SMS字符串(从扫描的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


如果使用的是网址(例如https // example.com),则该应用不会崩溃,没有nil错误,文本相同等。
因此,即使codeString不是nil,我也真的不明白为什么会收到该错误。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

但是,建议安全地拆开可选部件

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

答案 1 :(得分:0)

该网址为nil,因为无法在不转义空格的情况下创建该网址。

这将起作用:

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