javascript Interface
iOS7 이후 부터는 안드로이드 처리하는게 가능하다.
(그 전에는 shouldStartLoadWithRequest
에서 scheme 파싱해서 처리 했었다.)
자세한 내용은 다음 WWDC를 참조 (WWDC 615 - Integrating JavaScript into Native Apps)
기본 웹뷰
class ViewController: UIViewController, UIWebViewDelegate {
@IBOutlet var webView : UIWebView
var url = NSURL(string: "http://google.com")
override func viewDidLoad() {
super.viewDidLoad()
//load initial URL
webView.delegate = self
var req = NSURLRequest(URL : url)
webView.loadRequest(req)
}
func webViewDidStartLoad(webView : UIWebView) {
//UIApplication.sharedApplication().networkActivityIndicatorVisible = true
println("AA")
}
func webViewDidFinishLoad(webView : UIWebView) {
//UIApplication.sharedApplication().networkActivityIndicatorVisible = false
println("BB")
}
}
사용방법은 다음과 같다.
- 호출할 프로토콜을 JSExport상속받아 생성
- 자바스크립트 처리할 클래스 만들고 프로토콜 처리
@objc protocol ScriptProtocol : JSExport {
func webViewClose()
}
@objc class MyScript: NSObject {
var webView: UIWebView init(webView: UIWebView) {
self.webView = webView
}
}
extension MyScript: ScriptProtocol {
func webViewClose() {
print("웹뷰 닫기~")
}
}
- WebView 로딩후 자바스크립트로 클래스와 함수 등록
웹뷰 에서 delegate 설정하고 webViewDidFinishLoad
에서 JavaScript를 실행시켜주면 된다.
webView.delegate = self ... extension ViewController: UIWebViewDelegate {
func webViewDidFinishLoad(_ webView: UIWebView) {
let key = "documentView.webView.mainFrame.javaScriptContext"
if let context = webView.value(forKeyPath: key) as? JSContext {
context.setObject(MyScript(self.webView), forKeyedSubscript: "MyScript" as (NSCopying & NSObjectProtocol)!)
context.evaluateScript("function webViewClose() {webViewClose();}")
}
}
}
웹(JavaScript)에서는 다음과 같이 설정 되어 있으면 된다.
function webClose() {
window.MyScript.webViewClose();
}
<button onclick="webClose();">종료</button>