ioswebview混编_iOS 原生和H5混合开发总结
最近一段時(shí)間開發(fā)一個(gè)App,由于時(shí)間緊采用原生+H5混合開發(fā),這里記錄一下開發(fā)過程中遇到的問題。
之前在項(xiàng)目中使用過WebViewJavascriptBridge,使用起來很簡(jiǎn)單,但是這次項(xiàng)目中沒有使用。只用了原生的WKWebView。這里就不具體講怎么使用WKWebView。
思路:
1.寫一個(gè)自定義的webVIew繼承WKWebView。用于初始化和增加進(jìn)度條(UIProgressView)
2.寫一個(gè)Web通用的ViewController。處理各種邏輯。
3.原生頁面的導(dǎo)航欄標(biāo)題可以取H5的title
// 監(jiān)聽title
[self.webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];
// 監(jiān)聽回調(diào)
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
//網(wǎng)頁title
if ([keyPath isEqualToString:@"title"] && object == self.webView)
{
}
}
4.有的頁面可能導(dǎo)航欄顏色不一樣,可以根據(jù)H5的文件名來判斷顯示不同的顏色。
5.H5頁面的文件名和路徑都配置在數(shù)據(jù)庫中。
問題
1.之前和Android討論把所有的跳轉(zhuǎn)都通過這個(gè)方法監(jiān)聽
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
// 如果是跳轉(zhuǎn)一個(gè)新頁面
NSString *url = [navigationAction.request.URL absoluteString];
NSLog(@"url--%@",url);
}
但是Android在使用URL Schemes 跳轉(zhuǎn)的時(shí)候在有些機(jī)型會(huì)彈窗。所以后來采用和js交互的方式進(jìn)行跳轉(zhuǎn)
2.iOS給JS提供了一個(gè)頁面返回的方法,但是在測(cè)試過程中發(fā)現(xiàn),這個(gè)方法會(huì)無限調(diào)用,導(dǎo)致頁面一直pop;
調(diào)用的結(jié)果是因?yàn)閕OS這邊使用了一個(gè)通用的頁面,比如兩個(gè)頁面一個(gè)頁面是ViewController1,跳轉(zhuǎn)到下一個(gè)頁面ViewController2,這兩個(gè)ViewController其實(shí)都是一個(gè)通用H5Controller的,初始化的時(shí)候都注冊(cè)了handleBack方法,而H5那邊把這個(gè)handleBack方法寫成全局的了,所以我返回ViewController1的時(shí)候也在調(diào)用handleBack,所以會(huì)無限的調(diào)用,H5那邊之后改成局部就沒有問題了。
3.首頁有個(gè)邏輯是如果客戶端定位成功就把定位傳給H5進(jìn)行交互。H5根據(jù)定位信息來顯示不同的頁面,所以和JS注冊(cè)了一個(gè)方法。在網(wǎng)速很快的時(shí)候都沒有發(fā)現(xiàn)問題。但是如果定位返回很快,但是訪問H5那邊慢就會(huì)導(dǎo)致JS方法在沒有注冊(cè)的情況下就調(diào)用了JS所以沒有效果。解決方法是定位成功和H5交互但是在WebView加載完成后再調(diào)用一次交互。這樣就沒有問題了。
總結(jié)
以上是生活随笔為你收集整理的ioswebview混编_iOS 原生和H5混合开发总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sklearn——线性回归例子
- 下一篇: 京东技术助力十余省抗击疫情 应急资源平