swift - mfmessagecomposeviewcontroller - WatchKit SMS con cuerpo preestablecido
nsurl optional (1)
No es urlSafeBody
que es nulo. Como puede ver en su declaración de impresión, contiene una cadena opcional:
URLSAFEBODY: Opcional ("hola")
Eso realmente resultará ser un problema para la cadena en la siguiente declaración, ya que no ha desenvuelto esa cadena antes de interpolarla.
Si examinara su URL de cadena NSURL
, vería que contenía:
sms: & body = Opcional ("hola")
Esto NSURL
inicialización de NSURL
falle, porque su URL de cadena tiene un formato incorrecto. El error fatal entonces sucede porque forzó el NSURL(string:)
del resultado nulo de NSURL(string:)
Cómo resolver esto:
Desea desenvolver condicionalmente cualquier cadena que pueda ser nula. Puede hacer esto a través de if let
o guard let
opcional:
let messageBody = "hello"
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
if let urlSafeBody = urlSafeBody, url = NSURL(string: "sms:&body=/(urlSafeBody)") {
WKExtension.sharedExtension().openSystemURL(url)
}
Observe que urlSafeBody
se urlSafeBody
antes de usarse en la interpolación de cadenas y que también se urlSafeBody
url
después de la inicialización.
Como es seguro que la URL no es nula, se puede pasar a openSystemURL
de forma openSystemURL
.
Siempre debe esforzarse por evitar las variables de desenvolvimiento de la fuerza que pueden ser nulas, ya que esto sin duda dará lugar a un bloqueo.
Encontré esta pregunta que debería haberme ayudado, pero la solución no me funciona, y no estoy seguro si algo ha cambiado o si el problema está en mi código.
let messageBody = "hello"
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
print("URLSAFEBODY: /(urlSafeBody)")
WKExtension.sharedExtension().openSystemURL(NSURL(string: "sms:&body=/(urlSafeBody)")!)
Cuando se ejecuta este código, recibo el mensaje de que la función urlSafeBody
opcional fue urlSafeBody
, pero nula, lo que provocó un bloqueo. ¿Por qué es urlSafeBody
nulo? Sé que estoy forzando a desenvolverlo, pero no entiendo por qué es nula después de haber sido asignada explícitamente.