美文网首页iOS-VendoriOS DeveloperiOS开发
使用 PonyRouter 让 WebView 与 iOS 应用

使用 PonyRouter 让 WebView 与 iOS 应用

作者: PonyCui | 来源:发表于2015-11-19 13:28 被阅读333次

有无数种方法,可以让webView发送一个请求到原生应用,以下是一些通用的方法:

WebViewJavascriptBridge 存在某些内存泄漏问题,同时,该库依赖 UIWebViewDelegate,在使用上有各种不便。

与WebViewJavascriptBridge不同,PonyRouter 库并不使用 UIWebViewDelegate 方案, PonyRouter 使用 NSURLProtocol 方案拦截请求,并且可以为请求返回数据。

以下是使用 PonyRouter 截获请求的例子:

  1. 使用 PonyRouter 库,你需要为 WebView 定义一些URL规则
    例如 wechat://sayhello/ 或者 wechat://sayhello/?who=Pony
  2. 然后,在原生应用中,为这些URL定义他们的执行代码块
PGRNode *node = [[PGRNode alloc] init];
    node.scheme = @"wechat";
    node.identifier = @"sayhello";
    [node setExecutingBlock:^(NSURL *sourceURL, NSDictionary *params, NSObject *sourceObject) {
        NSLog(@"Oops, some one say hello to me.");
        if (params[@"who"] != nil) {
            NSLog(@"It's %@", params[@"who"]);
        }
    }];
    [[PGRApplication sharedInstance] addNode:node];
  1. 最后,在 WebView 中发送请求,一个简单的请求是直接使用 loadRequest
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"wechat://sayhello/?who=Pony"]]];
  1. Run, 控制台就会输出
2015-11-19 13:13:53.380 PonyRouter[61135:965270] Oops, some one say hello to me.
2015-11-19 13:13:53.381 PonyRouter[61135:965270] It's Pony
  1. 自定义返回内容,让WebView显示执行结果
    PGRNode *node = [[PGRNode alloc] init];
    node.scheme = @"wechat";
    node.identifier = @"sayhello";
    [node setExecutingBlock:^(NSURL *sourceURL, NSDictionary *params, NSObject *sourceObject) {
        NSLog(@"Oops, some one say hello to me.");
        if (params[@"who"] != nil) {
            NSLog(@"It's %@", params[@"who"]);
        }
    }];
    [node setReturnableBlock:^id(NSURL *sourceURL, NSDictionary *params, NSObject *sourceObject) {
        return @"I known you called me!";
    }];
    [[PGRApplication sharedInstance] addNode:node];

PonyRouter 不仅限于 UIWebView.loadRequest() 方法,包括 AJAX、jQuery、a标签、iframe、AFNetworking 这些库都是可以完美支持的。

PonyRouter 相当于在你的应用中搭建了一个服务器!

相关文章

网友评论

  • 1552e4eccec5:楼主这个是很给力的,但是貌似没法做到双向。
    WebViewJavascriptBridge 可以向webView传参数,给服务器的,
  • zyg:如果它的 usePattern 能匹配完整 url 地址 那就好了~ 可惜。。。 URL.host
  • zyg:这个库非常的好 太牛B了
  • zyg:好像 拦截不了
    请问有什么办法呢? 求指导一下
    PonyCui:@zyg UIWebViewDelegate 不能拦截webView内的请求
    zyg:@PonyCui 好 看了一下 原来我写错! 呼呼 谢谢你的解答!
    还有个问题 UIWebViewDelegate 的话 好像不行吧 不知道你有用过吗
    PonyCui:@zyg 按照指引方法就可以
  • zyg:请问 能不能 截获 html 上的 img 标签的 图片请求(http)
    PonyCui:可以
  • 小峰o: :clap: 赞一个

本文标题:使用 PonyRouter 让 WebView 与 iOS 应用

本文链接:https://www.haomeiwen.com/subject/xzjlhttx.html