https://www.jianshu.com/p/4d6472735e42
小編最近在開發一項功能,需要監聽APP進入后台的時候通知用戶回到APP,但是鎖屏的時候不用發通知,所以要區分用戶點home鍵和鎖屏鍵,其中遇到了很多坑,現在跟大家講講如何避開這些坑。網上監聽鎖屏的方法大都是用達爾文通知來監聽:
代碼如下:
//AppDelegate.m //監聽鎖屏事件 #define kNotificationLock CFSTR("com.apple.springboard.lockcomplete") //監聽屏幕狀態變化事件 #define kNotificationChange CFSTR("com.apple.springboard.lockstate") - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ //監聽鎖屏事件 CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, screenLockStateChanged, kNotificationLock, NULL, CFNotificationSuspensionBehaviorDeliverImmediately); //監聽屏幕狀態變化事件 CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, screenLockStateChanged, kNotificationChange, NULL, CFNotificationSuspensionBehaviorDeliverImmediately); return YES; } static void screenLockStateChanged(CFNotificationCenterRef center,void* observer,CFStringRef name,const void* object,CFDictionaryRef userInfo){ NSString* lockstate = (__bridge NSString*)name; if ([lockstate isEqualToString:(__bridge NSString*)kNotificationLock]) { NSLog(@"鎖屏"); } else{ NSLog(@"解鎖"); } }
我最開始也用的這種方法,但是被蘋果拒了,說我用了達爾文通知,由此可見這種方法已經行不通了。
后來用了第二種方法,蘋果官方提供了監聽鎖屏和解鎖的方法,就是以下兩種方法:
代碼如下:
//AppDelegate.m -(void)applicationProtectedDataWillBecomeUnavailable:(NSNotificationCenter *)notification{ NSLog(@"鎖屏"); } - (void)applicationProtectedDataDidBecomeAvailable:(UIApplication *){ NSLog(@"解鎖"); }
但后來查找資料發現這兩個方法只有在手機設置了密碼和touchID了的時候才會被調用,顯然這不能解決我們的問題。那還有什么方法呢,經過我千辛萬苦整整兩天的查找資料,終於找到一種有點黑客的做法,先上代碼:
//AppDelegate.m //app進入后台和鎖屏都會調用此方法 -(void)applicationDidEnterBackground:(NSNotification *)notification { if ([self didUserPressLockButton]) { //User pressed lock button NSLog(@"Lock screen."); } else { NSLog(@"Home."); //user pressed home button } } -(BOOL)didUserPressLockButton{ //獲取屏幕亮度 CGFloat oldBrightness = [UIScreen mainScreen].brightness; //以較小的數量改變屏幕亮度 [UIScreen mainScreen].brightness = oldBrightness + (oldBrightness <= 0.01 ? (0.01) : (-0.01)); CGFloat newBrightness = [UIScreen mainScreen].brightness; //恢復屏幕亮度 [UIScreen mainScreen].brightness = oldBrightness; //判斷屏幕亮度是否能夠被改變 return oldBrightness != newBrightness; }
當用戶離開通過鎖定按鈕而不是主頁按鈕時,蘋果只允許你從applicationDidEnterBackground更改屏幕亮度。這種方法是當APP進入后台時, 以較小的數量改變屏幕亮度,並檢查是否能夠更改。如果能夠更改便是鎖定按鈕,不能則是主頁按鈕。經過檢測這種方法是可行的,這里講的是監聽鎖屏,這個方法同樣也可以監聽解鎖,小編開發的功能是有定時器的,每隔一秒就會執行下didUserPressLockButton這個方法,解鎖的時候會同樣執行鎖屏的語句。
另外網上還有一種方法是通過檢測屏幕亮度來判斷是鎖屏還是按了home鍵,這種方法是不可以的,因為鎖屏之后屏幕的亮度並不為0。
如果大家有更好的方法歡迎告知~
作者:dsisi
鏈接:https://www.jianshu.com/p/4d6472735e42
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。