使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 下載。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章