如何在Swift中实现WebViewJavascriptBridge?

时间:2014-11-12 19:35:38

标签: ios swift uiwebview

我处理使用UIWebViews呈现内容的iOS项目。我经常需要该内容与本机应用程序进行通信,为此我依赖于有用的WebViewJavascriptBridge

我开始了一个我希望在Swift中实现的新项目。作为语言的新手,我遇到了正确实现桥梁的问题。虽然我很乐意承认对部分问题缺乏经验,但我也意识到Xcode错误地完成了代码,尤其是在设置Objective-C库使用块的闭包时。

这是我在Objective-C中使用的代码,其中一些Javascript通过字典发送以呈现PDF:

@weakify(self);
self.bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) {
    @strongify(self);
    if ([data isKindOfClass:[NSDictionary class]]) {

        // show a pdf
        if ([data[@"type"] isEqualToString:@"pdf"]) {
            self.docString = data[@"file"];
            self.docTitle = data[@"title"];
            [self performSegueWithIdentifier:@"modalPDF" sender:self];
        }
}
}];

除了正确设置网桥之外,我还需要确保在Swift中使用weak referenceself,就像我在Objective-C代码中所做的那样。

如何在Swift中正确实现桥接?

1 个答案:

答案 0 :(得分:5)

我花了一些试验和错误,但我找到了一个效果很好的解决方案。

将WebViewJavascriptBridge添加到我的项目后,我做的第一件事就是在我的项目中创建Objective-C Bridging Header并在那里导入类:

#import "WebViewJavascriptBridge.h"

有了这个,我可以使用以下代码初始化网桥:

self.bridge = WebViewJavascriptBridge(forWebView: self.webView, webViewDelegate: self) {
    [unowned self](data, responseCallback) -> Void in

    if let dataObj = data as? Dictionary<String, String> {
        if (dataObj["type"] == "pdf") {
            self.docString = dataObj["file"]
            self.docTitle = dataObj["title"]
            self.performSegueWithIdentifier("modalPDF", sender: self)
        }
    }
}

请注意,我使用self作为documented by Apple代替[unowned self]的弱引用。