ibeacons委托仅在主控制器中调用

时间:2014-05-12 15:14:24

标签: ios objective-c ibeacon estimote

我有一个大问题。使用iOS 7.1,即使应用程序已关闭(不在后台,但完全关闭),也可以监控信标区域的进入/退出。

但是我注意到只有当信标代表在主控制器中时才有可能,而不是如果它们在其他控制器中(例如以模态方式调用)。

例如,我的应用程序是使用以下内容构建的:

appDelegate --> firstController --> secondController

如果我将beaconManager及其委托放在firstController中,它们也会在应用程序关闭时被调用,而如果我在第二个控制器中执行相同操作(显示为模态viewController),则不会调用它们(它们仅在前景或背景)。

如何解决这个问题?

2 个答案:

答案 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时我正在做的事情如下:

  • 我创建了一个实现单例模式的类,该模式充当CLLocationManager回调的委托。
  • 然后我创建一个协议,使用我想转发到特定视图控制器的委托方法
  • 我在所需的视图控制器中实现协议方法。
  • 在AppDelegate (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中我第一次实例化单例,以便CLLocationManager和UUID被注册
  • 当CLLocationManager的回调到达我的一个注册视图控制器时,我会检查我的应用程序当前是否处于活动状态,而不是相应地处理回调

    UIApplicationState state = [application applicationState];
    if (state == UIApplicationStateActive) {
    // Application is in foreground
    }