1. 程式人生 > >IOS執行程式長時間誤動作時自動退出

IOS執行程式長時間誤動作時自動退出

  • 概述

    先講講原理。我建立了一個 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,修改為如下內容:


    01.#import <UIKit/UIKit.h>  
    02. 03.int main(int argc, char *argv[]) { 04. 05.NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 06. 07.int retVal = UIApplicationMain(argc, argv, @"ELCUIApplication", nil); 08. 09.[pool release]; 10. 11.return retVal; }

    我僅僅將 UIApplicationMain 的第3 個引數修改為類名 ELCUIApplication,也就是說程式將用我們自定義的 UIApplication 啟動。

    在 ELCUIApplicaiton.h 中,我們定義了一個kApplicationTimeoutInMinutes 常量, 它表示了應用程式預設的超時間(5分鐘),你可以修改它。

    一旦程式啟動,就會在指定時間到達時釋出通知。接下來的事情就是響應通知。

    響應超時通知

    響應超時通知的一個比較好的地方,就是你的應用程式委託。這取決於你決定如何處理你的登出邏輯,我一般是在超時時彈出登入視窗(以模式視窗的方式)。示例程式碼如下:


    01.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 02. 03.// Override point for customization after application launch. 04. 05.self.window.rootViewController = self.viewController; 06. 07.[self.window makeKeyAndVisible]; 08. 09.[[NSNotificationCenter defaultCenter] addObserver:self 10. 11.selector:@selector(applicationDidTimeout:) 12. 13.name:kApplicationDidTimeoutNotification object:nil]; 14. 15.return YES; 16. 17.}   18. 19.- (void) applicationDidTimeout:(NSNotification *) notif { 20. 21.LoginViewController *controller = [[[LoginViewController alloc] initWithNibName:@"LoginViewController" 22. 23.bundle:[NSBundle mainBundle]] autorelease]; 24. 25.[self.viewController presentModalViewController:controller animated:YES]; 26. 27.}

    我們為名為 kApplicationDidTimeoutNotification的通知添加了觀察者。當 kApplicationDidTimeoutNotification 通知觸發,應用程式委託會呼叫 applicationDidTimeout:方法。該方法負責顯示一個登入窗體。這樣,使用者就處於登出狀態。當用戶再次登入後,則應當重置時鐘,以便在裝置閒置一定時間後將使用者再次登出。

    重置時鐘

    我在登入視窗的 View Controller 中建立了一個登入方法:


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

  • 相關推薦

    IOS執行程式時間動作自動退出

    概述 先講講原理。我建立了一個 UIApplication 的子類ELCUIApplication。目的是為了覆蓋 sendEvent: 方法。這個方法在每次觸控時都會呼叫。觸控可能來自於按鈕、文字框以至視窗內的任何東西。 在 sendEvent 方法中,首先呼叫 super 的方法(確保事件能被傳遞

    Android實現app時間未操作自動退出app

    這裡要考慮3個問題,第一個是鎖屏問題,第二個是app被切換至後臺的問題,第三個是螢幕鎖定和解除時app在後臺時的問題 一,監聽螢幕解鎖,鎖定 public class ScreenObserver { private static String TAG = "ScreenObserver";

    【FAQ系列】複製執行時間Opening tables

    前言:在slave上,發現SQL thread長時間處於Opening tables狀態 1、問題描述 朋友的資料庫,做了主從replication複製。在slave例項上,SQL thread的長時間處於Opening tables狀態,複製程序異常。 整個例項大概20個database,總共3

    furtureTask 避免主執行時間阻塞

     某些情況下,你的需求列表中的某一個子任務所花費的時間可能是你不能控制,不能預知的(譬如url獲取請求資料)。有的時候它很快,有的時侯得到結構需要花費你預料以外的很長時間,最終阻塞了你的主執行緒,使得你的主執行緒快慢依賴於這個看起來並不那麼重要的功能。也許你需要給這個子任務

    FAQ系列 | 複製執行時間Opening tables

    0、導讀 在slave上,發現SQL thread長時間處於Opening tables狀態 1、問題描述 朋友的資料庫,做了主從replication複製。在slave例項上,SQL thread的長時間處於Opening ta

    Linux下執行程式出現 Text file busy 的解決辦法

    Linux下執行程式出現 Text file busy 時的解決辦法。 使用 fuser 命令檢視程式檔案被哪個程序佔用,然後用 kill 命令殺死該程序,即解決問題。fuser命令是用來顯示所有正在使用著指定的file, file system 或者 soc

    資料庫timestamp時間更新資料自動更新

    今天開發時碰到一個挺有趣的事情,在資料庫中直接用客戶端軟體更改資料的時候,有個timestamp時間竟然自動更新為更新資料時的時間,研究發現,竟然是因為預設值設定成current_timestamp的原

    FTP連線時間不操作後自動斷開/掛掉的原因和解決

    資料庫、FTP等連線在長時間不使用之後會自動斷開,導致下次使用時尚未登入而直接進行操作,將會導致出錯。 原因 FTP或資料庫伺服器設定了會話無操作的timeout,當無操作的時間大於這個值的時候,將會導致伺服器將連線切斷(connection reset b

    IIS執行一段時間不響應(自動關閉)的解決方法

          查詢事件記錄,提示為應用程式池 'DefaultAppPool' 提供服務的程序關閉時間超過了限制 解決方案: Internet 資訊服務(IIS)管理器->應用程式池->DefaultAppPool->右擊屬性 一、回收 1、回收工作程序(分鐘):選中

    為什麼一段時間後網站後臺自動退出 php中session過期時間設定

    修改php配置檔案中的session.gc_maxlifetime。如果想了解更多session回收機制,繼續閱讀。(本文環境php5.2) 概述:每一次php請求,會有1/100的概率(預設值)觸發“session回收”。如果“session回收”發生,那就會檢查/t

    讓 Spark Streaming 程式在 YARN 叢集上時間執行(二)—— 日誌、監控、Metrics

    前段時間看到了外國朋友寫的一篇文章,覺得還不錯,於是就把他翻譯一下,供大家參考和學習。 如果沒看過第一篇文章,建議先去看一下上一篇文章哈,這裡是接著上一篇文章來寫的哈~ 日誌 訪問 Spark 應用程式日誌的最簡單方法是配置 Log4j 控

    時間執行的PHP程式解決方案

    描述:有時候,PHP程式會面臨AJAX過來的呼叫,但邏輯處理的執行又比較漫長,如外部呼叫svn checkout某個專案,那麼就會導致幾個問題:客戶端超時,返回資料集超大,伺服器端指令碼超時,記憶體佔用巨大等 比較了幾個解決方案,以下這個能比較好地解決上述問題,對伺服器的調整也不會造成太大影響。

    安裝npm install時間停留在fetchMetadata: sill mapToRegistry uri http://registry.npmjs.org/whatwg-fetch處

    長時間 fig aer tail 但是 http gis org url地址 安裝npm install時,長時間停留在fetchMetadata: sill mapToRegistry uri http://registry.npmjs.org/whatwg-fetch處

    安裝npm install時間停留在fetchMetadata: sill 解決方法——換npm的源

    sta 資源問題 但是 install org .org 長時間 info data 安裝npm install時,長時間停留在fetchMetadata: sill mapToRegistry uri http://registry.npmjs.org/whatwg-fe

    SQLServer中的執行計劃緩存由於時間緩存對性能造成的幹擾

    找到 產品 ans ads 實戰 alt 開發 實時計算 query 本文出處:http://www.cnblogs.com/wy123/p/7190785.html (保留出處並非什麽原創作品權利,本人拙作還遠遠達不到,僅僅是為了鏈接到原文,因為後續對可能存在的

    關於Tomcat啟動時間停在Initializing Spring root webApplicationContext處的原因

    time 現在 cati ack color 處的 問題 style 就會 1.大家肯定經常會遇到這樣的問題,以前啟動tomcat都不會出問題。現在一起動就會卡到Initializing Spring root webApplicationContext處,tomcat會報

    解決SSH連接linux時間不操作自動斷開

    麻煩 config文件 雲服務 不響應 clas linu 一個 找到 沒有響應 最近重裝Linux系統,但是這次ssh連接雲服務區Linux系統時,經常出現一段時間不操作,連接自動中斷,表現為光標還在閃動,但是卻無法操作。只好關閉終端,重新連接,很是麻煩。 為此,通過網絡

    SSH連接linux時間不操作就斷開的解決方案(增強版)

    正常 每分鐘 指定 防止 variable 當前 實現 客戶 不發送 1、第一次嘗試失敗 修改/etc/ssh/sshd_config文件, 找到 ClientAliveInterval 0 ClientAliveCountMax 3 並將註釋符號("#")去掉, 將Cli

    Windows如何按照固定間或有規律的執行程式

    假如我們需要某一個程式每天都需自動執行一次,我們就應該按照下面的方法: 1、“Windows+R”開啟執行視窗,並輸入命令:“taskschd.msc”,點選“確定” 2、進入到“任務計劃程式”,點選“建立基本任務” 3、進入建立基本任務嚮導頁面,輸入名稱以及描述(應該按

    利用Python多執行緒限制 http 真實請求間或限制函式最大執行時間的裝飾器

      這段時間在製作一個爬蟲的時候發現了一個比較神奇的事情 python requests 包發起請求的時候設定 timeout 引數 竟然不起作用? what 你要弄啥么蛾子嘞,  後來各種找原因終於在別人的提醒下又看了下 requests 的文件才發