gpt4 book ai didi

ios - 获取用户位置不起作用?

转载 作者:行者123 更新时间:2023-11-29 02:00:33 25 4
gpt4 key购买 nike

我是 MapView 主题的新手。现在我正在处理 map View 。我正在获取旧金山位置的经度和纬度值。我正在模拟器中进行测试。它没有显示当前位置的经度和纬度值.

借助本教程 http://www.creativeworkline.com/2014/12/core-location-manager-ios-8-fetching-location-background/ 我正在开发应用程序。

在 AppDelegate 文件中我这样写了下面的代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

UIAlertView * alert;

//We have to make sure that the Background App Refresh is enable for the Location updates to work in the background.
if([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusDenied){

alert = [[UIAlertView alloc]initWithTitle:@""
message:@"The app doesn't work without the Background App Refresh enabled. To turn it on, go to Settings > General > Background App Refresh"
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil, nil];
[alert show];

}else if([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusRestricted){

alert = [[UIAlertView alloc]initWithTitle:@""
message:@"The functions of this app are limited because the Background App Refresh is disable."
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil, nil];
[alert show];

} else{

self.locationTracker = [[LocationTracker alloc]init];
[self.locationTracker startLocationTracking];

//Send the best location to server every 60 seconds
//You may adjust the time interval depends on the need of your app.
NSTimeInterval time = 60.0;
self.locationUpdateTimer =
[NSTimer scheduledTimerWithTimeInterval:time
target:self
selector:@selector(updateLocation)
userInfo:nil
repeats:YES];
}

return YES;
}

我在我的 ViewController 中导入了 Location Tracker 类

然后我编写了以下代码来获取位置名称和地址

 CLGeocoder *geoCoder = [[CLGeocoder alloc]init];
__block NSString *returnAddress = nil;

[geoCoder reverseGeocodeLocation:self.appDelgate.locationTracker.myLastLocation_ completionHandler:^(NSArray *placemarks, NSError *error) {

CLPlacemark *placemark = [placemarks lastObject];

if (placemark)
{
returnAddress = [NSString stringWithFormat:@"%@ %@",placemark.subLocality,placemark.subAdministrativeArea];
[[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithString:returnAddress] forKey:@"address"];

}


}];

现在我的问题是它没有进入 block 内。所以我得到的“returnAddress”为(null)。

虽然没来,我还是这么写的

- (void)updateLocationToServer {

NSLog(@"updateLocationToServer");

// Find the best location from the array based on accuracy
NSMutableDictionary * myBestLocation = [[NSMutableDictionary alloc]init];

for(int i=0;i<self.shareModel.myLocationArray.count;i++){
NSMutableDictionary * currentLocation = [self.shareModel.myLocationArray objectAtIndex:i];

if(i==0)
myBestLocation = currentLocation;
else{
if([[currentLocation objectForKey:ACCURACY]floatValue]<=[[myBestLocation objectForKey:ACCURACY]floatValue]){
myBestLocation = currentLocation;
}
}
}
NSLog(@"My Best location:%@",myBestLocation);

NSLog(@"latitude %@",[myBestLocation valueForKey:@"latitude"]);

NSLog(@"longitude %@",[myBestLocation valueForKey:@"longitude"]);

self.DICT=[NSDictionary dictionaryWithDictionary:myBestLocation];

//If the array is 0, get the last location
//Sometimes due to network issue or unknown reason, you could not get the location during that period, the best you can do is sending the last known location to the server
if(self.shareModel.myLocationArray.count==0)
{
NSLog(@"Unable to get location, use the last known location");

self.myLocation=self.myLastLocation;
self.myLocationAccuracy=self.myLastLocationAccuracy;

}else{
CLLocationCoordinate2D theBestLocation;
theBestLocation.latitude =[[myBestLocation objectForKey:LATITUDE]floatValue];
theBestLocation.longitude =[[myBestLocation objectForKey:LONGITUDE]floatValue];
self.myLocation=theBestLocation;
self.myLocationAccuracy =[[myBestLocation objectForKey:ACCURACY]floatValue];
}

NSLog(@"Send to Server: Latitude(%f) Longitude(%f) Accuracy(%f)",self.myLocation.latitude, self.myLocation.longitude,self.myLocationAccuracy);

//TODO: Your code to send the self.myLocation and self.myLocationAccuracy to your server

//After sending the location to the server successful, remember to clear the current array with the following code. It is to make sure that you clear up old location in the array and add the new locations from locationManager
[self.shareModel.myLocationArray removeAllObjects];
self.shareModel.myLocationArray = nil;
self.shareModel.myLocationArray = [[NSMutableArray alloc]init];

CLGeocoder *geoCoder = [[CLGeocoder alloc]init];
__block NSString *returnAddress = nil;
self.locationActual = [[CLLocation alloc]initWithLatitude:[[myBestLocation objectForKey:LATITUDE]floatValue] longitude:[[myBestLocation objectForKey:LONGITUDE]floatValue]];

//CLGeocoder *geoCoder = [[CLGeocoder alloc]init];
// __block NSString *returnAddress = nil;

CLLocation *locloc = [[CLLocation alloc] initWithLatitude:[[myBestLocation objectForKey:LATITUDE]floatValue] longitude:[[myBestLocation objectForKey:LONGITUDE]floatValue]];

[geoCoder reverseGeocodeLocation:locloc completionHandler:^(NSArray *placemarks, NSError *error) {

CLPlacemark *placemark = [placemarks lastObject];

if (placemark)
{
returnAddress = [NSString stringWithFormat:@"%@ %@",placemark.subLocality,placemark.subAdministrativeArea];
//[[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithString:returnAddress] forKey:@"address"];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" message:returnAddress delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alertView show];
}


}];


}

我在这里犯了什么错误。任何人都可以帮助消除这种困惑。提前致谢。

最佳答案

您确定正在使用完成 block 后的返回地址吗?我已经使用了上面的代码并且它工作正常。

在这里您可以下载sample code

 CLGeocoder *geoCoder = [[CLGeocoder alloc]init];
__block NSString *returnAddress = nil;

CLLocation *locloc = [[CLLocation alloc] initWithLatitude:12.92243 longitude:80.23893];

[geoCoder reverseGeocodeLocation:locloc completionHandler:^(NSArray *placemarks, NSError *error) {

CLPlacemark *placemark = [placemarks lastObject];

if (placemark)
{
returnAddress = [NSString stringWithFormat:@"%@ %@",placemark.subLocality,placemark.subAdministrativeArea];
//[[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithString:returnAddress] forKey:@"address"];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" message:returnAddress delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alertView show];
}


}];


//If you try to access retunAddress here you will get nil.

输出

enter image description here

关于ios - 获取用户位置不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30434355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com