iOS - Problem med att skicka base64-bild från WKWebView till JavaScript på sidan


Jag försöker skicka en Base64-representation av en UIImage i iOS till en Web View och jag tror att jag stöter på ett fel där strängen blir undanstoppad i JavaScript på grund av specialtecken, men jag är inte riktigt säker på hur jag ska hantera det. Detta är vad jag har hittills...

func imagePickerController(_ picker: UIImagePickerController,
                           didFinishPickingMediaWithInfo info: [String : Any])
{
    let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage

    let thumb = chosenImage.resized(toWidth: 72.0)

    let imageData:NSData = UIImagePNGRepresentation(thumb!)! as NSData

    let dataImage:String = imageData.base64EncodedString(options: .lineLength64Characters)

    webView?.evaluateJavaScript("window.settings.setImageBase64FromiOS('\(dataImage)');") { (result, error) in
        if error != nil {
            print(error!)
        } else {
            print("Success")
        }
    }
    dismiss(animated:true, completion: nil) //5

}

Jag fortsätter att få detta fel loggat i konsolen.

WKJavaScriptExceptionMessage=SyntaxError: Unexpected EOF

Svar #1

Jag stötte också på samma problem och jag försökte koda strängen innan jag skickade den till JavaScript på följande sätt:

let encodedString: String = dataImage.addingPercentEncoding(withAllowedCharacters: .alphanumerics) ?? ""

I Javascript-kod, innan du lägger till i bildkällan,

var originalImageData = decodeURIComponent(encodedImageDataString)

P.S: hoppas att du har den slutliga bilddatan med prefix i detta format data:;base64, till exempel.

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAIAAACx0UUtAAAAAXNSR0IArs4c6QAA...

Svar #2

Jag stötte på samma problem men lyckades få det att fungera genom att sätta parametern base64EncodedStringWithOptions till 0 istället för 'lineLength64Characters'. Jag tror att radbrytningarna var problemet, '0' sätter det till inga radbrytningar.