2013-09-22 4 views
13

私はこのように私のアプリにこのウェブサイトを埋め込むよ:なぜiOS7ではUIWebView canGoBack = NOですか?

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; 

そして私は、このウェブサイトにバックと前進のための2つのボタンがあります。私はそれに応じて


[self.twitterWebView goForward];を呼び出します。

これはiOS 6でもうまくいきますが、iOS 7では、私のウェブビューのcanGoBackとcanGoForwardプロパティがNOで、バックとフォワードボタンが機能しません。

アプリが最初にインストールされ、ページが初めて読み込まれるとき、私のボタンが機能します。しかし、私は再び私のアプリケーションを実行し、私はWebサイトのリンクをタップすると、私のWebビューのcanGoBackプロパティは常にNOを返す開始します。

どうすればこの問題を解決できますか?

EDIT:私の問題を示すミニテストアプリをアップロードしました。 hereからダウンロードできます。 iOS 7シミュレータでアプリを実行してください。アプリの最初のインストール時に戻るボタンが動作していることを確認してください。その後、アプリケーションをもう一度実行すると、動作が停止することがわかります。

ところで、この問題はTwitterのモバイルサイトについてのようです。別のWebサイトのアドレスを試してみることができます。

答えて

18

これはHTML5's "Application Cache" functionalityに関連しているようです。最初の起動時には、サイトはキャッシュされず、UIWebViewは前方または後方に移動できるかどうかを正しく検出します。キャッシュが設定されるとすぐに、新しいUIWebViewインスタンスは、URLが変更されても(UIWebViewDelegatewebView:shouldStartLoadWithRequest:navigationType:に記載されています)、前進または後退はもはや不可能であると判断します。 canGoForwardおよびcanGoBackは、NOおよびgoForwardおよびgoBackは何もしません。この特定のサイトのHTML5キャッシュが存在する限り、これはアプリの再起動後も維持されます。

JavaScriptを使用してURLのFragment identifier after the hashmarkを変更するウェブアプリケーションには、この問題が限定されている可能性があります。 そして、私はまだ解決策を見つけていない、と私たちは、おそらくAppleはiOSの7.1でこの問題を解決するのを待つ必要があるでしょう

7のiOS 6とiOSの間はい、このような状況で UIWebViewの挙動が変化するDIDとか、ぐらい。

編集

他の人があまりにも、この問題を持っている:

あなたがアプリケーションキャッシュを使用しても、ハッシュまたは他の技術により 状態を管理している場合は、履歴オブジェクトが あなたを維持しません。したがって、history.back()は決して動作しません。 とhistory.lengthは永遠に1にとどまります。

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

編集2

この問題は、あまりにも、サファリ7.0(9537.71、OS X 10.9マーベリックスのデフォルト)に存在します。ただし、最新のWebKit nightly build(r158339)が正しく動作しているようです。この修正によってiOSとOS Xのリリースになるまでは、たぶん時間の問題です。

編集3

この問題はまだiOSの7.1およびOS X 10.9.2に存在します。

編集4

このバグは、OS X用のiOS 8とSafari 7.1(9537.85.10.17.1)で修正されています!

関連:

+0

関連リンクには、アプリキャッシュを無効にすることで修正されたというメッセージが表示されます。それはどうですか?ありがとう! – Olie

+1

@Olie HTMLドキュメントの 'head'セクションでマニフェストを参照しないことで、HTML5キャッシング機能を完全に無効にすることを意味します。それは本当に修正ではありません... –

+0

それは 'subOptimal'です:... \何かまともな回避策はありますか? – Olie

4

私が示すようにshouldStartLoadWithRequestに "canGoBack" コードと "canGoForward" のコードを移動していた何を私のために働いたのiOS 7にあまりにもこの問題がありました以下。前に、私はiOSの6のために働いwebViewDidFinishLoad、それを持っていたが、「strong」参照にプロパティを変更した後の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

いいえ、それは私にとっても問題を解決しませんでした。 Andreasが上で説明したように問題があると私は信じています。 – aslisabanci

-1

のためではありませんでした、私の問題は姿を消しました。

前に:私は同じ問題を持っていた

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

これは私のためにそれを解決しなかった – Jesse

3

: "strong" にプロパティを変更した後

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

。私は以下の変更を加えて解決することができます。

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

新しいメソッドupdateButtonsを実装

shouldStartLoadWithRequest、webViewDidFinishLoad、didFailLoadWithErrorイベントで上記のメソッドを呼び出す追加しました。

今や難しい部分があります。上記の変更を行った後、1つのシナリオを除き、前と後ろのボタンが期待どおりに機能しています。戻るボタンを押して最初のページに戻ると、無効になっていません。戻る/進むボタンを押すことによってページが読み込まれているとき、上記のイベントは発生しません。キャッシュからロードするだけです。

私は多くのアプローチを試みましたが、私の問題を解決したのは1つだけでした。

WebHistoryItemChangedNotificationにオブザーバーを追加しました。

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

webViewHistoryDidChangeで同じupdatebuttonsメソッドが呼び出されました。

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

この解決策は、YouTubeのモバイルページで私の問題を修正します。実際、updateButtonsは、shouldStartLoadWithRequest、webViewDidFinishLoad、didFailLoadWithError、およびwebViewHistoryDidChangeの4つの関数で呼び出されました。最初の3つは、サイトがデスクトップ版の場合はうまく機能します。しかし、モバイルサイトを扱う場合、私は4番目の機能が必要です。 –

+1

これは正解です。 – iOS

関連する問題