swift: как вызвать встроенную функцию (камеру) из WKWebView - PullRequest
0 голосов
/ 04 октября 2019

У меня есть реактивный проект и я решил отойти от него и перейти к нативному, но хочу спасти Javascript-код. Я закончил тем, что использовал веб-просмотры и совершал собственные вызовы из WebView, основываясь на том, какие собственные возможности нам нужны для Android и iOS. Я смог сделать с Android через javascriptInterface. Я сейчас пытаюсь сделать это для iOS. Я сделал тест, используя Swift и WKWebView.

Вот что я до сих пор придумал:

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0;" />
<title>JavaScript Interface</title>
</head>
<script type="text/javascript">
    function takePicture() {
        window.webkit.messageHandlers.native.postMessage();
    }
</script>
<body style="background-color: RebeccaPurple">
    <h1>This is HTML</h1>
    <p>
        <input type="button" value="HTML button" onClick="takePicture()"/>
    </p>

</body>
</html>

ViewController.swift

import UIKit
import WebKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let webView = WKWebView(frame: view.frame)
        view.addSubview(webView)

        let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "/")!
        webView.loadFileURL(url, allowingReadAccessTo: url)
        let request = URLRequest(url: url)
        webView.load(request)

        let config = WKWebViewConfiguration()
        let userContentController = WKUserContentController()

        userContentController.add(self, name: "native")
        config.userContentController = userContentController
    }
    func takePhoto() {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) {
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerController.SourceType.camera
            imagePicker.allowsEditing = false
            self.present(imagePicker, animated: true, completion: nil)
        }

    }
}

extension ViewController: WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == "native" {
            takePhoto()
        }
    }
}
...