【问题标题】:CLLocationManager is alive even when not neededCLLocationManager 即使在不需要时仍然存在
【发布时间】:2013-06-02 10:14:18
【问题描述】:

我的应用中有映射功能。它属于 Tab Bar 控制器选项卡之一。

我遇到的问题是应用程序在启动后立即要求位置权限。 在用户真正进入应用程序的地图部分之前,我不想用与位置相关的问题来打扰用户。

如果我理解正确,在我实例化它之前,位置管理器不应该费心要求它。此外,一旦用户离开应用程序的该地图部分,无论是通过选择其他选项卡还是按主页按钮..I nil 位置管理器。

为什么这么快就提出要求了?我的问题是在这种特殊情况下是否有一些特殊规则......或者它是由我有缺陷的应用程序设计引起的?

【问题讨论】:

  • 在实例化 CLLocationManager 并调用 startUpdatingLocation 的行上放置一个断点。在你到达断点之前,它不应该请求许可。
  • 我认为这个问题没有任何问题。 -1er 会费心解释他的反对意见吗?而不是“偷”我辛苦赚来的积分?

标签: ios objective-c cocoa-touch cllocationmanager


【解决方案1】:

我会选择“流动应用程序设计”。你没有显示任何代码,所以很难说,但是 UITabBarController 一次实例化了它的所有视图控制器,所以你的 CCLocation 类可能正在用你的 TabBar 初始化。

您可以做的是:仅在您实际使用的 View Controller 上的 -viewWillAppear 方法上初始化您的 CCLocation 内容。

【讨论】:

    【解决方案2】:

    你可以这样写。

    h:

    #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];
    

    【讨论】:

      【解决方案3】:

      你在哪里实例化CLLocationManager?虽然在实例化选项卡栏控制器时会实例化所有视图控制器,但在您转到相关选项卡之前不会创建它们各自的视图。因此,如果您在控制器的 init 方法之一中实例化您的 CLLocationManager,则将在控制器存在时(即实例化选项卡栏控制器时)创建该位置管理器。但是,如果您在viewDidLoad 中有位置管理器的实例化,则在您单击相应的选项卡之前不应实例化它。

      【讨论】:

        猜你喜欢
        • 2014-07-31
        • 1970-01-01
        • 2019-11-11
        • 1970-01-01
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多