非常に単純な機能であるべきだと思うものを実装するのに苦労しています。ユーザーの場所を別の緯度/経度座標のセットと比較し、その場所から「近い」か「遠い」かをユーザーに知らせるアラートを表示するボタンがあります。これは、アプリがフォアグラウンドにある場合にうまく機能します。
ただし、アプリがバックグラウンドに送信されると、locationManager はユーザーの位置情報の更新を停止します。この場合、ユーザーがアプリを再起動して「場所の比較ボタン」を押したときに、アプリがユーザーの新しい座標を正しく取得できないようです。
バックグラウンド モードに受信位置情報の更新を追加すると機能するようですが、これによりバッテリーが消耗し、Apple によって拒否される可能性があることはわかっています。
私が本当に望んでいるのは、ユーザーと他の設定された緯度/経度座標との間の距離を計算する前に、ボタンが緯度/経度座標の正確なセットを待機できるようにすることだけです。これが私がこれまでに持っているものです:
場所ボタンは次のことを行います。
-(void) locationButton {
NSString *userLatitude =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate
getUserLatitude];
NSString *userLongitude =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate
getUserLongitude];
NSString *placeLatitude = [[NSUserDefaults standardUserDefaults]
stringForKey:@"savedLatitude"];
NSString *placeLongitude = [[NSUserDefaults standardUserDefaults]
stringForKey:@"savedLongitude"];
NSString *distanceURL = [NSString stringWithFormat:@"http://www.website.com/page.php?
lat1=%@&lon1=%@&lat2=%@&lon2=%@",userLatitude, userLongitude, placeLatitude,
placeLongitude];
NSData *distanceURLResult = [NSData dataWithContentsOfURL:[NSURL
URLWithString:distanceURL]];
NSString *distanceInFeet = [[NSString alloc] initWithData:distanceURLResult
encoding:NSUTF8StringEncoding];
if ([distanceInFeet isEqualToString:@"1"]) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"You're Near!"
message:@"" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
return;
}
if ([distanceInFeet isEqualToString:@"0"]) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"You're Far!" message:@""
delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
return;
}
}
locationButton メソッドの最初の数行は、アプリ デリゲートから userLatitude と userLongitude を取得します。
- (NSString *)getUserCoordinates {
NSString *userCoordinates = [NSString stringWithFormat:@"latitude: %f longitude: %f",
locationManager.location.coordinate.latitude,
locationManager.location.coordinate.longitude];
locationManager = [[CLLocationManager alloc] init];
locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
[locationManager startUpdatingLocation];
return userCoordinates;
}
- (NSString *)getUserLatitude {
NSString *userLatitude = [NSString stringWithFormat:@"%f",
locationManager.location.coordinate.latitude];
return userLatitude;
}
- (NSString *)getUserLongitude {
NSString *userLongitude = [NSString stringWithFormat:@"%f",
locationManager.location.coordinate.longitude];
return userLongitude;
}