mfmessagecomposeviewcontroller swift sms watchkit nsurl optional

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.