未调用iOS 9 UIApplicationDidBecomeActiveNotification回调

时间:2015-08-03 11:18:57

标签: ios nsnotificationcenter uiapplication ios9

在iOS 9中,以下用于检测通知的代码不会触发选择器方法。在以前的版本(例如8.4)中它运行正常。有谁知道为什么?

[[NSNotificationCenter defaultCenter]addObserver:self
                                        selector:@selector(yourMethod)
                                            name:UIApplicationDidBecomeActiveNotification
                                          object:nil];

- (void)yourMethod {NSLog(@"aaaaaaa");}

6 个答案:

答案 0 :(得分:6)

以下链接可能有助于解决您的问题。

Foundation Release Notes for OS X v10.11

使用" addObserverForName "而不是" addObserver"。

    [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification
                                                      object:nil
                                                       queue:[NSOperationQueue mainQueue]
                                                  usingBlock:^(NSNotification * Nonnull note) {
                                                      [self yourMethod];
                                                  }];

这将是有效的。

答案 1 :(得分:3)

我讨厌同样的问题,对我而言,它将addObserver代码移动到awakeFromNib。另一种解决方案可能是向addObserver添加延迟,如下例所示:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];
});

答案 2 :(得分:2)

在进行一些测试时,我注意到通知实际上是触发的,虽然不是在发布时(或者至少太早而无法被观察者捕获)(仅在模拟器上)。 / p>

尝试向上和向下拉动通知中心或上下控制中心,您将看到实际上会调用您的方法。

我建议您在应用启动时在iOS 9上手动调用您的方法吗?

在真实设备上,该方法就像在iOS 8上一样调用。

修改:经过进一步调查后,似乎每次都会在设备上触发通知:/

答案 3 :(得分:0)

我也遇到了这个问题,并且延迟添加观察者并没有在我的情况下解决它。通过直接在AppDelegate中调用方法并从主队列中调用来摆脱它,没有延迟。

夫特:

func applicationDidBecomeActive(application: UIApplication) {

    dispatch_async(dispatch_get_main_queue()) { () -> Void in

        yourMethod()
    }   
}

答案 4 :(得分:0)

我只在运行iOS 9.0及更高版本的真实设备上遇到完全相同的问题。

我最终定义了自己的通知:
(此定义应全局可用,constants.h或类似)

#define myAppBecameActiveNotif @"Tito, your app is active"

然后,在AppDelegate实现(大多数情况下是AppDelegate.m)中,实现applicationDidBecomeActive委托方法:

- (void)applicationDidBecomeActive:(UIApplication *)application {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:myAppBecameActiveNotif
                                                            object:nil];
    });
}

(只需稍稍延迟发送通知,让您的组件生效)

现在,在课堂上,您希望通知应用程序变为活动状态

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(whatToDoWhenAppActive:)
                                                 name:myAppBecameActiveNotif
                                               object:nil];

现在工作得很好。你会发现你感觉不到500毫秒的延迟...

答案 5 :(得分:-1)

我做那样的通知注册。

[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yourMethod:) name:UIApplicationDidBecomeActiveNotification object:nil];

像这样编写方法。

- (void)yourMethod:(NSNotification *)notification
  {
     NSLog(@"aaaaaaa");
  }

您还需要在AppDelegate.m中使用NSLog并查看登录控制台。

-(void)applicationDidBecomeActive:(UIApplication *)application{
      NSLog(@"applicationDidBecomeActive");
 }