我的应用程序中有一个映射功能。它属于选项卡栏控制器选项卡之一。
我遇到的问题是该应用程序在启动后立即要求位置权限。在用户真正进入应用程序的地图部分之前,我不想用与位置相关的问题来打扰用户。
如果我理解正确,位置管理器在我实例化它之前不应该费心要求它。此外,一旦用户离开应用程序的该地图部分,无论是通过选择其他选项卡还是按主页按钮..I nil 位置管理器。
那么为什么这么快就要求呢?我的问题是在这种特殊情况下是否有一些特殊规则......或者它是由我有缺陷的应用程序设计引起的?
我的应用程序中有一个映射功能。它属于选项卡栏控制器选项卡之一。
我遇到的问题是该应用程序在启动后立即要求位置权限。在用户真正进入应用程序的地图部分之前,我不想用与位置相关的问题来打扰用户。
如果我理解正确,位置管理器在我实例化它之前不应该费心要求它。此外,一旦用户离开应用程序的该地图部分,无论是通过选择其他选项卡还是按主页按钮..I nil 位置管理器。
那么为什么这么快就要求呢?我的问题是在这种特殊情况下是否有一些特殊规则......或者它是由我有缺陷的应用程序设计引起的?
我会选择“流动应用程序设计”。你没有显示任何代码,所以很难说,但是 UITabBarController 一次实例化了它的所有视图控制器,所以你的 CCLocation 类可能正在用你的 TabBar 初始化。
您可以做的是:仅在-viewWillAppear
您实际使用它的视图控制器上的方法上初始化您的 CCLocation 内容。
你可以写这样的东西。
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@interface LocationController : NSObject <CLLocationManagerDelegate> {
CLLocationManager *locationManager;
CLLocation *currentLocation;
}
+ (LocationController *)sharedInstance;
- (void)start;
- (void)stop;
@property (nonatomic, strong) CLLocation *currentLocation;
@end
#import "LocationController.h"
@implementation LocationController
static LocationController *sharedInstance;
+ (LocationController *)sharedInstance {
static LocationController *sharedClient;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedClient = [[LocationController alloc] init];
});
return sharedClient;
}
-(id) init {
if (self = [super init]) {
currentLocation = [[CLLocation alloc] init];
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[self start];
}
return self;
}
- (void)start {
[locationManager startUpdatingLocation];
}
- (void)stop {
[locationManager stopUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
CLLocation *loc = [locations lastObject];
if ( abs([loc.timestamp timeIntervalSinceDate: [NSDate date]]) < 120) {
self.currentLocation = loc;
}
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@"%@", error);
}
@end
然后,每当您需要定位时,您可以执行以下操作:
[[LocationController sharedInstance] start];
你在哪里实例化CLLocationManager
?虽然在实例化选项卡栏控制器时会实例化所有视图控制器,但在您转到相关选项卡之前不会创建它们各自的视图。因此,如果您CLLocationManager
在控制器的方法之一中实例化您的init
,那么将在控制器存在时创建该位置管理器(即,当标签栏控制器被实例化时)。但是,如果您在 中实例化了位置管理器viewDidLoad
,则在单击相应的选项卡之前不应实例化它。