33

数日間複雑な作業を行った後、所定の間隔で発生する更新の更新プロセスについて、次のように自信を持って言えます。

  • システムコールrequestedUpdateDidBegin()
    • ここで、データが変更されたかどうかを判断できます。そうでない場合、アプリは何もする必要はありません。データが変更された場合は、次のいずれかを呼び出す必要があります。
      • reloadTimelineForComplicationすべてのデータをリセットする必要がある場合。
      • extendTimelineForComplicationコンプリケーション タイムラインの最後に新しいアイテムを追加するだけでよい場合。
    • 注: 1 日のコンプリケーションの時間予算を使いすぎた場合は、requestedUpdateBudgetExhausted()代わりにシステムが実際に呼び出すことがあります。requestedUpdateDidBegin()これがこの質問の理由です。
  • を呼び出した場合reloadTimelineForComplication、システムはgetCurrentTimelineEntryForComplication(時間旅行の設定に応じて、配列を取得する未来および過去のバリアントと共に)を呼び出します。
  • まだテストしていないため、これは推測ですが、それを呼び出すとextendTimelineForComplication、 のみが呼び出されると思いますgetTimelineEntriesForComplication(... afterDate date: NSDate ...)
  • その後、システムが呼び出さgetNextRequestedUpdateDateWithHandlerれるので、コンプリケーションが新しいアップデートを必要とするまでの時間を指定できます。

Apple のドキュメントでは、頻繁に更新を要求したり、コンプリケーション コードで処理を実行しすぎたりしないでください。そうしないと、時間予算が使い果たされ、コンプリケーションの更新が停止します。それで、私の質問は次のとおりです。いつ、どこで更新を行いますか?

コンテキストとして、私のシナリオは、1 時間に最大 2 回変化する戻りデータを含む URL です。

URL 取得コードを配置する最も明白な場所はfunc requestedUpdateDidBegin()、データを取得して保存し、変更がない場合は単に戻ることです。変更があった場合は、タイムラインを延長またはリロードします。

ただし、URL フェッチにはコストがかかる場合があります。代替案:

  • コードを電話アプリに入れ、 を付けて送信しWCSessionますが、ユーザーがそのアプリを閉じると、更新は行われなくなります。
  • プッシュ アップデートを使用しますが、これは Web アプリではないため、送信元がありません。
  • 明らかに、ユーザーが時計アプリを操作するときにすべてのデータを更新しますが、これは、ユーザーがアプリを使用するときにのみ更新されることを意味し、複雑さの必要性を否定します.

他の場所はありますか?コンプリケーションに含まれていない時計アプリの定期的な機能を使用できますか? 合併症の更新のためにデータを取得する適切な場所はどこですか?

4

2 に答える 2

3

編集: El Tea (op) がhttps://stackoverflow.com/a/32994055/630614に良い回答を投稿しました

これは興味深い質問/問題であり、私は同じことをたくさん考えていました!

ほとんどの場合、新しいコンプリケーションに取り組んでいるときは、一歩下がって、いつ本当にそれを更新したいかを確認する必要があるようです. 「カウントダウン」の合併症は、「終了日」が設定されると、将来のすべてのタイムライン エントリを一度に設定できます。NSUserDefaultsWeb サービスの現在のステータスを表示するアプリには、APNS が通過したときに関連データが保存されている可能性があります。

APNS にアクセスできない場合、iOS アプリをバックグラウンド モードで実行したくない場合、および Apple Watch から HTTP 要求を行いたくない場合は、他に 2 つのオプションが考えられます。

1)ローカル通知をスケジュールします。良い点は、Apple Watch を実行する必要がdidReceiveLocalNotificationあることですが、悪い点は、中断せずにステータスを確認しようとしているときに、ユーザーが通知を受け取ることです。

2)メソッドを介してiOS にメッセージを送信し、できるだけ速くするように設定します。sendMessage(_:replyHandler:errorHandler:)reloadTimelineForComplicationnilreplyHandler

アクティブで実行中の WatchKit 拡張機能からこのメソッドを呼び出すと、対応する iOS アプリがバックグラウンドで起動され、到達可能になります。

iOS アプリは、必要なネットワーク リクエストを実行し、情報を保存したり、Apple Watch にプッシュしたりできます。session.didReceive...残念ながら、watch 拡張機能は実行するまで呼び出されないと思いますが、次の への呼び出しでデータにアクセスできますrequestedUpdateDidBegin

私が言ったように、私はこれと同じことに非常に興味があるので、いくつかの考えを投稿してください.

于 2015-09-28T16:40:48.323 に答える