MOLocationHelper.m 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. //
  2. // LocationHelper.m
  3. // olclinic
  4. //
  5. // Created by hurricaner on 15/9/5.
  6. // Copyright (c) 2015年 onecloud.ltd. All rights reserved.
  7. //
  8. #import "MOLocationHelper.h"
  9. @implementation MOLocationHelper
  10. + (MOLocationHelper *)shareLocationHelper
  11. {
  12. static MOLocationHelper *instance = nil;
  13. static dispatch_once_t onceToken;
  14. dispatch_once(&onceToken, ^
  15. {
  16. instance = [[MOLocationHelper alloc] init];
  17. [instance locationManager];
  18. });
  19. return instance;
  20. }
  21. - (CLLocationManager *)locationManager
  22. {
  23. if(_locationManager == nil)
  24. {
  25. _locationManager = [[CLLocationManager alloc]init];
  26. _locationManager.delegate = self;
  27. [_locationManager requestWhenInUseAuthorization];
  28. }
  29. return _locationManager;
  30. }
  31. - (void)getLocationAndBlock:(void (^)(double, double))block
  32. {
  33. self.getLocation = block;
  34. self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
  35. self.locationManager.distanceFilter = kCLDistanceFilterNone;
  36. [self.locationManager startUpdatingLocation];
  37. }
  38. + (void)getCityNameFromLocation:(CLLocation *)location AndBlock:(void (^)(NSString *))block {
  39. CLGeocoder *geocoder = [[CLGeocoder alloc] init];
  40. [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
  41. if (error) {
  42. MOLogV(@"Geocoding error: %@", error.localizedDescription);
  43. block(@"");
  44. return;
  45. }
  46. if (placemarks.count > 0) {
  47. CLPlacemark *placemark = placemarks.firstObject;
  48. NSString *cityName = placemark.locality; // 获取城市名
  49. MOLogV(@"City Name: %@", cityName);
  50. block(cityName);
  51. // 在这里可以使用cityName做你想要的操作
  52. }
  53. }];
  54. }
  55. #pragma mark - CLLocationManagerDelegate
  56. // 地理位置发生改变时触发
  57. - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
  58. {
  59. // 停止位置更新
  60. [self.locationManager stopUpdatingLocation];
  61. CLLocation * currLocation = [locations lastObject];
  62. if (self.getLocation)
  63. {
  64. self.getLocation(currLocation.coordinate.latitude,currLocation.coordinate.longitude);
  65. self.getLocation = nil;
  66. }
  67. }
  68. // 定位失误时触发
  69. - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
  70. {
  71. // 停止位置更新
  72. [self.locationManager stopUpdatingLocation];
  73. if (self.getLocation)
  74. {
  75. self.getLocation(0,0);
  76. self.getLocation = nil;
  77. }
  78. MOLogV(@"error:%@",error);
  79. }
  80. #pragma mark - CLLocationManagerDelegate
  81. - (void)locationManagerDidChangeAuthorization:(CLLocationManager *)manager {
  82. CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
  83. // 处理授权状态变化
  84. if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusAuthorizedAlways) {
  85. // 执行你的地理位置相关逻辑
  86. MOLogV(@"Location services are authorized.");
  87. self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
  88. self.locationManager.distanceFilter = kCLDistanceFilterNone;
  89. [self.locationManager startUpdatingLocation];
  90. }
  91. else{
  92. UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"定位提示" message:@"请您在“设置”的“隐私”中开启定位服务,为您提供更多的周边服务" delegate:nil cancelButtonTitle:@"知道了" otherButtonTitles:nil, nil];
  93. [alert show];
  94. }
  95. }
  96. @end