带有预设正文的 WatchKit SMS
WatchKit SMS with preset body
我发现 应该对我有帮助,但那里的解决方案对我不起作用,我不确定是否发生了某些变化或者问题是否出在我的代码上。
let messageBody = "hello"
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
print("URLSAFEBODY: \(urlSafeBody)")
WKExtension.sharedExtension().openSystemURL(NSURL(string: "sms:&body=\(urlSafeBody)")!)
当执行此代码时,我收到一条消息,可选 urlSafeBody
被强制解包而 nil,导致崩溃。为什么 urlSafeBody
为零?我知道我强行打开它,但我不明白为什么在明确分配后它永远为零。
不是 urlSafeBody
是零。正如您从打印语句中看到的那样,它包含一个可选字符串:
URLSAFEBODY: Optional("hello")
在下一个语句中,这实际上会成为链的问题,因为您在插入之前没有解包该字符串。
如果您检查 NSURL
字符串 URL,您会看到它包含:
sms:&body=Optional("hello")
这将导致 NSURL
初始化失败,因为它的字符串 URL 格式错误。然后发生致命错误,因为您强制解包了 NSURL(string:)
的 nil 结果
如何解决:
您想有条件地解包任何可能为 nil 的字符串。您可以通过 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不为nil,就可以安全的传递给openSystemURL
.
您应该始终努力避免强制展开可能为 nil 的变量,因为这肯定会导致崩溃。
我发现
let messageBody = "hello"
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
print("URLSAFEBODY: \(urlSafeBody)")
WKExtension.sharedExtension().openSystemURL(NSURL(string: "sms:&body=\(urlSafeBody)")!)
当执行此代码时,我收到一条消息,可选 urlSafeBody
被强制解包而 nil,导致崩溃。为什么 urlSafeBody
为零?我知道我强行打开它,但我不明白为什么在明确分配后它永远为零。
不是 urlSafeBody
是零。正如您从打印语句中看到的那样,它包含一个可选字符串:
URLSAFEBODY: Optional("hello")
在下一个语句中,这实际上会成为链的问题,因为您在插入之前没有解包该字符串。
如果您检查 NSURL
字符串 URL,您会看到它包含:
sms:&body=Optional("hello")
这将导致 NSURL
初始化失败,因为它的字符串 URL 格式错误。然后发生致命错误,因为您强制解包了 NSURL(string:)
如何解决:
您想有条件地解包任何可能为 nil 的字符串。您可以通过 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不为nil,就可以安全的传递给openSystemURL
.
您应该始终努力避免强制展开可能为 nil 的变量,因为这肯定会导致崩溃。