Маркер карты iOS и текущее местоположение не отображаются

У меня есть MapViewController, который импортирует SWRevealViewController, и я, честно говоря, не кодировал эти строки ниже. Я попытался запустить приложение, но, к сожалению, карта не показывает текущее местоположение, и даже служба определения местоположения не включает телефон, даже если приложению предоставлено разрешение на доступ к GPS. Поскольку я не ожидаю разработки для iOS, мне нужен кто-то, кто посмотрит код и объяснит, чего не хватает в этом коде. Я посмотрел на аналогичный вопрос, но они кажутся прямыми даже для тех, кто изучает цель-c. Я предполагаю, что проблема с этим кодом заключается в импортированном здесь SWRevealViewController, который, я думаю, является библиотекой или чем-то, чего я не знаю.

#import "MapViewController.h"
#import "SWRevealViewController.h"

// New York
#define NY_LATITUDE 40.754445
#define NY_LONGITUDE -73.977364

// Span and distance
#define SPAN_VALUE 1.0f
#define DISTANCE 500



@interface MapViewController ()
- (void)startLocationServices;
- (void)stopLocationServices;
@end

@implementation MapViewController

@synthesize locationManager;
@synthesize gpsDisplay;
@synthesize mapk;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
- (IBAction)sendRequest:(id)sender {
        [self alertStatus:@"An assistance request has been sent, you will be contacted shortly." :@"Send assistance request" :0];
    [self performSegueWithIdentifier:@"sendRequest" sender:nil];
    
}

- (void) alertStatus:(NSString *)msg :(NSString *)title :(int) tag
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
                                                        message:msg
                                                       delegate:self
                                              cancelButtonTitle:@"Ok"
                                              otherButtonTitles:nil, nil];
    alertView.tag = tag;
    [alertView show];
}
-(void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:    (NSInteger)buttonIndex
{
    if(buttonIndex==0)
    {
        //NSLog(@"OK Clicked");
        //  [self alertStatus:@"An assistance request has been sent, you will be contacted shortly. " :@"I just had an accident" :0];
       // [self performSegueWithIdentifier:@"checkProgress" sender:nil];
        
        
    }}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self startLocationServices];
    
    if ([CLLocationManager locationServicesEnabled]) {
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        [self.locationManager startUpdatingLocation];
    } else {
        NSLog(@"Location services are not enabled");
    }
    
    // Set a timer to stop the Location services
    //[NSTimer scheduledTimerWithTimeInterval:100.0 target:self selector:@selector(stopLocationServices) userInfo:nil repeats:NO];
    
    _sidebarButton.tintColor = [UIColor colorWithWhite:0.1f alpha:0.9f];
    
    // Set the side bar button action. When it's tapped, it'll show up the sidebar.
    _sidebarButton.target = self.revealViewController;
    _sidebarButton.action = @selector(revealToggle:);
    
    // Set the gesture
    [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
//    CLLocationManager *cllocationManager = [[CLLocationManager alloc] init];
//    cllocationManager.delegate = self;
//    cllocationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
//    cllocationManager.distanceFilter = 20.0f;
//    
//    if ([CLLocationManager locationServicesEnabled])
//    {
//        [cllocationManager startUpdatingLocation];
//    }
//    else
//    {
//        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Turn On Location Services to find your location"
//                                                        message:nil delegate:nil
//                                              cancelButtonTitle:@"OK"
//                                              otherButtonTitles:nil];
//        [alert show];
//        // [alert release];
//    }
}




- (IBAction)mapChanger:(id)sender {
    
    switch (((UISegmentedControl *) sender).selectedSegmentIndex) {
        case 0:
            self.mapk.mapType = MKMapTypeStandard;
            break;
        case 1:
            self.mapk.mapType = MKMapTypeSatellite;
            break;
        case 2:
            self.mapk.mapType = MKMapTypeHybrid;
            break;
            
        default:
            break;
    }
}

- (void)startLocationServices
{
    // create the Location Manager
    if (self.locationManager == nil) {
        self.locationManager = [CLLocationManager new];
    }
    
    // settings
    [self.locationManager setDelegate:self];
    [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [self.locationManager setDistanceFilter:kCLDistanceFilterNone];
    
    // start services
    [self.locationManager startUpdatingLocation];
    self.gpsDisplay.text = @"Location Service started.";
}

- (void)stopLocationServices
{
    // stop services
    [self.locationManager stopUpdatingLocation];
    [self.locationManager setDelegate:nil];
    self.gpsDisplay.text = @"Location Services stopped.";
}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    CLLocationCoordinate2D loc = [userLocation coordinate];
    // CLLocationDistance in meters (1 meter = 3.3 feet)
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(loc, DISTANCE, DISTANCE);
    [mapView setRegion:region animated:YES];
}

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {
    NSString *coords =@"lat";
    coords = [coords stringByAppendingString:[NSString stringWithFormat:@"%f", newLocation.coordinate.latitude]];
    coords = [coords stringByAppendingString:@"lon"];
    coords = [coords stringByAppendingString:[NSString stringWithFormat:@"%f", newLocation.coordinate.longitude]];
    
    self.gpsDisplay.text = coords;
    
    MKCoordinateRegion region;
    region.center.latitude = newLocation.coordinate.latitude;
    region.center.longitude = newLocation.coordinate.longitude;
    region.span.latitudeDelta = SPAN_VALUE;
    region.span.longitudeDelta = SPAN_VALUE;
    [self.mapk setRegion:region animated:YES];
    
}

- (void)viewDidUnload {
    //[self setUpdates:nil];
    [super viewDidUnload];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


person Cockpit Aliens    schedule 07.12.2014    source источник


Ответы (2)


В iOS 8 они изменили способ запроса разрешения на определение местоположения. Вместо того, чтобы просто вызвать startUpdatingLocation, теперь вам нужно вызвать либо requestWhenInUseAuthorization, либо requestAlwaysAuthorization.

person Acey    schedule 07.12.2014
comment
Возможно, из-за этого изменения код больше не работает. Я попробую ваши предложения. Спасибо - person Cockpit Aliens; 08.12.2014

В дополнение к предыдущему ответу обратите внимание, что вы должны указать причину доступа к информации о местоположении пользователя, добавив относительный ключ (NSLocationAlwaysUsageDescription или NSLocationWhenInUseUsageDescription) в Info.plist вашего проекта.

Например:

<key>NSLocationWhenInUseUsageDescription</key>
<string>Location is required to find out jobs around you are</string>
person bl4stwave    schedule 07.12.2014