iOS Map Marker and current location not showing

860 views Asked by At

I have a MapViewController that imports SWRevealViewController and I honestly didn't code this lines below. I tried to run the app but unfortunately the map is not showing the current location and even the location service does not get turn on the phone even the app is granted permission to access GPS. Since i'm not a expect in iOS development I need someone to look the code and explain what is missing in this code. I looked at similar question but they seem straight forward even for someone learning objective-c. The problem with this code i assume is the SWRevealViewController imported here, which I think is a library or something i don't know.

#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.
}

2

There are 2 answers

1
Acey On BEST ANSWER

On iOS 8, they changed how you ask for location permission. Instead of just being able to call startUpdatingLocation you need to now call either requestWhenInUseAuthorization or requestAlwaysAuthorization.

0
bl4stwave On

In addition to the previous answer, note that you have to specify the reason for accessing the user's location information adding the relative key (NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription) to your project's Info.plist

for example:

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