2014-10-22 24 views
6

Projemi UIWebView'dan WKWebView'e güncelleştiriyorum. UIWebView'ın, javascript çalıştırana ve içeriğe sahip olana kadar herhangi bir ebeveyni olmadığı mevcut UIWebView yaklaşımında, web görünümüne bir üst öğe ekler. İçerik, UIWebView kullanılarak iyi bir şekilde oluşturulur. WKWebView için aynı yaklaşımı kullanıyorum, ancak WKWebview yüklemeye takıldı. Web görünümüne ebeveyn eklemeden wkwebview'de javascript'i çalıştırabilmenin herhangi bir yolu var mı? Bir başka ilginç şey, cihazda olmayan simülatörde çalışıyor olmasıdır. Html, css ve görüntüleri sunmak için localHTTPServer'ı kullanma. Yukarıdaki sorunu çözmek için herhangi bir öneri veya ipucuWKWebview, bir üst görünüm ekleyerek javascript (XML HTTP isteği) çalıştırmıyor

.

cevap

10

Uygulamamda socket.io başlığında bir WKWebView'da benzer davranışlar gözlemledim. Benim durumumda, web soketi her zaman kesilecek ve tekrar bağlanmayacaktı.

WKWebView, javascript off-process'i çalıştırdığı için, kaynakları saklamak için boş bırakılan herhangi bir javascript'i duraklattığından (< -IMO) böyle görünüyor. Boşta bir ebeveyn bulunmuyor veya uygulama/cihaz etkin değil. Evet, evet, çoğu durumda bir ebeveyn görüşüne ihtiyaç duyduğunda doğru gibi görünüyorsun. Uygulamanın etkin ve UI etkilemez iken

WKWebViewConfiguration* webViewConfig = // set up config 

// provide empty frame rect 
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:webViewConfig]; 

// add to keyWindow to ensure it is 'active' 
[UIApplication.sharedApplication.keyWindow addSubview:webView]; 

Bu yaklaşım en azından JavaScript ishal sağlamaktadır: Aşağıdaki kodu kullanarak bu geçici bir çözüm başardı. Daha sonra görüntülemeniz gerekirse, çerçeveyi oluşturup sıfırladıktan sonra webGörünümüDüğümDüğünden kaldırabilirsiniz. Ve evet, simülatörde bunun bir sorun olmadığını da gözlemledim (javascript HER ZAMAN, ebeveyn veya uygulama durumundan bağımsız olarak çalışır)

Bu yardımcı olur!

+2

Vay: _keepWKWebViewActive olduğunu

self.keepWebViewActiveTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(_keepWKWebViewActive:) userInfo:nil repeats:YES]; 

: Ben sürekli benim için çalışır gibi görünen başka bir şey denedik. Şaşırtıcı, size çözüm yolu. İşe yarıyor. Ancak bir noktada webview'i keywindow'dan kaldırmamız gerekiyor mu? Aksi takdirde performans veya bellek kısıtlamaları ortaya çıkabilir. – user1198982

+1

bağlıdır. Benim için soket bağlantısının devam etmesi için sürekli çalışmasına ihtiyacım var. ama emin, koşmaya ihtiyacınız yoksa, neden kaldırmayın :). – mattr

+0

Bu, Apple ile bir hata olarak ortaya çıkıyor mu, açık bir radar var. –

2

Kabul edilen çözüm benim için biraz zaman çalıştı.

-(void) _keepWKWebViewActive:(NSTimer*) timer{ 
    if(self.webView) { 
     [self.webView evaluateJavaScript:@"1+1" completionHandler:nil]; 
    } 
}