Ios swift:如何从WKWebView调用本机函数(摄像头)
我有一个react native项目,决定离开它,改为native,但我想挽救Javascript代码。我最终使用了WebView,并根据Android和iOS所需的本机功能从WebView进行本机调用。我可以通过Ios swift:如何从WKWebView调用本机函数(摄像头),ios,swift,wkwebview,postmessage,Ios,Swift,Wkwebview,Postmessage,我有一个react native项目,决定离开它,改为native,但我想挽救Javascript代码。我最终使用了WebView,并根据Android和iOS所需的本机功能从WebView进行本机调用。我可以通过javascriptInterface使用Android。我现在正努力为iOS做这件事。我使用Swift和WKWebView进行了测试 以下是我到目前为止得出的结论: index.html <!DOCTYPE html> <html> <head>
javascriptInterface
使用Android。我现在正努力为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>
请参阅->请检查-->@RohitMakwana,此时我只需要js与swift进行单向通信。因此,不需要WebRTC。
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()
}
}
}