2015-08-03 173 views
6

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

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

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

由于iOS 9处于测试阶段,你可能会在Apple的开发者论坛上得到更好的回应。 –

回答

-1

我这样做通知寄存器。

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

这样的写入方法。

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

此外,您还需要NSLog登录AppDelegate.m并查看登录控制台。

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

这没有什么比重申问题 –

+0

你可以说种。但实际上告诉他/她如何进行调查。 –

2

虽然做了一些测试,我注意到,该通知实际上是触发,尽管不是在启动时(或至少太早被你观察捕获)(在模拟器上唯一)。

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

我建议可能会在您的应用程序启动时在iOS 9上手动调用您的方法?

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

编辑:在进一步调查后,似乎该通知实际上没有触发装置每次:/

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]; 
}); 
0

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

斯威夫特:

func applicationDidBecomeActive(application: UIApplication) { 

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

     yourMethod() 
    } 
} 
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]; 
                }]; 

这将是工作。

+0

如果你想使用'addObserver:',你的应用必须有一些使用'NSNotificationCenter'的UI内容。 – jypark

+0

你是对的,非常感谢你。 – Jerome

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