2013-09-22 5 views
13

Ich Einbettung dieser Website in meine App wie folgt aus:Warum ist UIWebView canGoBack = NEIN in iOS7?

NSString *url = [NSString stringWithFormat:@"https://mobile.twitter.com/search?q=%@", @"@test OR #test"]; 
url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
[self.twitterWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]]; 

self.twitterWebView.scalesPageToFit = YES; 

Und ich habe zwei Tasten für den Gang zurück und in dieser Website weiterzuleiten. Ich rufe

und
[self.twitterWebView goForward]; entsprechend.

Das funktioniert auf iOS 6 gut, aber auf iOS 7 sind die canGoBack- und canGoForward-Eigenschaften meiner Webansicht NEIN, und daher funktionieren meine Vor- und Zurück-Schaltflächen nicht.

Als eine Randnotiz, wenn die App das erste Mal installiert wird, und die Seite das erste Mal geladen wird, funktionieren meine Tasten. Aber wenn ich meine App erneut starte und auf einen Link auf der Website klicke, beginnt die canGoBack-Eigenschaft meiner Web-Ansicht immer mit NEIN.

Wie kann ich das lösen?

EDIT: Ich habe eine Mini-Test-App hochgeladen, die mein Problem demonstriert. Sie können es von here herunterladen. Bitte führen Sie die App auf einem iOS 7-Simulator aus. Achten Sie darauf, dass die Zurück-Schaltfläche bei der Erstinstallation der App funktioniert. Dann beenden Sie, führen Sie die App erneut und Sie werden sehen, dass es nicht mehr funktioniert.

Übrigens scheint das Problem über die mobile Website von Twitter zu sein. Sie können eine andere Website-Adresse versuchen und das sehen.

Antwort

18

Dies scheint mit HTML5's "Application Cache" functionality verwandt zu sein. Beim ersten Start wird die Site nicht zwischengespeichert und die UIWebView erkennt korrekt, ob sie vorwärts oder rückwärts gehen kann. Sobald der Cache gefüllt ist, entscheiden die neuen Instanzen UIWebView, dass, selbst wenn sich die URL ändert (was unter s webView:shouldStartLoadWithRequest:navigationType: beobachtet werden kann), ein Vorwärts- oder Rückwärtsgehen nicht mehr möglich ist. canGoForward und canGoBack werden NO und goForward zurückgeben und goBack nichts tun. Dies gilt auch für Neustarts der App, sofern der HTML5-Cache für diese bestimmte Site vorhanden ist.

Vielleicht ist dieses Problem auf Web-Anwendungen beschränkt, die die URL Fragment identifier after the hashmark über JavaScript ändern. Und ja, das Verhalten der UIWebView in dieser Situation zwischen iOS 6 und iOS 7 geändert.

Ich habe noch keine Lösung gefunden, und wir werden wahrscheinlich warten müssen, dass Apple dies in iOS 7.1 zu beheben oder so.

bearbeiten

Andere Leute haben dieses Problem auch:

Wenn Sie Application Cache verwenden und auch Staaten durch Hash oder eine andere Technik die Verwaltung, die Geschichte Objekt nicht halten Sie Ihre navigation history, also history.back() wird nie funktionieren und history.length bleibt in 1 für immer.

(von http://www.mobilexweb.com/blog/safari-ios7-html5-problems-apis-review)

bearbeiten 2

Dieses Problem in Safari existiert 7.0 (9537,71, default in OS X 10.9 Mavericks) auch. Die neueste WebKit nightly build (r158339) scheint jedoch korrekt zu funktionieren. Es ist wahrscheinlich nur eine Frage der Zeit, bis die Korrektur zu einer iOS- und OS X-Version führt.

bearbeiten 3

Dieses Problem besteht nach wie vor in iOS 7.1 und und OS X 10.9.2.

bearbeiten 4

Dieser Fehler in iOS 8 und Safari 7.1 (9537.85.10.17.1) für OS X behoben wurde!

Verwandte:

+0

Ihr verwandter Link besagt, dass sie behoben wurden, indem der App-Cache deaktiviert wurde. Wie ist das gemacht? Vielen Dank! – Olie

+1

@Olie Sie meinen, die HTML5-Caching-Funktionalität vollständig zu deaktivieren, indem Sie nicht auf das Manifest im Kopfbereich des HTML-Dokuments verweisen. Es ist nicht wirklich eine Lösung ... –

+0

Nun, das ist "suboptimal" ...: Gibt es irgendwelche anständigen Arbeitsumgebungen? – Olie

4

ich in iOS 7. Auch dieses Problem hatte, was für mich gearbeitet wurde mit dem "canGoBack" Code und "canGoForward" Code should bewegt, wie gezeigt unten. Vorher hatte ich es in webViewDidFinishLoad, die für iOS gearbeitet 6, aber nicht für iOS 7.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request 
navigationType:(UIWebViewNavigationType)navigationType 
{ 
    if ([webView canGoBack]) 
    { 
     [browserBackItem setEnabled:YES]; 
    } 
    else 
    { 
     [browserBackItem setEnabled:NO]; 
    } 
    if ([webView canGoForward]) 
    { 
     [browserForwardItem setEnabled:YES]; 
    } 
    else 
    { 
     [browserForwardItem setEnabled:NO]; 
    } 
    return YES; 
} 
+1

Nein, das hat das Problem auch nicht gelöst. Ich glaube, das Problem ist, wie Andreas oben erklärt hat. – aslisabanci

-1

Nachdem die Eigenschaft Wechsel zu "strong" Referenz, mein Problem verschwunden.

vor:

@property (nonatomic, weak) IBOutlet UIWebView *webView; 

nach der Eigenschaft Wechsel zu "strong":

@property (nonatomic, strong) IBOutlet UIWebView *webView; 
+0

das löste es nicht für mich – Jesse

3

ich hatte das gleiche Problem. Ich kann es mit den folgenden Änderungen lösen.

eine neue Methode updateButtons Implementiert

- (void)updateButtons:(UIWebView*)theWebView { 
    if ([theWebView canGoBack]) 
    { 
     self.backButton.enabled = YES; 
    } 
    else 
    { 
     self.backButton.enabled = NO; 
    } 
    if ([theWebView canGoForward]) 
    { 
     self.forwardButton.enabled = YES; 
    } 
    else 
    { 
     self.forwardButton.enabled = NO; 
    } 
    } 

hinzugefügt, um das obige Verfahren in should, webViewDidFinishLoad, didFailLoadWithError Ereignisse aufrufen.

Jetzt kommt der knifflige Teil. Nachdem Sie die obigen Änderungen vorgenommen haben, funktionieren die Schaltflächen Zurück und Vorwärts wie erwartet, außer in einem Szenario. Wenn wir durch Drücken der Zurück-Taste zur ersten Seite zurückkehren, wird sie nicht deaktiviert. Weil es keine der oben genannten Ereignisse auslöst, wenn die Seite durch Drücken der Zurück/Vorwärts-Taste geladen wird. Es wird nur aus dem Cache geladen.

Ich habe viele Ansätze versucht, aber nur eine, die mein Problem gelöst hat.

Ein Beobachter auf WebHistoryItemChangedNotification hinzugefügt.

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(webViewHistoryDidChange:) 
              name:@"WebHistoryItemChangedNotification" 
              object:nil]; 

Genannt die gleiche updatebuttons-Methode in webViewHistoryDidChange.

- (void)webViewHistoryDidChange 
{ 
    [self updateButtons:self.webView]; 
} 
+0

Diese Lösung beheben Sie meine Probleme mit YouTube-Handy-Seite. Tatsächlich habe ich updateButtons in 4 Funktionen aufgerufen: shouldStartLoadWithRequest, webViewDidFinishLoad, didFailLoadWithError und webViewHistoryDidChange. Die ersten drei funktionieren gut, wenn die Site eine Desktop-Version ist. Aber wenn ich mit einer mobilen Website arbeite, brauche ich die vierte Funktion. –

+1

Dies ist die richtige Antwort. – iOS

Verwandte Themen