WKUserContentController не вызывается, когда Javascript вызывает обработчик - PullRequest
0 голосов
/ 20 октября 2018

Я разрабатываю приложение для IOS с использованием Webkit, Swift.И я хочу закрыть контроллер представления, который показывает webkit, когда моя логика webview сделана.Используя 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 голосов
/ 21 ноября 2018

Я забыл добавить эти коды.

config.userContentController = contentController
contentController.add(self, name: "authAction")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...