12

ユーザーの場所を初期化して更新する非常に単純なアプリの例があります..デバイスでは、1秒ごとに別のコールバックの場所が正常にスローされますが、デバイス(iOS7を実行しているiPhone)ではメソッドが1回呼び出され、不思議なことに停止します...

//Setup Location Manager in ViewDidLoad
locationManager = [[CLLocationManager alloc] init];
[locationManager setDistanceFilter:kCLDistanceFilterNone];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDelegate:self];
[locationManager startUpdatingLocation];

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
     NSLog(@"location services not turned on");
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
     NSLog(@"loactions %@", locations);
}

-(void)locationManager:(CLLocationManager *)manager
   didUpdateToLocation:(CLLocation *)newLocation
          fromLocation:(CLLocation *)oldLocation
{

    NSLog(@"new location %f, and old %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);
}

iOS6 では、このアプリは完全に機能し、デバイスの位置情報を継続的に更新しました。iOS7 から何が変わったのでしょうか?

4

1 に答える 1

12

ここにはいくつかのことがあります:

1-プロパティがどこにも表示されません:pausesLocationUpdatesAutomatically。このプロパティのデフォルトは [はい] です。これは、以下の activityType (#2 を参照) によっては、GPS が更新を一時停止することを意味し、これが更新を取得できない理由である可能性があります。アルゴリズムは Apple だけが知っているブラック ボックスであり、iOS6 と iOS7 の間で何らかの形で変更された可能性があります。pausesLocationUpdatesAutomatically を NO に設定すると、バッテリーに影響を与える可能性があります。

2- アプリケーションに応じて activityType を設定する必要があります。デフォルトは CLActivityTypeOther で、これが GPS アルゴリズムと上記の #1 にどのように影響するかはわかりません。したがって、アプリを最初にテストするために、 activityType を適切に設定し、pausesLocationUpdatesAutomatically を No に変更します。私のテストでは、約 1 秒ごとに一貫して更新を取得します (一晩でテストしました)。

3- 位置更新のテストには移動が必要です。より良い結果を得るために、設定した activityType をテストに使用します。つまり、 activityType が CLActivityTypeFitness の場合、歩き回ってテストします。

4- locationManager didUpdateToLocation fromLocation は iOS7 で廃止されました。さらに、locationManager didUpdateLocations が実装されている場合、前者は呼び出されません。したがって、上記の場合、 locationManager didUpdateToLocation fromLocation は呼び出されていません。

5- kCLLocationAccuracyBestForNavigation と kCLLocationAccuracyBest の間に実際のバッテリー使用量の違いはありません。一方、kCLLocationAccuracyBestForNavigation は最高速度の GPS を使用し、さらに加速度計データと組み合わせます。

したがって、まず activityType を設定し、pausesLocationUpdatesAutomatically を NO に設定し、desiredAccuracy を kCLLocationAccuracyBestForNavigation に変更します。継続的な更新を取得したら、pausesLocationUpdatesAutomatically を Yes に設定し、コードを操作して同じアプリの使いやすさを実現しようとします。

お役に立てれば

于 2014-01-13T12:50:38.050 に答える