之前与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