2015-08-03 175 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毫秒的延遲...