2017-05-18 23 views
5

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()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 đỡ.

+0

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

+0

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. –

+0

Cảm ơn. Tôi sẽ thử. – OMK

Trả lời

0

Đây không thực sự là câu trả lời, nhưng sự cố này dường như có liên quan đến thời điểm lọc nội dung (kiểm soát của phụ huynh) được bật. Nếu bạn thêm bất kỳ tên miền nào mà ứng dụng của bạn đang tải trong UIWebView vào danh sách chặn điều khiển chính của iOS, bạn sẽ thấy lỗi này trong nhật ký ứng dụng (sắp tới trong nội bộ từ WebFit's WebFilter). Dường như làm mất hiệu lực UIWebView theo một cách nào đó, vì vậy khi bạn tương tác lại với nó, nó sẽ làm hỏng toàn bộ ứng dụng của bạn. Bạn có thể tránh sự cố bằng cách chuyển sang WKWebView.

WF: WebFilterEvaluator:addData: https://some-blocked-url.com is restricted: blacklisted

Các vấn đề liên quan