-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSMLocationManager.m
More file actions
122 lines (96 loc) · 3.23 KB
/
SMLocationManager.m
File metadata and controls
122 lines (96 loc) · 3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//
// SMLocationManager.m
// TestMap
//
// Created by Ivan Pavlovic on 11/1/12.
// Copyright (C) 2013 City of Copenhagen. All rights reserved.
//
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at
// http://mozilla.org/MPL/2.0/.
//
#import "SMLocationManager.h"
#import <CoreLocation/CoreLocation.h>
@implementation SMLocationManager
@synthesize hasValidLocation, lastValidLocation, locationServicesEnabled;
+ (SMLocationManager *)instance {
static SMLocationManager *instance;
if (instance == nil) {
instance = [[SMLocationManager alloc] init];
}
return instance;
}
- (id)init {
self = [super init];
if (self != nil)
{
hasValidLocation = NO;
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationServicesEnabled = NO;
[locationManager requestAlwaysAuthorization];
}
return self;
}
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
if (status == kCLAuthorizationStatusAuthorizedAlways) {
[locationManager startUpdatingLocation];
[locationManager startMonitoringSignificantLocationChanges];
locationServicesEnabled = YES;
}
}
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
CLLocation *lastLocation = locations.lastObject;
hasValidLocation = NO;
if (!signbit(lastLocation.horizontalAccuracy)) {
hasValidLocation = YES;
lastValidLocation = lastLocation;
}
[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshPosition" object:self userInfo:@{@"locations" : locations}];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"didFailWithError");
if ([error domain] == kCLErrorDomain)
{
switch ([error code])
{
case kCLErrorDenied:
[locationManager stopUpdatingLocation];
locationServicesEnabled = NO;
NSLog(@"Location services denied!");
break;
case kCLErrorLocationUnknown:
NSLog(@"Location unknown!");
break;
default:
NSLog(@"Location error: %@", error.localizedDescription);
}
}
}
#pragma mark - location service
- (void)start {
if (locationManager != nil) {
[locationManager requestAlwaysAuthorization];
[locationManager startUpdatingLocation];
[locationManager startMonitoringSignificantLocationChanges];
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
}
}
- (void)idle {
if (locationManager != nil) {
[locationManager requestAlwaysAuthorization];
[locationManager startUpdatingLocation];
[locationManager startMonitoringSignificantLocationChanges];
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
}
}
- (void)stop {
if (locationManager != nil) {
[locationManager stopUpdatingLocation];
[locationManager stopMonitoringSignificantLocationChanges];
}
}
@end