Javascript调用处理程序时未调用WKUserContentController

时间:2018-10-20 14:11:13

标签: javascript swift webkit

我正在使用Webkit,Swift开发IOS App。 我想关闭视图控制器,当我的webview逻辑完成时显示webkit。使用WKUserContentController,我实现了逻辑。

但这没用。

下面是我的代码。

这是Swift。

import UIKit
import WebKit

class SelfAuthVC: UIViewController, WKNavigationDelegate, WKUIDelegate, WKScriptMessageHandler  {

private var webView: WKWebView!
let contentController = WKUserContentController()
let config = WKWebViewConfiguration()

override func viewWillAppear(_ animated: Bool) {

    contentController.add(self as WKScriptMessageHandler, name: "callbackHandler")

    config.userContentController = contentController


    let preferences = WKPreferences()
    preferences.javaScriptEnabled = true

    config.preferences = preferences
    webView = WKWebView(frame: view.bounds, configuration: config)
    view.addSubview(webView)

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

    webView.load(request)
    webView.navigationDelegate = self
    webView.uiDelegate = self

}
override func viewDidLoad() {
    super.viewDidLoad()

}

func webViewDidClose(_ webView: WKWebView) {
    self.navigationController?.popViewController(animated: true)
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

    webView.evaluateJavaScript("var my_email = '\(UserInfo.shared().email!)'")  { (result, error) in
        guard error == nil else {
            print(error)
            return
        }
    }

}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    print("didReceive message here")
    if(message.name == "callbackHandler"){
        print("callbackHandler: \(message.body)")
        self.dismiss(animated: true, completion: nil)
        self.navigationController?.popViewController(animated: true)

    }
}

}

下面是JS

<body>
<script language="JavaScript">

IMP.certification({


    min_age: 18
}, function(rsp) {
    if ( rsp.success ) {

        $.ajax({
                method : "POST",
                url : "https://******/user/iamport",
                dataType : 'json',
                data : {
                    imp_uid : rsp.imp_uid,
                    user_email: my_email
                }
         }).done(function(rsp) {
                // 이후 Business Logic 처리하시면 됩니다.

                 (function finish(){
                  window.webkit.messageHandlers.callbackHandler.postMessage("trigger from JS");


                  try {
                  webkit.messageHandlers.callbackHandler.postMessage(
                                                                     'done'
                                                                     );
                  } catch(err) {
                  console.log('The native context does not exist yet');
                  }
                  }())

         });

    } else {
         // Auth failed
        var msg = '인증에 실패하였습니다. 관리자에게 문의하세요';
        msg += '에러내용 : ' + rsp.error_msg;

        alert(msg);
    }
});
</script>
</body>

我认为我编写了所需的代码。 但是经过授权过程后,ViewContoller不会消失。 要解决此问题需要进行哪些更改?

1 个答案:

答案 0 :(得分:0)

我忘记添加此代码。

class BaseModel(chainer.Chain):
  loss     = None
  accuracy = None
  gpu_mode = False
  _train   = False
  def __call__(self, *arg_list, **arg_dict):
    raise NotImplementedError()
  def clear(self):
    self.loss = None
    self.accuracy = None
  def train(self, data, optimizer):
    self._train = True
    optimizer.update(self, data)
    if self.accuracy is None:
        return float(self.loss.data)
    else:
        return float(self.loss.data), float(self.accuracy.data)
  def validate(self, data):
    self._train = False
    self(data)
    if self.accuracy is None:
        return float(self.loss.data)
    else:
        return float(self.loss.data), float(self.accuracy.data)
  def test(self, data):
    self._train = False
    raise NotImplementedError()
  def save(self, fname):
    serializers.save_hdf5(fname, self)
  def load(self, fname):
    serializers.load_hdf5(fname, self)
  def cache(self):
    self.to_cpu()
    cached_model = self.copy()
    self.to_gpu()
    return cached_model
  # this part is the error part
  def setup(self, optimizer):
    self.to_gpu()
    optimizer.target = self
    optimizer.prepare()
  def to_cpu(self):
    if not self.gpu_mode:
        return
    super(BaseModel, self).to_cpu()
    self.gpu_mode = False
  def to_gpu(self):
    if self.gpu_mode:
        return
    super(BaseModel, self).to_gpu()
    self.gpu_mode = True