У меня есть приложение для 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)')")
}
}