2012-04-24 497 views
18

我的應用程序委託方法applicationDidBecomeActive:在第一次啓動應用程序時被調用兩次。我有一部分代碼,我只想執行一次&,我已投入applicationDidBecomeActive:applicationDidBecomeActive被調用兩次

我該怎麼辦?

+2

沒有堆棧跟蹤看,當你設置applicationDidBecomeActive斷點像什麼:?兩次通話都完全一樣嗎?如果不是的話(那不應該是),那麼這會導致你的問題。 – 2012-04-25 01:28:33

回答

35

我得到了問題。我正在使用位置服務。在點擊位置服務警報的「確定」後第一次啓動時,我的applicationDidBecomeActive被再次調用一次,這是正常的iOS行爲。

+0

我的應用程序每次啓動時都需要進行身份驗證。使用此位置警報時,用戶需要在彈出警報後立即鍵入密碼。我需要避免這種情況發生。 – 2015-04-22 10:04:06

+0

@LocPham:我的建議是在應用程序委託實現文件中保存一個實例變量,每當調用applicationDidBecomeActive時增量。當此變量的值大於1時,請勿執行您的登錄警報代碼。不要忘記重置它。此外,這個建議純粹是基於你的需求而不看你的代碼。也可能是更好的方法。 – Abhinav 2015-05-05 10:19:52

0

你有沒有可能在Interface Builder和你的AppDelegate代碼中創建了你的類的實例?

+0

檢查一下NSLog(@「%x」,(int)self);在該代表中,確保它是相同的實例... – 2012-04-24 19:37:39

+0

即使是這種情況,應用程序對象本身也只能有一個代理,並且只會發送一次消息。 – 2012-04-24 19:43:41

+0

@Grady:有指針的格式說明符:'NSLog(@「%p」,self);' – 2012-04-24 19:47:48

0

如果您想要只調用一次,當應用程序啓動代碼,然後用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

代替。

否則,applicationDidBecomeActive將在您的應用程序再次變爲活動狀態時被調用,因此,這不僅僅意味着您的情況是兩次,而且每次切換到另一個時切換回您的應用程序。

+0

在應用程序之間切換很好。我也希望這段代碼能夠被執行。但在第一次發射時,它被稱爲兩次。 – Abhinav 2012-04-24 20:32:11

1

我不知道這是否會有所幫助,但是我對於一個完全不使用位置服務的簡單應用程序只是有同樣的問題,我發現這是一種錯覺。看看我得到的日誌消息:

2012-12-22 10:47:45.329 Bizarro[10416:907] start applicationDidBecomeActive: 
2012-12-22 10:47:45.333 Bizarro[10416:907] end applicationDidBecomeActive: 
2012-12-22 10:47:45.329 Bizarro[10416:907] start applicationDidBecomeActive: 
2012-12-22 10:47:45.333 Bizarro[10416:907] end applicationDidBecomeActive: 

仔細看看。看看。第一條和第三條消息有相同的時間。第二條和第四條消息有相同的時間。他們是相同的信息!這是一個Xcode錯誤;它與我的代碼無關。 Xcode兩次報告相同的日誌消息。

就我而言,我可以通過關閉「正在運行的所有行爲 - >生成輸出」來阻止此操作。

9

這是由於位置或推送通知警報。

本機位置/推送通知被解除後,將調用applicationDidBecomeActive。

+2

我們如何正確區分「真實」applicationDidBecomeActive:當我們的應用程序實際進入背景時,由於位置警報而強行進入後臺? – 2015-04-22 10:01:20

+0

我的應用程序每次啓動時都需要進行身份驗證。使用此位置警報時,用戶需要在彈出警報後立即鍵入密碼。我需要避免這種情況發生。 – 2015-04-22 10:03:35

2

使用Xcode 6可能會發生一個新的原因:當您在可調整大小的模擬器中啓動應用程序時,applicationDidBecomeActive:將被調用兩次。它使用默認大小類啓動應用程序,然後應用您上次使用的大小 - 即使您使用的是默認大小。無論何時應用更改大小類,applicationDidBecomeActive:都會被調用。

7

如果您只想在應用程序變爲活動狀態時調用您的代碼,請嘗試使用兩種方法調用它。 1. didFinishLaunchingWithOptions 2. applicationWillEnterForeground

而不是隻從applicationDidBecomeActive調用它。

+1

這應該是被接受的答案。 – Darko 2017-05-09 14:45:01

0

什麼:在applicationDidBecomeActive

  • 遞減

    • 增量在關閉時觸發另一個applicationDidBecomeActive權限請求或其他警報的回調事件。
  • 0

    當應用程序啓動第一時間 它依次調用,

    1. didFinishLaunchingWithOptions
    2. applicationDidBecomeActive兩次

    當我們打開它僅調用Control Center

    applicationDidBecomeActive 
    

    當應用程序來自於背景,前景它依次調用

    1. applicationWillEnterForeground
    2. applicationDidBecomeActive