У меня есть следующий код:
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:[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
То же самое происходит в случае номера телефона или строки 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, приложение не падает, нет нулевой ошибки, то же самое для текста и т. д. Поэтому я действительно не понимаю, почему я получаю эту ошибку, даже если codeString
не nil
.
Строка не является nil
, но она не представляет собой допустимый URL-адрес. Вы должны закодировать URL.
Однако рекомендуется безопасно разворачивать опции.
if let encodedString = codeString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
let aURL = URL(string: encodedString), UIApplication.shared.canOpenURL(aURL) {
UIApplication.shared.openURL(aURL)
}
Вы правы, @vadian, большое спасибо за помощь, я приму ваш ответ
Замечательное решение!
URL-адрес nil
, потому что он не может быть создан без экранирования пробелов, которые вы там получили.
Это будет работать:
guard let escapedString = codeString.addingPercentEncoding(withAllowedCharacters: urlQuoeryAllowed),
let url = URL(string: escapedString) else {
return
}
Рассматривали ли вы создание сторожевого разрешения, чтобы подтвердить, что он не равен нулю к тому времени, когда вы к нему обращаетесь?