iOS的鎖屏和解鎖的時(shí)間機(jī)制

idleTimer

idleTimer 是iOS內(nèi)置的時(shí)間監(jiān)測機(jī)制炫狱,當(dāng)在一段時(shí)間內(nèi)未操作即進(jìn)入鎖屏狀態(tài)。但有些應(yīng)用程序是不需要鎖住屏幕的剔猿,比如游戲视译,視頻這類應(yīng)用。 可以通過設(shè)置UIApplication的idleTimerDisabled屬性來指定iOS是否鎖屏艳馒。

// 禁用休閑時(shí)鐘 
[[UIApplication sharedApplication] setIdleTimerDisabled: YES]; 

也可以使用這種語法

[UIApplication sharedApplication].idleTimerDisabled = YES;

但是憎亚,這個(gè)命令只能禁用自動鎖屏,如果點(diǎn)擊了鎖屏按鈕弄慰,仍然會進(jìn)入鎖屏的。有一點(diǎn)例外的是蝶锋,AVPlayer不用設(shè)置idleTimerDisabled=YES陆爽,也能屏幕常亮,播放完成后過一分鐘就自動關(guān)閉屏幕扳缕。有興趣的可以自己嘗試一下慌闭。

鎖屏和解鎖通知

iPhone的鎖屏監(jiān)測分為兩種方式監(jiān)聽:一種是程序在前臺,另一種程序在后臺躯舔。 程序在前臺驴剔,這種比較簡單。直接使用Darwin層的通知就可以了:

Darwin是由蘋果電腦于2000年所釋出的一個(gè)開放原始碼操作系統(tǒng)粥庄。Darwin 是MacOSX 操作環(huán)境的操作系統(tǒng)成份丧失。蘋果電腦于2000年把Darwin 釋出給開放原始碼社群。現(xiàn)在的Darwin皆可以在蘋果電腦的PowerPC 架構(gòu)和X86 架構(gòu)下執(zhí)行惜互,而后者的架構(gòu)只有有限的驅(qū)動程序支援布讹。

#import <notify.h>
#define NotificationLock CFSTR("com.apple.springboard.lockcomplete")
#define NotificationChange CFSTR("com.apple.springboard.lockstate")
#define NotificationPwdUI CFSTR("com.apple.springboard.hasBlankedScreen")

static void screenLockStateChanged(CFNotificationCenterRef center,void* observer,CFStringRef name,const void* object,CFDictionaryRef userInfo)
{
NSString* lockstate = (__bridge NSString*)name;
if ([lockstate isEqualToString:(__bridge  NSString*)NotificationLock]) {
    NSLog(@"locked.");
} else {
    NSLog(@"lock state changed.");
}
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, screenLockStateChanged, NotificationLock, NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, screenLockStateChanged, NotificationChange, NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
return YES;
}

notify.h的具體內(nèi)容可以移步開發(fā)文檔琳拭。這種方法,程序在前臺是可以拿到的描验,在后臺情況下就無能為力了白嘁。

第二種是程序退后臺后,這時(shí)再鎖屏就收不到上面的那個(gè)通知了膘流,需要另外一種方式, 以循環(huán)的方式一直來檢測是否是鎖屏狀態(tài)絮缅,會消耗性能并可能被蘋果掛起,需要合理設(shè)置循環(huán)時(shí)間呼股。

static void setScreenStateCb()
{
uint64_t locked;

__block int token = 0;
notify_register_dispatch("com.apple.springboard.lockstate",&token,dispatch_get_main_queue(),^(int t){
});
notify_get_state(token, &locked);
NSLog(@"%d",(int)locked);
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
while (YES) {
    setScreenStateCb();
    sleep(5); // 循環(huán)5s
}
}

UIApplication

上面我們使用了UIApplication的IdleTimerDisabled方法耕魄,下面就大概了解下UIApplication吧。

UIApplication卖怜,每個(gè)程序只能有一個(gè)泡仗,系統(tǒng)使用的是單例模式,用[UIApplication sharedApplication]來得到一個(gè)實(shí)例涛漂。這個(gè)單例實(shí)例是在系統(tǒng)啟動時(shí)由main函數(shù)里面的UIApplicationMain方法生成看蚜,實(shí)現(xiàn)的是UIApplicationDelegate的Protocol,也就是AppDelegate的一個(gè)實(shí)例甩鳄。每次通過[UIApplication sharedApplication]調(diào)用的就是它逞度。UIApplication保存一個(gè)UIWindow對象序列,用來快速恢復(fù)views妙啃。

UIApplication在程序里的作用很多档泽,大致如下所示:

一、遠(yuǎn)程提醒揖赴,就是push notification注冊馆匿;
二、可以連接到UIUndoManager燥滑;在Cocoa中使用NSUndoManager可以很方便的完成撤銷操作渐北。NSUndoManager會記錄下修改、撤銷操作的消息铭拧。這個(gè)機(jī)制使用兩個(gè)NSInvocation對象棧赃蛛。當(dāng)進(jìn)行操作時(shí),控制器會添加一個(gè)該操作的逆操作的invocation到Undo棧中搀菩。當(dāng)進(jìn)行Undo操作時(shí)呕臂,Undo操作的逆操作會倍添加到Redo棧中,就這樣利用Undo和Redo兩個(gè)堆棧巧妙的實(shí)現(xiàn)撤銷操作肪跋。需要注意的是歧蒋,堆棧中存放的都是NSInvocation實(shí)例。
三、檢查能否打開某個(gè)URL疏尿,并且打開URL瘟芝;這個(gè)功能可以配合應(yīng)用的自定義URL功能,來檢測是否安裝了某個(gè)應(yīng)用褥琐。使用的是[[UIApplication sharedApplication] canOpenURL:url]方法锌俱。如果返回YES,可執(zhí)行[[UIApplication sharedApplication] openURL:url]; 
四敌呈、注冊Local Notification贸宏;
五、在后臺運(yùn)行以及從后臺轉(zhuǎn)為前臺時(shí)的操作磕洪;
六吭练、防止屏幕睡眠:即上面的[[UIApplication sharedApplication] setIdleTimerDisabled: YES]; 
七、手動調(diào)整status bar的位置和狀態(tài)析显,如設(shè)置為豎屏鲫咽、橫屏等;
八谷异、設(shè)置badge number分尸,就是圖標(biāo)右上角的數(shù)字;
九歹嘹、每當(dāng)應(yīng)用聯(lián)網(wǎng)時(shí)箩绍,在狀態(tài)欄上會顯示聯(lián)網(wǎng)小菊花。UIApplication可以設(shè)置是否出現(xiàn)尺上。
UIApplication *app = [UIApplication sharedApplication]; 
app.networkActivityIndicatorVisible =!app.networkActivityIndicatorVisible;//轉(zhuǎn)動 
app.networkActivityIndicatorVisible = app.networkActivityIndicatorVisible;//不轉(zhuǎn)動

UIUndoManager示例

- (void) one
{
position = position + 10;
[[undoManager prepareWithInvocationTarget:self] two];
[self showTheChangesToThePostion];
}

- (void) two
{
position = position - 10;
[[undoManager prepareWithInvocationTarget:self] one];
[self showTheChangesToThePostion];
}

prepareWithInvocationTarget:方法記錄了target并返回UndoManager材蛛,然后UndoManager重載了forwardInvocation方法,也就將two方法的Invocation添加到undo棧中了怎抛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卑吭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子马绝,更是在濱河造成了極大的恐慌陨簇,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迹淌,死亡現(xiàn)場離奇詭異,居然都是意外死亡己单,警方通過查閱死者的電腦和手機(jī)唉窃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纹笼,“玉大人纹份,你說我怎么就攤上這事。” “怎么了蔓涧?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵件已,是天一觀的道長。 經(jīng)常有香客問我元暴,道長篷扩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任茉盏,我火速辦了婚禮鉴未,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸠姨。我一直安慰自己铜秆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布讶迁。 她就那樣靜靜地躺著连茧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巍糯。 梳的紋絲不亂的頭發(fā)上啸驯,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音鳞贷,去河邊找鬼坯汤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛搀愧,可吹牛的內(nèi)容都是我干的惰聂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼咱筛,長吁一口氣:“原來是場噩夢啊……” “哼搓幌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起迅箩,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤溉愁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后饲趋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拐揭,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年奕塑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堂污。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡龄砰,死狀恐怖盟猖,靈堂內(nèi)的尸體忽然破棺而出讨衣,到底是詐尸還是另有隱情,我是刑警寧澤式镐,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布反镇,位于F島的核電站,受9級特大地震影響娘汞,放射性物質(zhì)發(fā)生泄漏歹茶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一价说、第九天 我趴在偏房一處隱蔽的房頂上張望辆亏。 院中可真熱鬧,春花似錦鳖目、人聲如沸扮叨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彻磁。三九已至,卻和暖如春狸捅,著一層夾襖步出監(jiān)牢的瞬間衷蜓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工尘喝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留磁浇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓朽褪,卻偏偏與公主長得像置吓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子缔赠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容