美文网首页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