2013-10-30 11 views
7

ショートバージョン:私のアプリのバックグラウンドフェッチでは、webviewでコンテンツを読み込もうとすると何もしません。バックグラウンドフェッチでUIWebViewをロード

ロングバージョン:私は、プロジェクト内の右の機能を設定した間隔フェッチし、例のように

- (void) application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 

メソッドを実装し、それが動作します。しかし、私のバックグラウンドフェッチを完了するために、UIWebViewにいくつかのコンテンツをロードする必要があります。そして、これは動作しません。私が呼ぶとき、単にプロセスが何らかの形で「迷子」:

[myWebview loadRequest:request]; 

(もちろん、それは時にフォアグラウンドで動作しますが、バックグラウンドでたときに何もしません)。

「フォアグラウンドモードでアプリの復帰まで(それは我々が背景にあり、意味をなさない!)だから、

私もメインスレッドでロードするのWebViewを強制しようとしたが、その後システムは、単にそれを停止バックグラウンドでUIWebViewをロードする方法がありますか? NSURLSessionを使ってコンテンツをダウンロードすることはできません。なぜなら、Webページにはフレームの一部をロードするjavascriptが含まれているからです(ウェブページの再デザインを求めることはできません)。

編集:たぶん私は質問を書いたときに十分crearはありませんでしたが、バックグラウンドで動作しませんをフェッチしながら、(同様の方法O dispatch_asyncで)main_queueでタスクを実行しようとしています。私はそれを尋ねる前に試しました...

+0

いつ完了ハンドラを呼び出していますか? –

+0

Webビューがロードされた後に呼び出されるのを待ちますが、ロードも開始しません。 –

+0

バックグラウンドで実行しているときにWebビューが実際にビュー階層内にありますか(つまり、 ? –

答えて

2

11/11/2013(iOS 7.0.3)のようには見えません。 私は人々が間違った情報を取得しないようにこの回答を残しています。

エドゥアルド・アレナスプラダのソリューションは、アプリケーションがフォアグラウンドであれば完璧に動作しますが、バックグラウンドで悲しそうをフェッチしません。

+1

これは現在でも当てはまります:2014年4月27日。 –

3

ユーザーインターフェイスから要素を更新する場合は、アプリケーションのメインキュー(またはスレッド)で要素にアクセスする必要があります。私がお勧めするのは、必要なデータをバックグラウンドで入手し続けることですが、UIWebViewを更新するときは、メインスレッドで行います。これは、あなたがアクセスしていることを確認します

[self performSelectorOnMainThread:@selector(method:) withObject:fetchedData waitUntilDone:YES]; 

dispatch_async(dispatch_get_main_queue(), ^{ 

     // Load fetched data in the Web View 

    }); 

か、UIWebView上のデータを更新するメソッドを作成し、使用してバックグラウンドスレッドからそれを呼び出すことができます:あなたはこのようにそれを行うことができます正しいスレッドからのUIWebView。

これが役に立ちます。

+0

いいえ動作しません!私はすでに試してみましたが、メインキューのWebビューロードを実行すると、ブロック実行はアプリがフォアグラウンドに戻るまで停止します(ただちに開始しますが、遅すぎます...) –

+0

私つまり、コードを2つに分割する必要があるということです。 1つは、サーバーからデータを取得します(私はあなたがいくつかのHTMLとjavascriptを受け取ることを期待していると信じています)、もう1つは取り出したデータを 'UIWebView'にロードします。最初の部分はバックグラウンドスレッドから呼び出され、ユーザインタフェースをブロックしないようにする必要があります。そして、データを取得したら、メインスレッドの 'UIWebView'を更新して、ビューが更新されるようにします。これを考慮すると、 '[myWebview loadRequest:request];を使用するとおそらくうまくいかず、あなたのウェブビューを更新する別の方法があるはずです。 –

+0

私は悲しげに分けることができません...私がダウンロードしたjavascriptがダウンロードをトリガーしますので、Webビューでそれらを実行する必要があります。 –

関連する問題