iOS 9中UIApplicationDidBecomeActiveNotification回调未被调用

6

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

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

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

由于iOS 9仍处于测试版阶段,您可能会在苹果的开发者论坛上获得更好的响应。 - Robotic Cat
6个回答

6

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

OS X v10.11基础框架发布说明

请使用“addObserverForName”替代“addObserver”。

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

它会工作。


如果您想使用 addObserver:,您的应用程序必须具有使用 NSNotificationCenter 的一些 UI 内容。 - jypark

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
在进行一些测试时,我注意到通知实际上已经被触发了,尽管不是在启动时(或者至少太早了,无法被您的观察器捕获)(仅在模拟器上)。尝试下拉和上拉通知中心或向上和向下控制中心,你会发现你的方法实际上会被调用。我建议在iOS 9上手动调用你的方法,当你的应用程序启动时?在真实设备上,该方法与iOS 8上的方法一样被调用。编辑:经过进一步调查,似乎并不是每次都在设备上触发通知 :/

0
我也遇到了这个问题,使用延迟添加观察者在我的情况下并没有解决它。通过直接在AppDelegate中从主队列调用该方法,并且不使用延迟,成功摆脱了这个问题。
Swift:
func applicationDidBecomeActive(application: UIApplication) {

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

        yourMethod()
    }   
}

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毫秒的延迟...


-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");
 }

这只是重申了问题,没有做更多的事情。 - Wayne
你可以说是这样的。但实际上告诉了他/她一种调查的方法。 - Danial Hussain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接