WKWebView ค้างในการโหลดหน้าเว็บท้องถิ่นด้วยการกำหนดค่าเว็บบางอย่าง

ฉันมี WKWebView ที่โหลดชุดหน้าเว็บในเครื่องโดยใช้ WKWebViewConfiguration เพื่อตั้งค่าการกำหนดค่าสำหรับ @"allowFileAccessFromFileURLs" ให้เป็นจริง

คำขอถูกตั้งค่าด้วยสิ่งนี้:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"testPage" withExtension:@"html" subdirectory:@"html/pages"];
NSURLRequest *req = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10.0f];

จากนั้นคำขอจะถูกส่งโดยใช้วิธี WKWebview ต่อไปนี้:

- (nullable WKNavigation *)loadRequest:(NSURLRequest *)request;

ปัญหาของฉันคืออุปกรณ์มีการเชื่อมต่อปัจจุบัน แต่ไม่มีการรับส่งข้อมูลเครือข่าย WebView ในฐานะองค์ประกอบบนหน้าจอจะถูกเพิ่มลงในหน้าจอและจะมีการร้องขอ แต่ WebView จะแสดงหน้าจอสีขาวประมาณ 50 วินาทีก่อนที่จะแสดงเนื้อหาในเครื่อง

ทุกอย่างใน webview จะโหลดโดยไม่คำนึงถึงสถานะของเครือข่าย เนื่องจากโหลดในเครื่องเมื่อไม่ได้ตั้งค่าเครื่องมือควบคุมลิงก์

ตัวอย่างเช่น หากอุปกรณ์เชื่อมต่อกับระบบไร้สายแต่ตัวปรับสภาพลิงก์เครือข่ายถูกตั้งค่าเป็นการสูญเสีย 100% Webview ถูกสร้างขึ้นและส่งคำขอให้โหลดเนื้อหาในเครื่องที่ทำให้เกิดการค้างของการโหลด

ฉันคิดว่าอาจเป็น WKWebView ที่พยายามทำการตรวจสอบความถูกต้องบางอย่างในพื้นหลังที่ต้องมีการทำธุรกรรมผ่านเครือข่าย แต่ฉันได้ทำโปรไฟล์เครือข่ายด้วยเครื่องมือและบันทึกไทม์ไลน์บางส่วนใน Safari WebView และฉันไม่เห็นสิ่งใดที่จะทำให้เกิด มันจะแขวน

เหตุผลเดียวที่ฉันคิดได้ว่ามันจะโหลดเนื้อหาในเครื่องหลังจากผ่านไป 50 วินาทีหรือประมาณนั้นก็คือว่ามันถึงระยะหมดเวลาของ WKWebView เพื่อโหลดการเชื่อมต่อเครือข่าย

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมากขอบคุณ


person Matt Tucker    schedule 20.06.2017    source แหล่งที่มา
comment
ฉันสร้างโปรเจ็กต์ตัวอย่างตามโค้ดที่คุณให้มา ตั้งค่าเครื่องมือควบคุมลิงก์เครือข่ายเป็นการสูญเสีย 100% (ตรวจสอบว่า Safari ในเครื่องจำลองไม่มีการเชื่อมต่ออินเทอร์เน็ต) และไม่สามารถจำลองปัญหานี้ได้ คุณสามารถโพสต์โค้ดที่สร้างปัญหาซ้ำได้หรือไม่ (ง่ายที่สุดเท่าที่จะทำได้ โดยละรายละเอียดที่ไม่เกี่ยวข้องออกไป)   -  person paulvs    schedule 21.06.2017
comment
เฮ้ขอบคุณสำหรับความพยายาม @paulvs ! ฉันจะรวบรวมตัวอย่างที่ดีกว่าตอนนี้   -  person Matt Tucker    schedule 21.06.2017
comment
@paulvs ดังนั้นฉันจึงแยกทุกอย่างออกเป็นโปรเจ็กต์แบร์โบนและปัญหาก็ไม่เกิดขึ้นอีกต่อไป ตอนนี้ฉันกำลังคิดว่าปัญหาเกี่ยวข้องกับเนื้อหาเว็บจริง ๆ ฉันจะโพสต์กลับมาที่นี่หากฉันทราบว่าเกิดอะไรขึ้น   -  person Matt Tucker    schedule 21.06.2017


คำตอบ (1)


เอาล่ะ สำหรับใครก็ตามที่สะดุดกับสิ่งนี้ ฉันได้พบสิ่งที่ฉันทำผิด

ปัญหาไม่ได้อยู่ที่ WKWebview หรือเนื้อหาเว็บจริงๆ แต่เป็นวิธีที่ฉันจัดการกับการโหลด webview ให้เสร็จสิ้น

ในวิธีการ:

- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{

ฉันกำลังฟังเหตุการณ์ที่เสร็จสิ้นโดยการประเมิน JS บางอย่างดังนี้:

-(void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
{

    [webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id result, NSError *error) 
    {
        if (result != nil) {
        [self doCertainNetworkEvent]; //here another method is called with a networking function inside of it. 
    }
        if(error) 
        {
            NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
        }
    }];

}

แน่นอนว่าบล็อกการทำให้เสร็จสมบูรณ์ไม่สามารถเสร็จสิ้นได้จนกว่าฟังก์ชันเครือข่ายภายในการเรียกเมธอด DidFinishNavigation จะเสร็จสิ้น (ซึ่งไม่สามารถทำได้เนื่องจากไม่มีการรับส่งข้อมูล)

person Matt Tucker    schedule 21.06.2017