2014-01-27 34 views
4

當我的應用程序轉到後臺時,出於數據保護原因,它必須模糊當前屏幕。屏幕的內容不能在任務管理器窗口中看到,所以模糊例程必須在應用程序退出前完成。隨着每個UI更新,模糊必須發生在主循環中。它只是在正常的主視圖上添加模糊的視圖。但是,這需要一點時間才能完成,這就是問題所在。iOS不平衡調用applicationWillResignActive:和applicationDidBecomeActive:

我從applicationWillResignActive調用我的模糊例程:正如Apple的建議。現在我們假設完成任務需要0.2秒。如果應用程序將在短時間內重新激活,則不調用applicationDidBecomeActive:(它應該再次打開我的屏幕,因此模糊了)。

也許你認爲在如此短的時間內「關閉」和「打開」應用程序並不是正常的用戶行爲,而是考慮輕敲屏幕的上邊緣並稍微向下移動,只是意外同時嘗試點擊位於上邊緣的按鈕。這將激活通知中心僅幾分之一秒。這就夠了。

只是爲了使這一問題的透明,看看這個AppDelegate中,將張貼不平衡調用控制檯:


    @implementation UHAppDelegate 

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
     return YES; 
    } 

    - (void)applicationWillResignActive:(UIApplication *)application 
    { 
     NSLog(@"applicationWillResignActive - performing some tasks..."); 

     // let the main loop do some work... 
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]]; 
    } 

    - (void)applicationDidEnterBackground:(UIApplication *)application 
    { 
    } 

    - (void)applicationWillEnterForeground:(UIApplication *)application 
    { 
    } 

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

    - (void)applicationWillTerminate:(UIApplication *)application 
    { 
    } 

    @end 

任何想法如何實現呼叫applicationWillResignActive均衡數:和applicationDidBecomeActive:在這種情況下...?

THX很多關於你的幫助 烏

+0

你的applicationWillResignActive如上所述沒有做什麼? – GuybrushThreepwood

+0

它的確如此 - 它會在控制檯中發佈一個音符,並阻止主循環0.2秒,就像主循環中的其他方法調用所做的那樣。 –

+0

如果以正常速度執行通知中心的「向下拖動」並讓其再次翻轉,則會得到一個平衡的呼叫日誌(「applicationWillResignActive - 執行某些任務」,並在「翻轉」):「applicationDidBecomeActive 「)。但是,如果您只是在屏幕上方做了一個快速的「點擊並向下翻轉」,則只會出現「applicationWillResignActive - 正在執行某些任務」,儘管該應用已重新啓動) –

回答

1

經過一番測試,我意識到可能會有一些妥協。

似乎applicationDidBecomeActive:僅與applicationDidEnterBackground平衡:

在我而言,這意味着模糊應在後一種方法。在一天結束時,這意味着如果用戶通過呼叫通知中心或通過調用任務管理器「離開」我的應用程序,將不會出現屏幕模糊。但是,關於數據安全性,這不應該是一個沉重的問題,因爲很明顯,只有有權訪問我的應用的用戶才能執行這些步驟。

當通過單擊HOME離開應用程序,進入待機狀態或通過任務管理器更改前臺應用程序時,applicationDidEnterBackground:被調用,經過一些測試後,似乎從OS獲得足夠的時間執行模糊主循環。

但是,如果你堅持原來的問題,這仍然沒有解決。

0

如果應用「被激活」的-applicationWillResignActive()方法完成之前再次,那麼它可能永遠不會完全辭職活躍狀態,因此它是有道理的,它可能不會觸發對-applicationDidBecomeActive()的調用,因爲活動狀態可能根本沒有改變。

我想試試這個:

1)創建一個名爲「showingBlur」作爲你的會員的應用程序委託一個布爾值,它在你的-applicationDidFinishLaunching方法設置爲NO。

2)在-applicationWillResignActive()中,在開始UI更新之前,將「showingBlur」設置爲YES。

3)在applicationWillEnterForeground()中,檢查布爾值,如果爲true,則刪除模糊視圖並將其設置爲false。

OR這樣的:

1)當你讓你的模糊觀點,也創造了一個前景計時器,同時刪除自身模糊查看第一次閃光。這樣,當您創建計時器時,您立即爲應用程序提供背景,所以它不會觸發。但是,只要您打開應用程序,它就會觸發,刪除自身並刪除模糊視圖。

希望這會有所幫助!

+0

問題是,applicationWillEnterForeground()也不會被調用。應用程序根本沒有任何關於它會再次激活的信息。 - 會嘗試你的第二個想法! –

+0

嘗試了計時器的想法 - 很抱歉,即使應用程序已經走到了背景,計時器也會啓動。 –

相關問題