2011-01-13 48 views
0

iPhoneの場所に奇妙な問題が発生しています。それはちょうど狂っているように見えますが、再現性があるようです。私のアプリケーションでは、Core Locationを使用していくつかのユーザーアクションに関する位置データを取得します。通常は動作するようです。しかし、アプリケーションが以前のバージョン(XCodeやiTunes経由では問題ありません)のないデバイスにデプロイされたあとの最初の実行では、まったく動作しません。
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
どちらが呼び出されます。私はセルタワーの座標を取得しません。 GPSが動作している唯一の兆候は、場所データへのアクセスを許可するかどうかを尋ねるポップアップです。私がアプリケーションを終了した場合(そして、終了すると、単にバックグラウンドに移る代わりに実際に殺すことを意味する)、次回の実行時にはすべてが正常に動作するようになります。iPhoneの最初の起動時にデータが正しく動作しない

さらに詳しい情報。 私は、ユーザーが特定のアクションを行う場所の位置を取得する必要があるとして、私は次のようなアプローチを使用します。私は(kCLLocationAccuracyBestと)同じ共有CLLocationManagerオブジェクトと同じ共有デリゲートオブジェクトを使用

  • を。
  • ユーザがアクションを実行すると、私はstartUpdatingLocationに電話をかけ、基本的にタイマーのバックグラウンドスレッドを作成しますが、関連性のないものがあります。 15秒に1回ウェイクアップします
  • 受信した修正を蓄積します- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
  • バックグラウンドスレッドが起動すると、修正と時刻が確認されます。十分な修正があれば、それは待っていません。 1分の時間間隔を超えると、待機も停止します。
  • "待機しています" =何らかの方法を呼び出しています。その方法は、受信した(もしあれば)最善の修正を求め、それを処理する。また、それはstopUpdatingLocation

私はそのように明らかな欠陥が表示されません。そして、まったく同じバイナリは、通常、2回目の起動時に作業を開始します。なぜどんなアイデア?私は狂ってる?

+0

もう一度アプリを起動すると、ポップアップも表示されますか? そうでなければ、このポップアップによってトリガされる何らかの種類の競合状態がコード内に存在する可能性があります。 –

+0

私はこれを考えましたが、これは関連していないようです。 iPhoneは、アクセス許可のユーザーの反応を覚えておいて、同じ答えのいくつかの後にデフォルトとして保存します。このようなポップアップがなくても(最初の実行時)修正は得られません。 – SergGr

答えて

2

私自身が答えを見つけたようです。私のアプリケーションでは、スタートアップの準備が必要です。違いは、最初の実行時には、大きなワンタイムジョブ(ネットワーク上でいくつかの大きな同期)を行うことです。この長い作業はバックグラウンドスレッドで行われます。同じスレッドがCLLocationManagerオブジェクトの作成を含む「共通初期化」を行います。もちろん、バックグラウンドスレッドはすぐにRunLoopなしでCLLocationManagerを残して死んでしまいます。 2回目の起動では、大きな同期の必要はなく、UIスレッドで「共通の初期化」が実行されます。したがって、CLLocationManagerはメインのRunLoop上で実行されており、幸いなことに修正を提供します。

要約:CLLocationManagerオブジェクトを作成するときには、右のスレッド(またはNSRunLoop/CFRunLoop)で行うことが非常に重要です。

関連する問題