WKWebView Hang pada pemuatan halaman web lokal dengan konfigurasi web tertentu.

Saya memiliki WKWebView yang memuat sekumpulan halaman web lokal menggunakan WKWebViewConfiguration untuk mengatur konfigurasi agar @"allowFileAccessFromFileURLs" menjadi kenyataan.

Permintaannya diatur dengan sesuatu seperti ini:

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

Kemudian request dikirimkan menggunakan metode WKWebview berikut:

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

masalah saya adalah ketika perangkat memiliki koneksi saat ini tetapi tidak ada lalu lintas jaringan. Tampilan web sebagai elemen di layar akan ditambahkan ke layar dan permintaan akan dibuat tetapi tampilan web akan menampilkan layar putih selama sekitar 50 detik sebelum menampilkan konten lokal.

Segala sesuatu di tampilan web dimuat terlepas dari status jaringan karena dimuat secara lokal ketika tidak ada pengkondisi tautan yang disetel.

Misalnya jika perangkat terhubung ke nirkabel tetapi kondisioner tautan jaringan disetel ke 100% loss. Tampilan web dibuat dan permintaan dikirim untuk memuat konten lokal yang memicu terhentinya pemuatan.

Saya berpikir bahwa mungkin WKWebView mencoba melakukan semacam validasi di latar belakang yang memerlukan transaksi jaringan tetapi saya melakukan beberapa pembuatan profil jaringan dengan instrumen dan juga beberapa rekaman garis waktu di tampilan web safari dan saya tidak dapat melihat apa pun yang menyebabkannya. itu untuk digantung.

Satu-satunya alasan saya menganggapnya memuat konten lokal setelah sekitar 50 detik adalah karena ada semacam batas waktu WKWebView untuk memuat koneksi jaringan.

Bantuan apa pun akan sangat dihargai, terima kasih.


person Matt Tucker    schedule 20.06.2017    source sumber
comment
Saya membuat proyek sampel berdasarkan kode yang Anda berikan, menyetel kondisioner tautan jaringan ke 100% hilang (memverifikasi bahwa Safari di simulator tidak memiliki koneksi internet), dan tidak dapat mereproduksi masalah ini. Bisakah Anda memposting kode yang mereproduksi masalah (sederhana mungkin, tanpa menyertakan detail yang tidak relevan)?   -  person paulvs    schedule 21.06.2017
comment
Hai terima kasih atas usahanya @paulvs! Saya akan memberikan contoh yang lebih baik sekarang.   -  person Matt Tucker    schedule 21.06.2017
comment
@paulvs Jadi saya menghapus semuanya menjadi proyek barebone dan masalahnya tidak lagi terjadi. Saya sekarang berpikir masalahnya ada hubungannya dengan konten web itu sendiri. Saya akan memposting kembali di sini jika saya mengetahui apa yang salah.   -  person Matt Tucker    schedule 21.06.2017


Jawaban (1)


Oke, jadi bagi siapa pun yang menemukan ini, saya telah menemukan kesalahan yang saya lakukan.

Masalahnya sebenarnya bukan pada WKWebview atau konten web itu sendiri, melainkan bagaimana saya menangani penyelesaian pemuatan tampilan web.

dalam metode:

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

Saya mendengarkan penyelesaian acara dengan mengevaluasi beberapa JS seperti:

-(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);
        }
    }];

}

Blok penyelesaian tentu saja tidak dapat diselesaikan hingga fungsi jaringan dalam pemanggilan metode didFinishNavigation selesai (yang tidak dapat diselesaikan karena tidak ada lalu lintas.)

person Matt Tucker    schedule 21.06.2017