使App在用户长时间不操作时退出

转载:http://blog.csdn.net/kmyhy/article/details/9716313


原文:http://www.icodeblog.com/2011/09/19/timing-out-an-application-due-to-inactivity/

概述

先讲讲原理。我创建了一个 UIApplication 的子类ELCUIApplication。目的是为了覆盖 sendEvent: 方法。这个方法在每次触摸时都会调用。触摸可能来自于按钮、文本框以至窗口内的任何东西。

在 sendEvent 方法中,首先调用 super 的方法(确保事件能被传递到它应该到达的地方),然后重置NSTimer。这个时钟会在 5 分钟(可以修改)以后触发。

一旦定时器触发(应用程序超时),我将发送一个 NSNotification通知给订阅了该消息的对象。非常简单。

为了重置定时器(比如用户重新登录之后),你可以调用ELCUIAppilcation的 resetIdleTimer 方法。

你可能会问,为什么不在主窗口添加一个UIGestureRecognizer 来识别?开始的时候我也这样想过,但经过尝试,我发现无法获得全部的触摸事件。导致一些用户操作没有被记录。

示例项目在 github上可以下载。至少需要下载两个文件:ELCUIApplication.h 和 ELCUIApplication.m 。

 

自定义  UIApplication 子类

 

将 ELCUIApplication.h 和ELCUIApplication.m 拖到你的项目中。 确保选择“Copy Items...”。

打开 main.m,修改为如下内容:

 

#import <UIKit/UIKit.h>  

int main(int argc, char *argv[]) {

     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

     int retVal = UIApplicationMain(argc, argv, @"ELCUIApplication", nil);

     [pool release];

     return retVal; }

我仅仅将 UIApplicationMain 的第3 个参数修改为类名 ELCUIApplication,也就是说程序将用我们自定义的 UIApplication 启动。

在 ELCUIApplicaiton.h 中,我们定义了一个kApplicationTimeoutInMinutes 常量, 它表示了应用程序默认的超时间(5分钟),你可以修改它。

一旦程序启动,就会在指定时间到达时发布通知。接下来的事情就是响应通知。

响应超时通知

响应超时通知的一个比较好的地方,就是你的应用程序委托。这取决于你决定如何处理你的登出逻辑,我一般是在超时时弹出登录窗口(以模式窗口的方式)。示例代码如下:

 

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

     // Override point for customization after application launch.

     self.window.rootViewController = self.viewController;

     [self.window makeKeyAndVisible];

       [[NSNotificationCenter defaultCenter] addObserver:self

 selector:@selector(applicationDidTimeout:)

          name:kApplicationDidTimeoutNotification object:nil];

       return YES;

}  

- (void) applicationDidTimeout:(NSNotification *) notif {

     LoginViewController *controller = [[[LoginViewController alloc] initWithNibName:@"LoginViewController"

          bundle:[NSBundle mainBundle]] autorelease];

     [self.viewController presentModalViewController:controller animated:YES];

}

我们为名为 kApplicationDidTimeoutNotification的通知添加了观察者。当 kApplicationDidTimeoutNotification 通知触发,应用程序委托会调用 applicationDidTimeout:方法。该方法负责显示一个登录窗体。这样,用户就处于登出状态。当用户再次登入后,则应当重置时钟,以便在设备闲置一定时间后将用户再次登出。

重置时钟

我在登录窗口的 View Controller 中创建了一个登入方法:

I have created asimple (simulated) login method inside of my login view controller that lookslike this:

- (IBAction)login:(id)sender {

     [(ELCUIApplication *)[UIApplication sharedApplication] resetIdleTimer];

     [self.parentViewController dismissModalViewControllerAnimated:YES];

}

首先重置了时钟,然后重现登出前的界面(在用户登入后)。当然,我没有真的去让用户登入、登出,我只是简单演示了 ELCUIApplication  的使用。

结论

最后,如果你有任何问题或建议,请在我的 Twitter上给我留言。源代码可在github 下载。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UNIAPP是一个跨平台应用开发框架,它支持多种前端技术如HTML、CSS、JavaScript,并能够构建原生App应用。为了退出一个由UNIAPP创建的应用程序,你可以通过以下几个步骤来进行: ### 实现退出功能的基本步骤 #### 步骤 1: 创建退出事件监听 在您的页面或组件中,您需要添加一个事件监听器来处理用户尝试关闭应用程序的行为。 ```javascript onUnload(e) { // 用户尝试离开当前页面或窗口的候触发此函数 }, ``` #### 步骤 2: 在事件处理器中处理退出逻辑 在这个事件处理器中,您可以添加代码来处理具体的退出逻辑,例如保存状态信息、清除数据等。然后,可以使用`wx.exitApp()`方法来退出应用程序。 ```javascript onUnload(e) { console.log('页面即将关闭'); // 示例:保存用户最后访问的位置或状态 wx.setStorageSync('lastVisitedPage', this.pageName); // 退出应用程序 wx.exitApp(); } ``` #### 步骤 3: 确保全局处理 对于全局级别的退出逻辑,可以在`uni.app.json`文件中的`pageRoutes`数组内指定的页面路径上进行全局处理。但是,通常推荐的是在单个页面中处理特定的退出场景。 ### 相关问题: 1. **如何自定义退出提示**?除了基本的`wx.confirm()`提示外,是否有可能展示自定义的退出确认框? 可以通过自定义模板或利用第三方库(如uni-ui)来创建自定义的确认对话框。 2. **如何在退出前保存数据**?特别是在某些情况下,如长时间操作的情况下自动退出,应该注意哪些细节? 在`onUnload`方法或其他合适的机点之前,确保所有的数据已经被安全地保存到本地存储或云端服务,避免意外丢失重要信息。 3. **在退出过程中如何处理网络请求**?当用户试图从正在加载或已完成的网络请求中退出应用,该如何优雅地处理这些请求? 使用`axios`或其他HTTP库的拦截器来管理网络请求的状态,在用户尝试退出取消所有正在进行的请求。 通过上述指南,您可以更有效地管理和控制用户在UNIAPP应用中的退出过程,从而提供更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值