我有一个大问题。使用iOS 7.1,即使应用程序已关闭(不在后台,但完全关闭),也可以监控信标区域的进入/退出。
但是我注意到只有当信标代表在主控制器中时才有可能,而不是如果它们在其他控制器中(例如以模态方式调用)。
例如,我的应用程序是使用以下内容构建的:
appDelegate --> firstController --> secondController
如果我将beaconManager及其委托放在firstController中,它们也会在应用程序关闭时被调用,而如果我在第二个控制器中执行相同操作(显示为模态viewController),则不会调用它们(它们仅在前景或背景)。
如何解决这个问题?
答案 0 :(得分:0)
解决此问题的常用方法是将AppDelegate专门用作CLLocationManager委托。在AppDelegate的回调方法中,您可以检查在任何给定时间哪个ViewController(如果有)处于活动状态,并根据需要从回调方法调用该ViewController。
为此,您必须在AppDelegate上为每个使用CoreLocation服务的ViewController创建一个属性:
@interface MyAppDelegate : UIResponder <CLLocationManagerDelegate>
@property (strong, nonatomic) FirstViewController *firstViewController;
@property (strong, nonatomic) SecondViewController *secondViewController;
@end
然后在ViewController加载时设置相应的属性。像这样:
- (void)viewDidLoad
{
[super viewDidLoad];
MyAppDelegate *appDelegate = (MyAppDelegate *) [[UIApplication sharedApplication] delegate];
appDelegate.firstViewController = self;
...
}
完成此操作后,您可以将您的回调仅在MyAppDelegate中注册,但将其传递给各个ViewControllers,如下所示:
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
if (self.firstViewController != Nil) {
[self locationManager:manager didEnterRegion:region];
}
}
答案 1 :(得分:0)
处理CLLocationManager时我正在做的事情如下:
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中我第一次实例化单例,以便CLLocationManager和UUID被注册当CLLocationManager的回调到达我的一个注册视图控制器时,我会检查我的应用程序当前是否处于活动状态,而不是相应地处理回调
UIApplicationState state = [application applicationState];
if (state == UIApplicationStateActive) {
// Application is in foreground
}