2

そこで、didEnterRegion に関連するコードについて質問しましたが、具体的すぎたのかもしれません。したがって、特にアプリがバックグラウンドにある場合に、リージョン モニタリングのより一般的な用語でメソッド呼び出しの順序を明確にするよう誰かに依頼できますか。

私の理解は次のとおりです。

  1. アプリは startMonitoringForRegion を呼び出してリージョンを登録します。
  2. ユーザーがホームボタンをタップするかデバイスをロックすると、アプリはバックグラウンドに入ります。
  3. デバイスの場所は、アプリとは別に OS レベルで監視されます。ユーザーの現在の場所を確認するためにアプリが OS によって起動されることはありません。
  4. ユーザーが境界を越えてリージョンに入ると、OS は最初にリージョンを登録したアプリを探し、そのアプリを起動します。
  5. アプリはバックグラウンドで起動され (didFinishLaunchingWithOptions: は呼び出されません)、CLLocationManager デリゲートがセットアップされ、didEnterRegion デリゲート メソッドが呼び出されます。
  6. 私の場合、これはすぐに表示される UILocalNotification を設定します (バナーは、たとえば別のアプリが使用されている場合はホーム画面に表示され、電話が休止状態の場合はロック画面に表示されます)。
  7. ユーザーがロック画面でスワイプするか、バナーをタップして通知を操作すると、アプリが起動され、appWillEnterForeground/appWillBecomeActive が呼び出され、アプリのデリゲート didRecieveLocalNotification: メソッドが実装されている場合は呼び出されます。

これは私の理解ですが、アプリがバックグラウンドにある場合は UILocalNotification が起動されないため、おそらく間違っています。誰かがどのビットが間違っているかを明確にできますか?

4

1 に答える 1

0

さらにテストを重ねた結果、コードに問題はなく、実際には Apple のリージョン モニタリングの実装が貧弱であるように見えるという結論に達しました。場所の大幅な変更の監視よりもわずかに優れているように見えますが、依然として Wi-Fi ネットワークと携帯電話基地局の変更に依存しています。英国の主要都市内でさえ、didEnterRegion がトリガーされたとしても、幅 1 マイルの領域に最大 1000 メートルまで到達するまでトリガーされませんでした。これは、Xcode を使用してテストし、場所を強制するときに毎回機能する理由を説明しています。

これまでに思いついた唯一の回避策は、ユーザーの位置が更新されるたびに残りの距離を計算し、これが地域の半径/2 より小さい場合に didEnterRegion デリゲート メソッドを手動で呼び出すことです。これは、境界に 10m 以上入ったときに Apples コードによって自動的に行われるはずですが、上記の理由から信頼できないことがわかりました。

ただし、アプリがバックグラウンドにある間は GPS のより高い精度を使用して定期的な更新を取得できず、これはアプリがバックグラウンドにある場合にのみ問題になるため、実際にはまったく解決策ではありません. :o(

于 2013-11-05T09:42:57.680 に答える