让用户位置不起作用?

时间:2015-05-25 08:46:51

标签: ios mapkit cllocationmanager

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

在本教程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"];

        }


    }];

现在我的问题是它不会进入阻塞内部。所以我得到了" returnAddress" as(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];
        }


    }];


  }

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

4 个答案:

答案 0 :(得分:1)

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

您可以在这里下载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

答案 1 :(得分:0)

转到iOS模拟器 - &gt;调试 - &gt;位置 - &gt;自定义位置...并输入您的长/纬度坐标。

答案 2 :(得分:0)

在模拟器中无法获得实际的基于GPS的数据,所以你需要模拟你的lat-long,你可以通过

来设置
Debug -> Location -> Custom Location

并在那里设置您的值。 enter image description here

答案 3 :(得分:0)

可能您正在模拟模拟器中的位置。在xCode的控制台面板中有一个箭头按钮。单击该按钮并选择“不模拟位置”。有关参考,请参阅图像。enter image description here

如果这不能解决问题,请运行该应用程序。进入模拟器的“调试”菜单,然后选择“自定义位置”选项,如图所示。 enter image description here