
目的
app項目首頁banner功能,點擊進入活動頁面。由于web微站早已上線,為了不重復開發(fā)
(其實就是偷懶,為啥要重復開發(fā)一個一模一樣的頁面,而且用rn構建活動頁,那么多不同的模板,搞死人咯??)。
思路
- 最終采取采取app內(nèi)嵌微站webview頁面。
- 點擊banner跳轉至微站web頁面。
- 活動頁點擊商品跳轉至原生商品詳情頁(其實后來考慮抽象的WebViewFilter.js業(yè)務抽象類,原則是有原生就跳原生)。
遇到的坑
點擊banner進入攔截器了并且也跳轉了對應的原生頁面,可是從詳情頁返回后,盡然。。。??,什么鬼??
分析
分析ios報錯
參考 Domain=WebKitErrorDomain Code=102 內(nèi)容,說是因為url不完整,在網(wǎng)站前拼接一個@”http://”可以解決。排查了下,不是上述問題,url是完整的。
看ios日志
void SendDelegateMessage(NSInvocation *): delegate (webView:decidePolicyForNavigationAction:request:frame:decisionListener:) failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode
查了下說好像是因為多次發(fā)送請求導致的,就是多次同時創(chuàng)建 iframe被ios攔截導致卡住了。我看了下頁面沒有iframe,并且沒有多次請求的情況,我就是點了一個商品的連接啊啊啊,ORZ。。。。
分析web頁面代碼
- 查看具體活動頁面瀏覽器中的html代碼,其跳轉的url為“/mobile/product/content/201706/147149.html”
<li>
<a href="/mobile/product/content/201706/147149.html" class="ui-link">
<div>
<img src="http://image.com/n1/jfs/t2479/126/1824111579/264665/d911e030/56de95a0Nbe0fcefa.jpg" alt="">
</div>
<div class="txt-con">
<p class="txt-con-name">水星家紡出品 百麗絲家紡 全棉斜紋印花四件套 浮崗翠 雙人1.5米床</p>
<div class="yPrice">
<span class="pText">搶購價:</span>
<span class="pColor">暫無報價</span>
</div>
</div>
</a>
</li>
可是點擊后跳轉頁面卻是,http://www.website.com/mobile/product/content.jhtml?brandId=3524&productCategoryId=1626&productId=147149,什么鬼?
去看服務端代碼后發(fā)現(xiàn)服務端有攔截器,用于判斷客戶端請求是移動端,還是pc端,最終redirect到對應請求頁面。所以是不是因為重定向?qū)е碌膯栴}呢?
別的頁面沒重定向頁面都正常,只有詳情頁有問題,所以判斷是因為重定向?qū)е铝?02.
解決方法
根據(jù)下面參考的連接,我采用了如下方法解決,找到RN webview的源碼路徑為:項目名稱/node_modules/react-native/React/Views/RCTWebView.m
- (void)webView:(__unused UIWebView *)webView didFailLoadWithError:(NSError *)error
{
// Ignore NSURLErrorDomain error -999.
if (error.code == NSURLErrorCancelled) return;
// Ignore "Fame Load Interrupted" errors. Seen after app store links.
if (error.code == 102 && [error.domain isEqual:@"WebKitErrorDomain"]) return;
if (_onLoadingError) {
if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled) {
// NSURLErrorCancelled is reported when a page has a redirect OR if you load
// a new URL in the WebView before the previous one came back. We can just
// ignore these since they aren't real errors.
// http://stackoverflow.com/questions/1024748/how-do-i-fix-nsurlerrordomain-error-999-in-iphone-3-0-os
return;
}
NSMutableDictionary<NSString *, id> *event = [self baseEvent];
[event addEntriesFromDictionary:@{
@"domain": error.domain,
@"code": @(error.code),
@"description": error.localizedDescription,
}];
_onLoadingError(event);
}
}
參考
webview error code:102 Domain=WebKitErrorDomain Code=102