Попытка получить информацию обратно из Javascript в WKWebView (используя KINWebBrowser) - PullRequest
0 голосов
/ 02 мая 2018

Поэтому я пытаюсь вернуть значение из окна браузера после того, как оно было сгенерировано некоторым клиентским кодом.

Вот что у меня есть:

class WebBrowserViewController: KINWebBrowserViewController, NavigationProtocol, KINWebBrowserDelegate, WKScriptMessageHandler {

override func viewDidLoad() {
    super.viewDidLoad()

    let config = WKWebViewConfiguration()

    let contentController = WKUserContentController();
    contentController.add(
        self,
        name: "callbackHandler"
    )
...

func userContentController(_ userContentController: WKUserContentController!, didReceive message: WKScriptMessage) {
    print("Debug message got here")
    if(message.name == "callbackHandler") {
        print("JavaScript is sending a message \(message.body)")
    }
}

Теперь я на 100% уверен, что это не весь код, который мне нужен.

Используя это как пример , мне кажется, что мне нужно как-то добавить эту конфигурацию в мой браузер:

self.webView = WKWebView(frame: webFrame, configuration: config)

Большая проблема здесь в том, что это для прямого WkWebView, и проект, с которым я работаю, использует KinWebBrowser. Вместо того, чтобы начинать с нуля с совершенно новой реализацией, кажется, есть способ расширить KinWebBrowser, но я еще не совсем знаком с синтаксисом Swift или Objective-C, и кажется, что KinWebBrowser написан на Objective-C.

Вот что я считаю подходящим определением интерфейса для KinWebBrowser:

@interface KINWebBrowserViewController : UIViewController <WKNavigationDelegate, WKUIDelegate, UIWebViewDelegate>

#pragma mark - Public Properties

@property (nonatomic, weak) id <KINWebBrowserDelegate> delegate;

// The main and only UIProgressView
@property (nonatomic, strong) UIProgressView *progressView;

// The web views
// Depending on the version of iOS, one of these will be set
@property (nonatomic, strong) WKWebView *wkWebView;
@property (nonatomic, strong) UIWebView *uiWebView;

- (id)initWithConfiguration:(WKWebViewConfiguration *)configuration NS_AVAILABLE_IOS(8_0);

#pragma mark - Static Initializers

/*
 Initialize a basic KINWebBrowserViewController instance for push onto navigation stack

 Ideal for use with UINavigationController pushViewController:animated: or initWithRootViewController:

 Optionally specify KINWebBrowser options or WKWebConfiguration
 */

+ (KINWebBrowserViewController *)webBrowser;
+ (KINWebBrowserViewController *)webBrowserWithConfiguration:(WKWebViewConfiguration *)configuration NS_AVAILABLE_IOS(8_0);

Итак, как мне расширить KinWebBrowser таким образом, чтобы при вызове этого скрипта:

window.webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");

Я получу все, что я передам в .postMessage?

Моя конечная цель - получить строку или другие данные из Интернета в моем приложении iOS после того, как они будут сгенерированы в окне веб-браузера.

1 Ответ

0 голосов
/ 03 мая 2018

Похоже, вы все делаете правильно, но не знаете, как выполнить скрипт из своего приложения. Чтобы решить эту проблему, вы можете использовать valuJavaScript (_: завершениеHandler:) метод.

wkWebView.evaluateJavaScript("window.webkit.messageHandlers.callbackHandler.postMessage(\"Hello from JavaScript\");", completionHandler: nil)

Для более подробной информации, вы можете проверить мой пример проекта .

...