珠玉在前,关于外部VC[wkwebview和tableview采用哪种方式合理布局]参考这篇文章https://www.jianshu.com/p/3721d736cf68,在此感谢,如果转载上篇文章请注明出处,再次感谢提供思路,下面要写的是关于webview加载url和本地html(html+css+js的页面模板在工程本地)js动态填写数据的比较.
1.直接加载URL,关于缓存策略自行选择,其实这种方案完全看后台页面端的水平了,这个webview加载可能牵扯网页页面重绘什么的,实际的展示效果真的是看各公司服务器+页面端的实力了
NSString *path = self.newsModel.url;
if (!path) {
return;
}
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:path] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:15.0];
[self.webView loadRequest:request];
2.加载html的
本地html文件的目录.png
这里的具体html等文件是前端提供的,汗~毕竟不是专业的h5前端,那种具体符合公司效果的网页还是交给专业的人员吧,当前暂时不考虑(可以网络获取各种html,js,css等文件存入沙盒以便更新样式)有兴趣的可以尝试,我还是感觉app开发版本迭代还是不错的,言归正传!
如图,将html,css,js等放在一个文件目录下边,导入工程中,以前遇到过不在一个目录下有些效果无效的情况,懒得折腾,就放一个目录下了
//加载本地样式
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"newsDetailIndex" ofType:@"html"];
NSString *htmlStr = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:htmlStr baseURL:[NSURL URLWithString:[NSString stringWithFormat:@"file://%@",filePath]]];
html里边的加载数据的js方法.png
//然后在页面加载成功之后回调JS动态页面赋值
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{
LOG(@"~~~~~~~didFinishNavigation");
[self loadJSData];
}
//因为js方法需要的是json对象所以根据具体的页面需要进行处理
-(void)loadJSData{
if (self.newsDetailJsonModel) {
//文章详情的content处理html字符串
NSString *content = [self htmlEntityDecode:self.newsDetailJsonModel.Tt_Content];
NSDictionary *params = @{@"Tt_Id":self.newsDetailJsonModel.Tt_Id,
@"Tt_Code":self.newsDetailJsonModel.Tt_Code,
@"Tt_Title":@"",
@"Tt_Digest":self.newsDetailJsonModel.Tt_Digest,
@"Tt_Content":content,
@"Tt_KeyWords": @"",
@"Tt_Url": self.newsDetailJsonModel.Tt_Url,
@"Tt_Img": self.newsDetailJsonModel.Tt_Img,
@"Tt_MediaId":@"",
@"Tt_MediaName":@"",
@"Tt_MediaType":@"",
@"Tt_ReferMedia":@"",
@"Tt_Extend1":@"",
@"Tt_Extend2":@"",
@"Tt_State": @"",
@"Tt_ShowTime":@"",
@"Tt_CreateTime":@""
};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:(NSJSONWritingPrettyPrinted) error:nil];
NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSString *LoadDataJs = [NSString stringWithFormat:@"doLoadData(%@, '', '')",jsonStr];
[self.webView evaluateJavaScript:LoadDataJs completionHandler:^(id _Nullable obj, NSError * _Nullable error) {
LOG(@"~~~加载本地html%@",obj);
}];
}
}
//后台返回的html内容的字符串处理一下,将 < 等类似的字符转化为HTML中的“<”等
- (NSString *)htmlEntityDecode:(NSString *)string
{
string = [string stringByReplacingOccurrencesOfString:@""" withString:@"\""];
string = [string stringByReplacingOccurrencesOfString:@"'" withString:@"'"];
string = [string stringByReplacingOccurrencesOfString:@"<" withString:@"<"];
string = [string stringByReplacingOccurrencesOfString:@">" withString:@">"];
string = [string stringByReplacingOccurrencesOfString:@"&" withString:@"&"];
// Do this last so that, e.g. @"&lt;" goes to @"<" not @"<"
return string;
}
其实在新闻列表页接口返回文章详情的信息还是在点击详情页面进入再请求就看各自公司需求外加后台老兄们的支持了,永远不要轻视任何一端,后台是数据处理逻辑核心,没了前台你展示啥?内在美?得了吧,这是个看脸的世界!同样没了后台老兄们合理的数据结构+稳定的接口服务前段再好也就是个花瓶!没什么内涵~~所以,现在是团队协作,teamwork!
实际效果还是很不错的,网页也有秒开效果~
网友评论