ObjCWebViewJavaScriptBridge 1.0.0

ObjCWebViewJavaScriptBridge 1.0.0

ouyanghua 维护。



  • ouyanghuacom

ObjCWebViewJavaScriptBridge

License MIT Build Status Carthage compatible Pod Version Pod Platform

跨iframe WebView JavaScript Bridge,面向 iOS(8.0+) 和 macOS(10.10+),支持 WKWebView、UIWebView、WebView。

Android 支持

安装

  • 本地应用
    • Cocoapods

      将以下内容添加到项目的 Podfile 中

      pod 'ObjCWebViewJavaScriptBridge'
    • Carthage

      将以下内容添加到项目的 Cartfile 中

      github "ouyanghuacom/ObjCWebViewJavaScriptBridge"
    • Web

      JavaScript 包含在 Web 项目中。

本地使用

  1. 创建服务器

    服务器会自动与 WebView 关联。只有当 WebView 被销毁时才会发布。

    namespace 用于标记不同的服务。

        WVJSBServer *server=[WVJSBServer serverWithWebView:webView ns:@"server namespace"];
  2. 检查 URL

    • UIWebView

      检查 URL 是执行安装的必要步骤。

      - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
          return [WVJSBServer canHandleWithWebView:webView URLString:request.URL.absoluteString];
      }
    • WKWebView

      - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
      decisionHandler([WVJSBServer canHandleWithWebView:webView URLString:navigationAction.request.URL.absoluteString]?WKNavigationActionPolicyCancel:WKNavigationActionPolicyAllow);
      }
    • WebView

      - (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener{
      if ([WVJSBServer canHandleWithWebView:webView URLString:request.URL.absoluteString]){
          [listener ignore];
      }else{
          [listener use];
      }

} ```

  • 处理无响应事件

    [[server on:@"method"] onEvent:^id(WVJSBConnection * connection, id parameter, WVJSBAckBlock (^done)(void)) {
        done();
        return nil;
    }];
  • 处理连接

    [[server on:@"connect"] onEvent:^id(WVJSBConnection * connection, id parameter, WVJSBAckBlock (^done)(void)) {
        done();
        return nil;
    }];
  • 处理断开连接

    [[server on:@"disconnect"] onEvent:^id(WVJSBConnection * connection, id parameter, WVJSBAckBlock (^done)(void)) {
        done();
        return nil;
    }];
  • 处理可取消请求

    [[server on:@"request"] onEvent:^id(WVJSBConnection * connection, id parameter, WVJSBAckBlock (^done)(void)) {
        done()(@"response object",nil);
        return nil;
    }];
  • 处理可取消请求

    [[[server on:@"request"] onEvent:^id (WVJSBConnection * connection, id parameter, WVJSBAckBlock (^done)(void)) {
        //Simulate asynchronous request
        dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
        dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*2), DBL_MAX, 0 * NSEC_PER_SEC);
        dispatch_source_set_event_handler(timer, ^{
            if (arc4random()%2){
                done()(@"response object",nil);
            }else{
                done()(nil,"can not find host");
            }
        });
        dispatch_resume(timer);
        //Return the timer as context 
        return timer;
    }] onCancel:^(id  context) {
        dispatch_source_t timer = context;
        //Cancel timer 
        dispatch_source_cancel(timer);
    }];
  • 发送请求到 JavaScript 客户端

    WVJSBOperation *operation = [[[connection event:@"request" parameter:nil] onAck:^(WVJSBOperation *operation,id result, id exception) {
        //Do something with result
    }] timeout:10];
  • 取消请求

    [operation cancel];

JavaScript 使用

  • 创建客户端

    const client = WVJSBCreateClient('server namespace',{"infomation key":"infomation value"});
  • 处理无响应事件

    client.on('method').onEvent(function(parameter,done){
        done();
        return null;
    })
  • 处理服务器的连接

    client.on('connect').onEvent(function(parameter,done){
        done();
        return null;
    })
  • 处理服务器的断开

    client.on('disconnect').onEvent(function(parameter,done){
        done();
        return null;
    })
  • 处理可取消请求

    client.on('request').onEvent(function(parameter,done){
        done()('response object',null);
        return null;
    })
  • 处理可取消请求

    client.on('request').onEvent(function(parameter,done){
        const context = window.setTimeout(function(){
            if(Math.random()<0.5){
                done()(null, 'can not find host');                       
            }else{
                done()('response object', null);
            }
        },2000);
        return context;
    }).onCancel(function(context){
        window.clearTimeout(context);
    });
  • 请求原生服务器

    const operation = client.event('request',null).onAck(function(operation,result, exception){
        //do something
    }).timeout(10000);
  • 取消请求

    operation.cancel();

运行示例

  1. 打开终端,执行以下命令

    cd pathToProject/WVJSB/Resources/www
    python -m SimpleHTTPServer
  2. 然后打开项目并运行

许可证

MIT 许可证

版权所有 (c) 2019 ouyanghuacom

任何人未经许可,均可免费获得本软件和相关的文档文件(“软件”),在此授权下,可以无限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许获得本软件的人进行上述行为,但须遵守以下条件

上述版权声明和本许可协议应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性。在任何事件中,无论作者或版权所有者因合同、侵权或其他方式引起的任何索赔、损害或其他责任, Softy 作者或版权所有者均不承担任何责任。