Swift3 でWKWebViewからpostしたフォームの値を取得する

入力した内容を保持するということがやりたい。







サーバ側プログラム("http://example.co.jp/test")


適当に実装
xamppでもHerokuでも何でも

<html> 
 <head> 
  <title>Hello WKWebView</title>
 </head> 
 <body>

  <h1>Hello WKWebView</h1> 

  <form action="/hello" name="form1" method="POST"> 
    <input type="text" name="name"> 
    <input type="password" name="password" size="30" maxlength="30"> 
    <input type="submit"> 
  </form> 

 </body> 

</html> 


iOSプログラム


上記画面へアクセスするようにWKWebViewでiOSアプリを実装する

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {

    var webview: WKWebView = WKWebView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // viewの置き換え addsubviewの方がいい?
        self.view = self.webview
        
        webview.navigationDelegate = self
        
        let url = URL(string:"http://example.co.jp/test")!
        let req = URLRequest(url:url)
        self.webview.load(req)
    }
    /// Post時に呼ばれるイベント
    func webView(_ webView: WKWebView,
              decidePolicyFor navigationAction: WKNavigationAction, 
              decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        
        // リクエスト内容確認 ただしこの中にpost値は入っていない
        let request = navigationAction.request
        print( request )
        
        // nameフィールドの値を取得
        webView.evaluateJavaScript("document.form1.name.value",
                    completionHandler: { (html, error) -> Void in
                        print(html as? String)
        })
        
        // passwordフィールドの値を取得
        webView.evaluateJavaScript("document.form1.password.value",
                     completionHandler: { (html, error) -> Void in
                         print(html as? String)
        })

        decisionHandler(WKNavigationActionPolicy.allow)
    }
    
}



http://d.hatena.ne.jp/rokugen/20110207 あたりを参考にした。
WebViewは即値が返ってきたけどWKWebViewはハンドラに登録しないといけないらしい。

以下実行確認
iOSからpostしてみる


post時に以下が表示される。
Optional("てすと")
Optional("pass")
この値を保持して画面遷移時に表示すれば要件は満たせる。
悪いこともできそう

ただしwebのデザインが変わると動かなくなるのはかなりきついのでjsを読み込む形にした方がいいかもしれない。

2016年10月27日木曜日