iOS不平衡调用applicationWillResignActive:和applicationDidBecomeActive:

时间:2014-01-27 16:52:13

标签: ios iphone objective-c uikit uiapplicationdelegate

当我的应用程序进入后台时,由于数据保护原因,它必须模糊当前屏幕。不得在任务管理器窗口中看到屏幕内容,因此必须在应用程序退出之前完成模糊程序。每次UI更新时,模糊都必须在主循环上进行。它只是在普通主视图上添加模糊视图。但是,这需要一点时间才能完成,这就是问题所在。

我从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的平衡调用数量的任何想法:在这种情况下......?

很多你的帮助 乌

2 个答案:

答案 0 :(得分:1)

经过一些测试后,我意识到可能存在一些妥协。

似乎applicationDidBecomeActive:仅与applicationDidEnterBackground平衡:

在我的情况下,这意味着模糊应该在后一种方法中进行。在一天结束时,这意味着如果用户通过调用通知中心或通过调用任务管理器“离开”我的应用程序,将不会出现屏幕模糊。但是,关于数据安全性,这不应该是一个重量级问题,因为很明显只有访问我的应用程序的用户才能执行这些步骤。

当通过单击HOME一次,进入待机状态或通过任务管理器更改前台应用程序来放置应用程序时,applicationDidEnterBackground:被调用,经过一些测试后,似乎从操作系统获得足够的时间来执行模糊处理在主循环上。

但是,如果你坚持原来的问题,这仍然没有解决。

答案 1 :(得分:0)

如果应用程序在-applicationWillResignActive()方法完成之前再次“变为活动状态”,那么它可能永远不会完全取消活动状态,因此有意义的是它可能不会触发对-applicationDidBecomeActive()的调用,因为活跃状态可能根本没有改变。

我会试试这个:

1)创建一个名为“showingBlur”的布尔值作为app appate的成员,并在-applicationDidFinishLaunching方法中将其设置为NO。

2)在-applicationWillResignActive()中,在启动UI更新之前,将“showingBlur”设置为YES。

3)在applicationWillEnterForeground()中,检查该布尔值,如果为真,则删除模糊视图并将其设置为false。

或者这个:

1)当您进行模糊视图时,还要创建一个前景计时器,它在第一次触发时会自动删除模糊视图。这样,当您创建计时器时,您立即为应用程序提供背景,因此它不会触发。但是,只要您打开应用程序,它就会触发,删除自身并删除模糊视图。

希望这有帮助!