2016-04-11 2 views
17

Я нашел this question, который должен был мне помочь, но решение для меня не работает, и я не уверен, что что-то изменилось или проблема связана с моим кодом.WatchKit SMS с предустановленным корпусом

let messageBody = "hello" 
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet()) 
print("URLSAFEBODY: \(urlSafeBody)") 
WKExtension.sharedExtension().openSystemURL(NSURL(string: "sms:&body=\(urlSafeBody)")!) 

Когда этот код выполняется, я получаю сообщение, что по желанию urlSafeBody была сила развернула в то время как ноль, что приведет к аварии. Почему urlSafeBody ноль? Я знаю, что я могу развернуть его, но я не понимаю, почему он когда-либо был назначен явно.

+4

Это действительный вопрос, не нужно понижать голос .. – dbf

ответ

9

Это не urlSafeBody, что нет. Как вы можете видеть из вашего заявления для печати, он содержит дополнительную строку:

URLSAFEBODY: факультативную («привет»)

Это будет на самом деле оказаться проблемой для цепи в следующем потому что вы не развернули эту строку до того, как она будет интерполирована.

Если вы выяснен NSURL строку URL, вы увидели бы в нем содержится:

смс: & тело = Опционно ("привет")

Это будет вызывать NSURL инициализацию fail, потому что его строковый URL-адрес неверен. Роковая ошибка, то происходит потому, что вы вынуждаете-размотал ноль результата от NSURL(string:)

Как решить эту проблему:

Вы хотите условно разворачивать любые строки, которые могут быть равны нулю. Вы можете сделать это с помощью if let или guard let опционального связывания:

let messageBody = "hello" 
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet()) 
if let urlSafeBody = urlSafeBody, url = NSURL(string: "sms:&body=\(urlSafeBody)") { 
    WKExtension.sharedExtension().openSystemURL(url) 
} 

Обратите внимание, что urlSafeBody была развернута, прежде чем он был использован в интерполяции строк и url также развернули после инициализации.

Поскольку он уверен, что URL-адрес не равен нулю, его можно безопасно передать openSystemURL.

Вы всегда должны стремиться избегать переменных разверток, которые могут быть нулевыми, поскольку это, безусловно, приведет к сбою.