WatchKit短信预设正文

时间:2016-04-11 15:08:57

标签: swift sms watchkit nsurl optional

我发现this question应该对我有所帮助,但是那里的解决方案对我不起作用,而且我不确定某些事情是否发生了变化,或者问题是否与我的代码有关。

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

当执行此代码时,我收到消息,表示可选urlSafeBody在nil时被强制解包,导致崩溃。为什么urlSafeBody为零?我知道我强行打开它,但我不明白为什么在明确指定之后它永远是零。

1 个答案:

答案 0 :(得分:9)

urlSafeBody不是零。从print语句中可以看出,它包含一个可选字符串:

  

URLSAFEBODY:可选(“你好”)

在下一个语句中,这实际上会成为链的一个问题,因为在插入之前你还没有解开该字符串。

如果您检查了NSURL字符串网址,则会看到它包含:

  

SMS:&安培;体=可选( “你好”)

这会导致NSURL初始化失败,因为它的字符串URL格式不正确。然后会发生致命错误,因为您强制解包了NSURL(string:)

的零结果

如何解决此问题:

您希望有条件地解开任何可能为零的字符串。您可以通过if letguard 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也被解包。

由于确定网址不是零,因此可以安全地传递给openSystemURL

你应该始终努力避免强制展开可能为零的变量,因为这肯定会导致崩溃。