Tôi có ứng dụng iOS ngẫu nhiên dường như gặp sự cố trên màn hình có giao diện người dùng UIWebView. Dường như vụ tai nạn xảy ra chủ yếu trên các thiết bị iPhone 5C (74% thời gian) và 100% thời gian trên iOS 10.X.iOS UIWebView gặp sự cố ngẫu nhiên trên WebCore :: FrameTree :: top
Thông điệp ngoại lệ là:
EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000028
Từ địa chỉ bộ nhớ thấp nó làm cho tôi nghĩ rằng có điều gì đó nil
.
Đây là vết lùi (đây không phải là chủ đề chính):
0 WebCore WebCore::FrameTree::top() + 0
1 WebCore WebCore::ContentSecurityPolicy::allowFrameAncestors() + 33
2 WebCore WebCore::DocumentLoader::responseReceived() + 413
3 WebCore WebCore::DocumentLoader::handleSubstituteDataLoadNow() + 203
4 WebCore WebCore::ThreadTimers::sharedTimerFiredInternal() + 149
5 WebCore WebCore::timerFired() + 23
6 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 15
7 CoreFoundation __CFRunLoopDoTimer + 833
8 CoreFoundation __CFRunLoopDoTimers + 189
9 CoreFoundation __CFRunLoopRun + 781
10 CoreFoundation CFRunLoopRunSpecific + 471
11 CoreFoundation CFRunLoopRunInMode + 105
12 WebCore RunWebThread() + 427
13 libsystem_pthread.dylib _pthread_body + 217
14 libsystem_pthread.dylib _pthread_start + 235
tôi không thể tái tạo vụ tai nạn này bản thân mình.
Vì WebKit là mã nguồn mở, tôi đã tìm thấy mã nơi nó bị lỗi: WebCore::FrameTree::top. Từ khi nhìn vào mã đó, tôi đoán m_thisFrame->tree()
là NULL
, nhưng tôi không chắc chắn làm thế nào để giải thích nó. Tôi không chắc chính xác "khung" và "cây" là gì trong ngữ cảnh đó.
Từ backtrace có vẻ như có một số bộ hẹn giờ đang được kích hoạt, có thể sau khi View Controller hoặc Web View đã được deallocated? Bộ hẹn giờ đó có phải do cuộc gọi JavaScript setTimeout
không?
Ngoài ra, tôi nhận thấy mỗi khi sự cố này xảy ra, tôi nhận được cuộc gọi đến [UIWebViewDelegate webView:didFailLoadWithError:]
ngay trước khi xảy ra sự cố. Các lỗi phổ biến nhất trở lại ở chỗ phương pháp đại biểu là:
- Khung tải bị gián đoạn
- quá nhiều chuyển hướng HTTP
- các yêu cầu time out
Nhưng tôi không có phân tích tại chỗ để tương quan với thông báo lỗi với sự cố, vì vậy tôi không chắc chắn (nếu có) sẽ giải thích nó. Khi phương thức ủy nhiệm đó kích hoạt, tôi hiển thị cho người dùng một thông báo lỗi theo một phương thức. Điều này có thể liên quan đến sự cố không? Tôi đã thử tạo lại lỗi "Tải khung bị gián đoạn" và "quá nhiều chuyển hướng HTTP" nhưng không gây ra sự cố cho tôi trong trình mô phỏng.
Tôi đã làm theo những lời khuyên trong this answer (chủ yếu) và gọi [webview stopLoading]
trong viewWillDisappear
và tôi gọi self.webView.delegate = nil
trong dealloc
của chứa View Controller nhưng nó đã không giúp đỡ.
Tôi đang đối mặt với cùng một vấn đề. bạn đã tìm thấy giải pháp nào chưa? – OMK
Tôi sẽ không đặt câu trả lời này vì đó là suy đoán, nhưng tôi nghĩ chuyển sang WKWebView có thể giải quyết các loại sự cố này. –
Cảm ơn. Tôi sẽ thử. – OMK