[iOS]使用DSBridge同H5交互

之前与H5交互,一直都是自己老实的注入JavaScript与原生交互协议,然后在WKScriptMessageHandler协议方法中获取JavaScript端传递的事件和参数。可以参照之前的另一笔记
相对而言,使用DSBridge可以在web和app之间调用(支持同步调用和异步调用)彼此的方法,在Android、IOS和Javascript三端使用都比较简单。

interface MyAuctionOrderViewController ()

@property (strong, nonatomic) DWKWebView *webView;

@end

@implementation MyAuctionOrderViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // totu
    _urlPath = @"https://www.baidu.com";
    
    [self setupNavUI];
    [self.view addSubview:self.webView];
    [self loadWebViewAction];
}

- (void)setupNavUI {
    UIButton *leftCustomButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
    leftCustomButton.imageEdgeInsets = UIEdgeInsetsMake(0, -28, 0, 0);
    [leftCustomButton addTarget:self action:@selector(returnToPreviousPage) forControlEvents:UIControlEventTouchUpInside];
    [leftCustomButton setImage:[UIImage imageNamed:@"nav_back"] forState:UIControlStateNormal];
    UIBarButtonItem *leftButtonItem = [[UIBarButtonItem alloc] initWithCustomView:leftCustomButton];
    self.navigationItem.leftBarButtonItem = leftButtonItem;
}

// 返回上一页
- (void)returnToPreviousPage {
    BOOL fPage = NO;
    NSString *absolute = [_webView.URL absoluteString];
    if ([absolute containsString:_urlPath]) {
        fPage = YES;
    }
    
    BOOL haveCanGoBack = _webView.canGoBack;
    if (haveCanGoBack && !fPage) {
        [_webView goBack];
    } else {
        [self.navigationController popViewControllerAnimated:YES];
    }
}

- (void)loadWebViewAction {
    NSURL *pathUrl = [self handleLoadUrl:_urlPath];
    // 忽略缓存,直接取网络 NSURLRequestReloadIgnoringLocalCacheData
    NSURLRequest *request = [NSURLRequest requestWithURL:pathUrl
                                             cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                         timeoutInterval:20];
    [self.webView loadRequest:request];
}

- (NSURL *)handleLoadUrl:(NSString *)urlString {
    // 处理url带有中文的
    NSString *encodedString = (NSString*) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)urlString,(CFStringRef)@"!$&'()*+,-./:;=?@_~%#[]",NULL, kCFStringEncodingUTF8));
    NSURL *url = [NSURL URLWithString:encodedString];
    return url;
}

- (WKWebView *)webView {
    if (!_webView) {
        _webView = [[DWKWebView alloc] init];
        [_webView addJavascriptObject:self namespace:nil];
        // 在Object-c中调用Javascript API
        //[_webView callHandler:@"getToken" arguments:@[@3,@4] completionHandler:^(NSNumber* value){
        //    NSLog(@"%@",value);
        //}];
        if (@available(iOS 11.0, *)) {
            _webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        }
    }
    _webView.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-NavH);
    return _webView;
}

// 刷新WKWebView
- (void)reloadCurrentWebView {
    [_webView reload];
}

#pragma mark - JsApiTest
// 返回token值 同步API
- (NSString *)getToken:(NSString *)msg {
    SQLoginInfoModel *loginInfoModel = [AccountTool sqLoginModel];
    NSString *nowToken = loginInfoModel.token?:@"";
    return nowToken;
}

// token失效 返回登录界面
- (void)tokenInvalid:(NSString *)msg {
    [LoginController needLoginWithController:self successBlock:^{
        [self reloadCurrentWebView];
    } failureBlock:^{

    }];
}

// 跳转申请成为团长页面
- (void)intentBecomeTeamLeader:(NSDictionary *)msg :(void (^)(NSString * _Nullable result,BOOL complete))completionHandler {
    ApplicationTeamHeadFormViewController *vc = [[ApplicationTeamHeadFormViewController alloc] init];
    [vc setCallbackBlock:^(NSString * _Nonnull jsonString) {
        [self reloadCurrentWebView];
        completionHandler(jsonString,YES);
    }];
    [self.navigationController pushViewController:vc animated:YES];
}

// 跳转添加收获地址页面再异步返回json格式的地址 异步API
- (void)intentAddressManager:(NSDictionary *)msg :(void (^)(NSString * _Nullable result,BOOL complete))completionHandler {
    EditShippingAddressController *editVC = [[EditShippingAddressController alloc] init];
    [editVC setCallbackBlock:^(NSString * _Nonnull jsonString) {
        [self reloadCurrentWebView];
        completionHandler(jsonString,YES);
    }];
    [self.navigationController pushViewController:editVC animated:YES];
}

@end

Github:
DSBridge-IOS
https://github.com/wendux/DSBridge-IOS
DSBridge-Android
https://github.com/wendux/DSBridge-Android

TO:
ios开发dsbridge的使用 ios端代码
https://blog.csdn.net/ly410726/article/details/83274926
三端易用的现代跨平台JavaScript Bridge之IOS篇
https://segmentfault.com/a/1190000013388704
混合开发之DSBridge(同时支持Android和iOS)
https://www.cnblogs.com/dianming/p/6902778.html
DSBridge-iOS源码解析
https://www.jianshu.com/p/cac8f3f2ef30
ios快速集成DSBridge
https://www.jianshu.com/p/633d9fde946f

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值