Clement Clement - 4 months ago 152
iOS Question

WKWebview - Complex communication between Javascript & native code

In WKWebView we can call ObjectiveC/swift code using webkit message handlers
eg:

webkit.messageHandlers.<handler>.pushMessage(message)


It works well for simple javascript functions without parameters. But;


  1. Is it possible to call native code with JS callback function as parameters?

  2. Is it possible to return a value to JS function from native code?


Answer

Answer to both of my question is NO

The solution

Use javascript promises & you can call the resolve function from your iOS code.

UPDATE

This is how you can use promise

In JS

   this.id = 1;
    this.handlers = {};

    window.onMessageReceive = (handle, error, data) => {
      if (error){
        this.handlers[handle].resolve(data);
      }else{
        this.handlers[handle].reject(data);
      }
      delete this.handlers[handle];
    };
  }

  sendMessage(data) {
    return new Promise((resolve, reject) => {
      const handle = 'm'+ this.id++;
      this.handlers[handle] = { resolve, reject};
      window.webkit.messageHandlers.<yourHandler>.postMessage({data: data, id: handle});
    });
  }

in iOS

Call the window.onMessageReceive function with appropriate handler id