javascript - 如何从 webview 使用 UIImagePickerController

标签 javascript ios swift3 wkwebview

我正在在线学习本教程 https://makeapppie.com/2016/06/28/how-to-use-uiimagepickercontroller-for-a-camera-and-photo-library-in-swift-3-0/ (有一点点扭曲)。我正在尝试从 webview 调用我的 UIImagePickerController ,但我不确定如何更改代码以使其正常工作。不同之处在于,我将接收来自 javascript 的调用,然后调用选择器作为结果,而不是使用 UIButton。然后我想使用我的 javascript 接口(interface)将图像作为 base64 字符串发送回。

这是我到目前为止所拥有的。

import UIKit
import WebKit

class ViewController: UIViewController,
                        WKScriptMessageHandler,
                        UIImagePickerControllerDelegate,
                        UINavigationControllerDelegate {


    var webView: WKWebView?
    let userContentController = WKUserContentController()
    let picker = UIImagePickerController();

    @IBAction func photoFromLibrary(_ sender: UIBarButtonItem) {
        picker.allowsEditing = false
        picker.sourceType = .photoLibrary
        picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
        present(picker, animated: true, completion: nil)
    }


    override func loadView() {
        super.loadView()


        let config = WKWebViewConfiguration()
        config.userContentController = userContentController

        self.webView = WKWebView(frame: self.view.bounds, configuration: config)
        userContentController.add(self, name: "iOS")

        let url = URL(string:"https://relate.lavishweb.com/account")
        let request = URLRequest(url: url!)
        _ = webView?.load(request)

        self.view = self.webView



    }

    override func viewDidLoad() {
        super.viewDidLoad()
        picker.delegate = self
    }


    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {

        webView?.evaluateJavaScript("window.settings.setImageBase64FromiOS()") { (result, error) in
            if error != nil {
                print("Success")
            } else {
                print("Failure")
            }
        }


        // now use the name and token as you see fit!
    }

    func imagePickerController(_ picker: UIImagePickerController,
                               didFinishPickingMediaWithInfo info: [String : AnyObject])
    {
        let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage //2
        //        myImageView.contentMode = .scaleAspectFit //3
        //        myImageView.image = chosenImage //4

        //I want to do additional stuff here and send back as a base64 String
        dismiss(animated:true, completion: nil) //5

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

最佳答案

嗨,我遇到了同样的问题,ein 解决了它,但它有点脏。 在 viewDidLoad() 中,您覆盖了 WKWebView 的委托(delegate)。 WKWebView 也使用委托(delegate)。您需要将 Delegate 保存在本地。

var oldDelegate: UIImagePickerControllerDelegate?

override func viewDidLoad() {
    super.viewDidLoad()
    oldDelegate = picker.delegate   // save the Delegate from WKWebView
    picker.delegate = self
}

现在您可以在委托(delegate)中运行您的代码。在您的方法 imagePickerController() 结束时,您必须从旧委托(delegate)调用 imagePickerController()。

func imagePickerController(_ picker: UIImagePickerController,
                               didFinishPickingMediaWithInfo info: [String : AnyObject]){
        var myinfo = info
        let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage //2
        //        myImageView.contentMode = .scaleAspectFit //3
        //        myImageView.image = chosenImage //4
        myinfo[UIImagePickerControllerOriginalImage] = chosenImage
        myinfo[UIImagePickerControllerImageURL] = nil

        oldDelegate?.imagePickerController!(picker, didFinishPickingMediaWithInfo: myinfo)
    }

我将 URL 设置为 nil,因为如果 URL 已填充,WKWebView 会直接从驱动器加载图像。 myinfo[UIImagePickerControllerImageURL] = nil

希望对您有所帮助。

关于javascript - 如何从 webview 使用 UIImagePickerController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46874154/

相关文章:

javascript - 通过 CDN 或 minifiy/concat 加载资源并为自己服务?

javascript - Angular 6 表单在提交和重置后返回验证错误

javascript - 如何在 async/await 下重写一个函数?

iphone - 如何阻止一个 subview 覆盖另一个 subview

ios - 如何调用返回的函数(发件人 : UIDatePicker) - Swift

swift - 如何将 swift 从 3.1 更新到 3.2,而不是 4.0

javascript - 在主窗口调整大小时自动重新加载 iframe

ios - WKWebview 无法正确加载某些网站

ios - Spritekit 应用程序在设备上运行时崩溃,在 swift 3 转换后在模拟器上工作

ios - UINavigationController 内的 UISplitViewController