iOS Swift - URL (строка :) выдает ошибку nil, даже если строка не равна nil - PullRequest
0 голосов
/ 08 июля 2019

У меня есть следующий код:

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

Этот код находится внутри кнопки, и консоль 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


То же самое происходит в случае номера телефона или строки SMS (я получаю значение codeString из отсканированного QR-кода):

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, приложение не аварийно завершает работу, нет ошибки nil, то же самое для текста и т. Д.
Так что я действительно не понимаюНе понимаю, почему я получаю эту ошибку, даже если codeString не nil.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Строка не nil, но она не представляет действительный URL. Вы должны закодировать URL.

Тем не менее, рекомендуется безопасно развернуть дополнительные устройства

if let encodedString = codeString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
   let aURL = URL(string: encodedString), UIApplication.shared.canOpenURL(aURL) { 
    UIApplication.shared.openURL(aURL) 
}
0 голосов
/ 08 июля 2019

URL-адрес nil, потому что он не может быть создан без выхода из пробелов, которые вы там получили.

Это будет работать:

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