Передача изображения через мост Javascript - PullRequest
0 голосов
/ 23 мая 2019

У меня есть приложение для iOS, написанное на Swift, где я загружаю веб-страницу в UIWebView.Я добавил интерфейс Javascript, предоставляющий определенные функции в Swift, которые вызываются через мост Javascript через веб-страницу.Я хочу показать новую функцию, которая позволяет мне открывать UIImagePickerController, позволяя пользователю выбрать изображение из галереи.Как только я получаю изображение в ответном звонке от сборщика, я хочу перенести изображение на веб-страницу.Поэтому я попытался получить путь к файлу изображения (используя ключ UIImagePickerControllerImageURL из информации об изображении, которую я получаю из метода делегата средства выбора) и передал его в контекст Javascript, который обновляет тег img в html, указывая его src напуть к файлу.Путь к файлу читается как

file:///private/var/mobile/Containers/Data/Application/D28F50B5-4BC2-4D6C-9107-2831384542FE/tmp/290042B5-9302-417E-840C-1B410F3B824B.jpeg

Но ресурс изображения не отображается в веб-просмотре.Альтернативное решение, которое я реализовал, состояло в том, чтобы преобразовать данные UIImage в строку base64, которую можно было бы легко передать, но при таком подходе здесь возникает проблема с обработкой больших изображений.Можно ли получить путь к файлу выбранного ресурса изображения, который может быть загружен через веб-просмотр?Есть ли другой альтернативный подход?

import UIKit

import Photos

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

private var webView: UIWebView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    webView = UIWebView()
    self.view.addSubview(webView)
}

public func openGalleryAndPickImage(){
    presentImagePicker(presentingViewController: self, pickerSourceType: .photoLibrary)
}

public func takeImageWithCamera(){
    presentImagePicker(presentingViewController: self, pickerSourceType: .camera)
}

private func presentImagePicker(presentingViewController: UIViewController, pickerSourceType: UIImagePickerController.SourceType){
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.sourceType = pickerSourceType
    picker.allowsEditing = false
    presentingViewController.present(picker, animated: true, completion: nil)
}

public func imagePickerController(_ picker: UIImagePickerController,
                                  didFinishPickingMediaWithInfo info: [String : Any]) {
    picker.dismiss(animated: true, completion: nil)
    convertImageToBase64AndCallJS(image: info[UIImagePickerControllerOriginalImage] as! UIImage)
}

public func imagePickerControllerDidCancel(_ picker: UIImagePickerController){
    picker.dismiss(animated: true, completion: nil)

}

private func convertImageToBase64AndCallJS(image: UIImage) {
    let base64String = base64EncodedStringWith(image: image)
    callJSFunctionFromSwift(img: base64String)
}

private func base64EncodedStringWith(image: UIImage)->String{
    let imageData = UIImagePNGRepresentation(image)
    return imageData?.base64EncodedString() ?? ""
}

private func callJSFunctionFromSwift(img: String) {
    webView?.stringByEvaluatingJavaScript(from: "processImage('\(img)')")
}

}

...