【问题标题】:WatchKit SMS with preset body带有预设正文的 WatchKit 短信
【发布时间】:2016-08-01 20:12:06
【问题描述】:

我发现 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 为零?我知道我强制解包,但我不明白为什么在明确分配后它总是为零。

【问题讨论】:

  • 这是一个有效的问题,无需反对..

标签: swift sms watchkit nsurl optional


【解决方案1】:

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

URLSAFEBODY:可选(“你好”)

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

如果您检查了您的 NSURL 字符串 URL,您会看到它包含:

短信:&body=可选(“你好”)

这将导致NSURL 初始化失败,因为它的字符串 URL 格式错误。然后发生致命错误,因为您从 NSURL(string:) 强制解包 nil 结果

如何解决这个问题:

您希望有条件地解开任何可能为 nil 的字符串。您可以通过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 在初始化后也已解包。

既然确定url不为nil,就可以安全地传递给openSystemURL

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

【讨论】:

    猜你喜欢
    • 2012-04-24
    • 2012-05-16
    • 1970-01-01
    • 2013-04-16
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多