CocoaPods trunk is moving to be read-only. Read more on the blog, there are 19 months to go.

LYSCommonWebKit 0.0.6

LYSCommonWebKit 0.0.6

Maintained by liyangshuai.



  • By
  • LIYANGSHUAI

LYSCommonWebKit

解决开发中,H5与原生混合过程中,js和原生交互繁琐,逻辑复杂,频繁交换数据的问题

iOS技术群群二维码

解决下移20像素问题:

if (@available(iOS 11.0, *)) {
self.webView.webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
self.automaticallyAdjustsScrollViewInsets = NO;
}

实现alert弹窗拦截

// 实现如下协议
@protocol LYSCommonWebJavaScriptDelegate <NSObject>

- (void)ly_webView:(LYSCommonWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(CGRect *)frame;
- (BOOL)ly_webView:(LYSCommonWebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(CGRect *)frame;

@end

方式一:

// ios 端代码
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.webView = [[LYSCommonWeb alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:self.webView];

    if (@available(iOS 11.0, *)) {
        self.webView.webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } else {
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
    
    [self.webView ly_loadUrl:@"http://0.0.0.0:8080"];
    
    [self.webView ly_addAsynAction:@selector(addValue:) target:self name:@"addValue"];
    
}

- (void)addValue:(LYSBridgeInfo *)info
{
    NSLog(@"收到响应数据: %@",info);
    // 模拟异步操作,延迟两秒回传数据
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.webView ly_evaluateResponse:@{
                                         @"result": @"ios  to  vue!!"
                                         } success:YES message:@"success!" bridge:info];
    });
}
// js端代码
window.JsBridgeBind('addValue', function (res) {
        alert(JSON.stringify(res))
      }, {
        params: 'vue  to  ios!!!'
      })
// iOS 端打印
2019-07-18 14:42:03.312 LYSCommonWebKitDemo[6458:193628] 收到响应数据: {
    bridgeName = addValue;
    callbackId = 2;
    parms =     {
        params = "vue  to  ios!!!";
    };
}
// js端打印
{"data":{"result":"ios  to  vue!!"},"success":true,"message":"success!"}

方式二:

// iOS端代码
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.webView = [[LYSCommonWeb alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:self.webView];

    if (@available(iOS 11.0, *)) {
        self.webView.webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } else {
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
    
    [self.webView ly_loadUrl:@"http://0.0.0.0:8080"];
    
    self.webView.extendName = @"ios";
    [self.webView ly_addAsynAction:@selector(addValue:) target:self name:@"addValue"];
    
}

- (void)addValue:(LYSBridgeInfo *)info
{
    NSLog(@"收到响应数据: %@",info.allParms);
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.webView ly_evaluateResponse:@{
                                         @"result": @"ios  to  vue!!"
                                         } success:YES message:@"success!" bridge:info];
    });
}
// js端代码
window.JsBridgeBind('addValue', function (res) {
        console.log(JSON.stringify(res))
      }, {
        params: 'vue  to  ios!!!'
      })
// iOS端打印
2019-07-18 14:48:12.842 LYSCommonWebKitDemo[6503:196164] 收到响应数据: {
    bridgeName = addValue;
    callbackId = 2;
    parms =     {
        params = "vue  to  ios!!!";
    };
}
// js端代码
{"data":{"result":"ios  to  vue!!"},"success":true,"message":"success!"}

方式三

// iOS 端代码
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.webView = [[LYSCommonWeb alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:self.webView];

    if (@available(iOS 11.0, *)) {
        self.webView.webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } else {
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
    
    [self.webView ly_loadUrl:@"http://0.0.0.0:8080"];
    
    [self.webView ly_addAction:@selector(addValue:) target:self name:@"addValue"];
    
}

- (id)addValue:(id)obj
{
    NSLog(@"收到响应数据: %@", obj);
    return @{
             @"result": @"ios  to vue!!!"
             };
}
// js端代码
console.log(window.addValue('vue  to  ios!!'))
// iOS 端打印
收到响应数据: vue  to  ios!!
// js端打印
{result: "ios  to vue!!!"}

方式四

// iOS 端代码
@protocol LYSCommonWebKitActionDelegate <JSExport>

- (id)addValue:(id)obj;

@end
@interface ViewController ()<LYSCommonWebKitActionDelegate>

@property (nonatomic, strong) LYSCommonWeb *webView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.webView = [[LYSCommonWeb alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:self.webView];

    if (@available(iOS 11.0, *)) {
        self.webView.webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } else {
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
    
    [self.webView ly_loadUrl:@"http://0.0.0.0:8080"];
    
    [self.webView ly_addExtendName:@"ios" target:self];
    
}

- (id)addValue:(id)obj
{
    NSLog(@"收到响应数据: %@", obj);
    return @{
             @"result": @"ios  to vue!!!"
             };
}
// js端代码
console.log(window.ios.addValue('vue  to  ios!!'))
// iOS 端打印
收到响应数据: vue  to  ios!!
// js端打印
{result: "ios  to vue!!!"}

bridge文件内容

(function () {
  var _this = this
  var id = 1
  var callbacks = {}
  window.JsBridgeInvoke = function (result) {
    var callbackId = result.callbackId
    var data = result.data
    var success = result.success
    var message = result.message
    if (callbackId) {
      if (callbacks[callbackId]) {
        callbacks[callbackId]({data: data, success: success, message: message})
      }
    }
    return _this
  }
  window.JsBridgeBind = function (bridgeName, callback, params) {
    var msg = {success: false, data: null}
    if (typeof callback !== 'function') {
      return
    }
    if (!window.android && !window.ios) {
      msg.message = 'API不存在!!'
      callback(msg)
      return
    }
    id += 1
    callbacks[id] = callback
    var data = {bridgeName: bridgeName, data: params || {}, callbackId: id}
    if (Object.prototype.hasOwnProperty.call(window, 'ios')) {
      window.ios.callNativeBridgeApi(data)
    } else {
      if (Object.prototype.hasOwnProperty.call(window, 'android')) {
        window.android.callNativeBridgeApi(JSON.stringify(data))
      }
    }
  }
})()