¿Por qué httpbody de NSMutableURLRequest cambia caracteres de mi string en swift?

Actualmente trabajo en un poryecto de swift en el que el usuario puede subir fotografias a un servidor, para lograr esto codifico la imagen capturada a base 64 esto lo consigo con el sguiente código:

func convertImageToBasee64(image: UIImage){     let imageData = image.jpegData(compressionQuality: 1)     let base64String = imageData!.base64EncodedString()     return base64String } 

Posteriormente creo la variable que uso como parámetro

let imagenEnviar = convertImageToBasee64(image: imagenVistaPrevia.image!) let parametros = "imagen=" + imagenEnviar 

y por último ejecuto la clase de conexion a mi server.

let conexion:clsConexionIA = clsConexionIA.init(url: "miurl.php", params: parametros) conexion.request{(output) in   print(output) } 

esta es mi clase de conexión:

class clsConexionIA {    let URL: String    let PARAMS: String     init(url: String, params: String) {        self.URL = url        self.PARAMS = params.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!    }     func request(successHandler: @escaping (_ response: String) -> Void)->Void{        let request = NSMutableURLRequest(url: NSURL(string: self.URL)! as URL)        request.httpMethod = "POST"        request.httpBody = self.PARAMS.data(using: String.Encoding.utf8, allowLossyConversion: false)        let headers = ["Content-Type": "application/x-www-form-urlencoded"]        request.allHTTPHeaderFields = headers         let task = URLSession.shared.dataTask(with: request as URLRequest) { datos, respuesta, error in            if error != nil {                successHandler(String(describing: error));            } else {                let responseString = NSString(data: datos!, encoding: String.Encoding.utf8.rawValue)                print("RESPUESTA \(responseString)")                successHandler((responseString as String?)!);            }        }        task.resume()    } } 

Mi problema es que del lado de mi servidor php estoy recibiendo una cadena que no es un base64 válido, por lo que la imagen se guarda corrupta-dañada.

He utilzado Charles Proxy para inspeccionar los parametros que le paso a mi servidor, y en notado que el string que se envía al server es distinto al que obtengo al inspeccionar en tiempo de ejecución la linea self.PARAMS.data(using: String.Encoding.utf8, allowLossyConversion: false)

¿a qué se debe esto y como puedo corregirlo? Yo imagino que la parte .data(using: String.Encoding.utf8, allowLossyConversion: false) hace alguna modificación a mi string, pero no he encontrado la forma de corregir esta situación. También he intentado obtener el .data sin el parámetro allowLossyConversion pero no noto cambio alguno.

Algunos de los cambios que noto en el string es, por ejemplo, que me reemplaza los caracteres + por espacios en blanco, también la longitud de caracteres es distinta, por lo que forzar un replace de espacios del lado del servidor no me funciona.

Se que hasta este punto self.PARAMS = params.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)! mi string base64 es válido porque lo inspecciono en tiempo de ejecución, copio su valor y lo pego en algún decodificador online y la imagen se genera correctamente.

Espero y alguien pueda ayudarme, gracias de antemano comunidad!