使程序在用戶長(zhǎng)時(shí)間不操作時(shí)退出

代碼地址 : https://github.com/B-Sides/ELCUIApplication

參考文章 :https://www.cnblogs.com/xiaobaizhu/p/7344585.html

概述
先講講原理。我創(chuàng)建了一個(gè) UIApplication 的子類ELCUIApplication。目的是為了覆蓋 sendEvent: 方法。這個(gè)方法在每次觸摸時(shí)都會(huì)調(diào)用。觸摸可能來(lái)自于按鈕、文本框以至窗口內(nèi)的任何東西。
在 sendEvent 方法中,首先調(diào)用 super 的方法(確保事件能被傳遞到它應(yīng)該到達(dá)的地方),然后重置NSTimer。這個(gè)時(shí)鐘會(huì)在 5 分鐘(可以修改)以后觸發(fā)。
一旦定時(shí)器觸發(fā)(應(yīng)用程序超時(shí)),我將發(fā)送一個(gè) NSNotification通知給訂閱了該消息的對(duì)象。非常簡(jiǎn)單。
為了重置定時(shí)器(比如用戶重新登錄之后),你可以調(diào)用ELCUIAppilcation的 resetIdleTimer 方法。
你可能會(huì)問(wèn),為什么不在主窗口添加一個(gè)UIGestureRecognizer 來(lái)識(shí)別?開(kāi)始的時(shí)候我也這樣想過(guò),但經(jīng)過(guò)嘗試,我發(fā)現(xiàn)無(wú)法獲得全部的觸摸事件。導(dǎo)致一些用戶操作沒(méi)有被記錄。
示例項(xiàng)目在 github上可以下載。至少需要下載兩個(gè)文件:ELCUIApplication.h 和 ELCUIApplication.m 。


自定義 UIApplication 子類

將 ELCUIApplication.h 和ELCUIApplication.m 拖到你的項(xiàng)目中。 確保選擇“Copy Items...”。
打開(kāi) main.m,修改為如下內(nèi)容:

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 個(gè)參數(shù)修改為類名 ELCUIApplication,也就是說(shuō)程序?qū)⒂梦覀冏远x的 UIApplication 啟動(dòng)。
在 ELCUIApplicaiton.h 中,我們定義了一個(gè)kApplicationTimeoutInMinutes 常量, 它表示了應(yīng)用程序默認(rèn)的超時(shí)間(5分鐘),你可以修改它。
一旦程序啟動(dòng),就會(huì)在指定時(shí)間到達(dá)時(shí)發(fā)布通知。接下來(lái)的事情就是響應(yīng)通知。
響應(yīng)超時(shí)通知
響應(yīng)超時(shí)通知的一個(gè)比較好的地方,就是你的應(yīng)用程序委托。這取決于你決定如何處理你的登出邏輯,我一般是在超時(shí)時(shí)彈出登錄窗口(以模式窗口的方式)。示例代碼如下:

  • (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];
    }

我們?yōu)槊麨?kApplicationDidTimeoutNotification的通知添加了觀察者。當(dāng) kApplicationDidTimeoutNotification 通知觸發(fā),應(yīng)用程序委托會(huì)調(diào)用 applicationDidTimeout:方法。該方法負(fù)責(zé)顯示一個(gè)登錄窗體。這樣,用戶就處于登出狀態(tài)。當(dāng)用戶再次登入后,則應(yīng)當(dāng)重置時(shí)鐘,以便在設(shè)備閑置一定時(shí)間后將用戶再次登出。
**重置時(shí)鐘 **
我在登錄窗口的 View Controller 中創(chuàng)建了一個(gè)登入方法:
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];
    }

首先重置了時(shí)鐘,然后重現(xiàn)登出前的界面(在用戶登入后)。當(dāng)然,我沒(méi)有真的去讓用戶登入、登出,我只是簡(jiǎn)單演示了 ELCUIApplication 的使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容