Rex Xia
Rex Xia

Reputation: 63

Xcode Linker error for WKWebViewJavascriptBridge

I am using WebViewJavascriptBridge for interaction between JS and native code. I find UIWebView sometimes slow so I tried to switch to WKWebView.

The project was fine when using UIWebView.

var bridge:WebViewJavascriptBridge!

override func viewDidAppear(animated: Bool) {

    super.viewDidAppear(animated)

    self.webView = UIWebView(frame: self.viewport.frame)

    self.view.addSubview(webView!)

    let url = NSBundle.mainBundle().URLForResource("index", withExtension: "html", subdirectory: "www")
    webView!.loadRequest(NSURLRequest(URL: url!))

    webView!.scrollView.bounces = false

    self.bridge = WebViewJavascriptBridge(forWebView: webView, handler: { (data, callback) -> Void in
        callback("msg from bridge")
    })

}

Working Compiler list:

Working Compiler list

But when I changed to WKWebViewJavascriptBridge it falls apart when linking:

var bridge:WKWebViewJavascriptBridge!

override func viewDidAppear(animated: Bool) {

    super.viewDidAppear(animated)

    self.webView = WKWebView(frame: self.viewport.frame)

    self.view.addSubview(webView!)

    let url = NSBundle.mainBundle().URLForResource("index", withExtension: "html", subdirectory: "www")
    webView!.loadRequest(NSURLRequest(URL: url!))

    webView!.scrollView.bounces = false

    self.bridge = WKWebViewJavascriptBridge(forWebView: webView, handler: { (data, callback) -> Void in
        callback("msg from bridge")
    })

}

Error message:

Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_WKWebViewJavascriptBridge", referenced from:
      type metadata accessor for __ObjC.WKWebViewJavascriptBridge in ViewController.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

And it appears that those .m files are not being compiled before linking.

[enter image description here]

Please kindly advise.

Upvotes: 0

Views: 942

Answers (1)

Rex Xia
Rex Xia

Reputation: 63

Phew, finally got it working by editing the bridge header.

In file WKWebViewJavascriptBridge.h, find these lines:

#if (__MAC_OS_X_VERSION_MAX_ALLOWED > __MAC_10_9 || __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1)
#define supportsWKWebKit
#endif

Then remove the #if #endif pair, just leave the #define supportsWKWebKit bit out. But make sure you are using iphone 7.1 or above or it won't support WKWebkit.

Upvotes: 2

Related Questions