12

Apple が wi​​dgetPerformUpdateWithCompletionHandler: について述べていることによると、iOS ウィジェットは、ウィジェットが表示されていないときにもコンテンツを更新できます。

私のデバッグセッションで、通知センターのビューが消えるたびにtodayViewControllerの割り当てが解除されることに気付いたので、私の質問は次のとおりです。

割り当てが解除された場合、todayViewController はどのように widgetPerfomrUpdateWithComplationHandler に応答できますか?

ウィジェットが表示されていない場合でも、1時間ごとにコンテンツを更新する必要があります。どうすればそれを行うことができますか?

iOS ウィジェットのライフサイクルはどうなっていますか?

助けてください:)ありがとう

4

3 に答える 3

18

ウィジェットのライフサイクルは、iOS 自体によって管理されます。

バックグラウンドに移行すると、システムは今日のウィジェットのスナップショットを取得します。システムはバックグラウンド フェッチ (ウィジェットのバックグラウンド ライフ サイクル) を管理し、widgetPerfomrUpdateWithComplationHandler:可能な限りウィジェット データを更新するために を呼び出し、毎回スナップショットを取得します。もう一度開くと、最新のスナップショットが最初に読み込まれ、その後にライブ データが読み込まれます。


ウィジェットコンテンツの更新

コンテンツの更新

Today 拡張ポイントは、ウィジェットの状態を管理し、そのコンテンツの更新を処理するための API を提供します (この API については、通知センター フレームワーク リファレンスを参照してください)。Today API にはプラットフォーム固有の違いがいくつかありますが、両方のプラットフォームでサポートされる機能はほとんど同じです。

ウィジェットを最新の状態に保つために、システムはウィジェットのビューのスナップショットをときどきキャプチャします。ウィジェットが再び表示されると、システムがビューのライブ バージョンに置き換えるまで、最新のスナップショットが表示されます。

スナップショットが取得される前にウィジェットの状態を更新するには、NCWidgetProviding プロトコルに準拠していることを確認してください。ウィジェットが widgetPerformUpdateWithCompletionHandler: 呼び出しを受け取ると、ウィジェットのビューを最新のコンテンツで更新し、次の定数のいずれかを使用して完了ハンドラーを呼び出し、更新の結果を記述します。

NCUpdateResultNewData— 新しいコンテンツでは、ビューを再描画する必要がありました

NCUpdateResultNoData- ウィジェットを更新する必要はありません

NCUpdateResultFailed— 更新プロセス中にエラーが発生しました

今日のウィジェットを参照


通知センターのデータ更新

通知センター

ノート

widgetPerformUpdateWithCompletionHandler: のスケジュールと使用目的は、すべてのデータ/モデル更新ロジックの便利なホームとして意図されています。実装されている場合、システムは、通知センターが表示されているときとバックグラウンドの両方で、適切なタイミングでウィジェットを呼び出して状態を更新します。バックグラウンド更新を有効にするには、実装が必要です。ウィジェットは、可能な限りメイン スレッドから非同期に更新する作業を実行することが期待されます。作業が完了すると、ウィジェットは引数ブロックを呼び出し、適切な NCUpdateResult を渡す必要があります。ウィジェットは、この操作の結果に対する viewWillAppear: からの戻りをブロックしてはなりません。代わりに、最後の viewWillDisappear: からのビューの状態と一致させるために、ウィジェットは viewWillAppear: でキャッシュされた状態をロードする必要があります。

リファレンスiOS 8.1 通知センター


ウィジェットのライフサイクル

ウィジェットのライフサイクル

参考:アプリ拡張機能のライフサイクル

于 2015-02-19T11:08:52.130 に答える
4

iOS8 リリースノート

注 widgetPerformUpdateWithCompletionHandler: のスケジュールと使用目的は、すべてのデータ/モデル更新ロジックの便利なホームとして意図されています。実装されている場合、システムは、通知センターが表示されているときとバックグラウンドの両方で、適切なタイミングでウィジェットを呼び出して状態を更新します。バックグラウンド更新を有効にするには、実装が必要です。ウィジェットは、可能な限りメイン スレッドから非同期に更新する作業を実行することが期待されます。作業が完了すると、ウィジェットは引数ブロックを呼び出し、適切な NCUpdateResult を渡す必要があります。ウィジェットは、この操作の結果に対する viewWillAppear: からの戻りをブロックしてはなりません。代わりに、最後の viewWillDisappear: からのビューの状態と一致させるために、ウィジェットは viewWillAppear: でキャッシュされた状態をロードする必要があります。

両方を実装する必要があります

  • viewDidAppear:
  • widgetPerformUpdateWithComplationHandler:

widgetPerformUpdateWithComplationHandler でデータを更新してから、NCUpdateResult で完了ブロックを呼び出します。

viewDidAppear でビューを更新します。起動イメージ (スナップショット) は、最後の viewDidDissappear のものになります。次の実行ループの最後に、新しいコンテンツが表示されます。

ドキュメントの参照については、 DigitalBrain_Devの功績によるものです。

于 2016-04-19T19:43:41.417 に答える