iOS 화면보호기 예제
1.화면을 손으로 터치하는지 감지하는 클래스 생성
DetectManager.h
#import "ScreenSaverVC.h"
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
//화면 터치 감지 체크 클래스(feat. 타이머)
@interface DetectManager : NSObject
//타이머
@property (strong,nonatomic) NSTimer *detectTimer;
//싱글턴 패턴
+(DetectManager *)sharedObject;
//화면 감지 체크를 위한 타이머 시작(재시작)
-(void)resetDetectTimer;
@end
NS_ASSUME_NONNULL_END
DetectManager.m
이 클래스의 객체를 생성할때, 딱 한번 싱글턴 패턴으로 객체 하나만 생성한다. 전역에서 사용을 할 것이기 때문에. 최초로 한번 호출 될때 init 메소드에서 UITapGestureRecognizer 클래스를 이용해서 AppDelegate 의 window 인스턴스에 손가락 탭 이벤트를 셋팅해주었다.
사용자가 화면을 터치하면 handleSingleTap 메소드가 호출되고, 이 메소드는 resetDetectTimer 메소드를 호출한다.
resetDetectTimer 메소드 안에서는 타이머 객체가 있으면 종료시켜주고, 없으면 새로 타이머를 초기화 시켜 준다. 1시간으로 초기화 시켜줘서 그 시간동안 터치가 없으면 화면보호기가 뜨게설정한다. 만약 정해놓은 1시간 안에 터치를 하면 다시 그 시간부터 1시간동안 타이머를 설정해준다.
#import "DetectManager.h"
#define DETECT_TIME 5.0
@implementation DetectManager
//타이머
@synthesize detectTimer;
//0.자기 자신 객체 생성 - 싱글톤 패턴
+ (DetectManager *)sharedObject{
NSLog(@"sharedObject 호출 ");
static DetectManager *detectManager = nil;
/*
dispatch_once_t는 dispatch_once가 실행되었는지 여부를 저장하고 있는 포인터 변수.
이 값을 보존하지 못한다면 여러번 실행될 수 있음.
최초값 : 0
*/
static dispatch_once_t onceToken;
/*
최초로 실행될때 onceToken에 값이 들어간다.
값이 0 일때만 한 번 실행된다. 이후 값이 존재할때는 아래 로직 실행안됨.
*/
dispatch_once(&onceToken, ^{
//객체는 단 하나만 생성된다.
detectManager = [[self alloc]init];
});
return detectManager;
}
//초기화 - 한번만 실행
- (id)init
{
self = [super init];
if (self) {
//1.최상위 UIWindow에 탭 제스쳐 셋팅해주기
UITapGestureRecognizer *singleFingerTap =
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
//2.AppDelegate는 싱글톤임 : 전역객체의 UIWindw 인스턴스 변수 얻기
AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
//3.UIWindow에 탭 이벤트 셋팅
[app.window addGestureRecognizer:singleFingerTap];
}
return self;
}
//2.제스쳐 이벤트 메소드 호출시 - 타이머 시작 함수 호출
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
NSLog(@"handleSingleTap - 터치 이벤트 발생 - ");
//DetectTimer 초기화 => 시작
[self resetDetectTimer];
}
//3.DetectTimer 초기화 => 시작
-(void)resetDetectTimer{
NSLog(@"resetDetectTimer 진입 - 터치 감지");
NSLog(@"detectTimer 초기화 - ");
if ([detectTimer isValid]) {
NSLog(@"기존(이전) detectTimer 해제 - ");
[detectTimer invalidate];
}
//로그인 했을때 유저 정보.
NSString *userid = @"로그인한 Id";
//로그인 사용자만 화면보호기 띄워주자
if(userid != nil){
//타이머 초기화
detectTimer = [NSTimer scheduledTimerWithTimeInterval:DETECT_TIME
target:self
selector:@selector(startDetectTimer)
userInfo:nil
repeats:NO];
}
}
//4.화면보호기 띄울지 말지 분기 체크
- (void)startDetectTimer {
NSLog(@"startDetectTimer 진입");
//현재 띄워진 class Name
UIViewController *curentVC = [[[UIApplication sharedApplication] delegate].window rootViewController];
/*
– isMemberOfClass의 경우는 해당 인스턴스가 특정한 클래스의 타입인지를 확인한다.
– isKindOfClass의 경우 해당 인스턴스가 특정 클래스의 상속 관계에 있어도 확인 가능하다.
*/
//현재 띄워진 View가 ScreenSaverVC 와 같은 종류인지 체크
BOOL checkCurVC = [[curentVC presentedViewController] isMemberOfClass:[ScreenSaverVC class]];
NSLog(@"checkCurVC : %d" , checkCurVC);
//ScreenSaverVC 화면일때는 안띄우게
if(checkCurVC){
NSLog(@"ScreenSaverVC 화면임 - 화면보호기 띄우지 않기");
}else{
//지정한 시간 지나면 화면 보호기 띄워주기
NSLog(@"화면보호기 띄우기!");
//최상위 뷰로 띄우기
[[[[UIApplication sharedApplication] delegate].window rootViewController] presentViewController:
[ScreenSaverVC sharedObject] animated:YES completion:nil];
}
}
@end
2.화면보호기 만들기.
여기서는 확인버튼을 누르면 화면 보호기를 제거해준다. 제거해주는 동시에 DetectManager 클래스의 타이머를 초기화 해준다.
ScreenSaverVC.h
#import "AppDelegate.h"
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
//화면 보호기 클래스
@interface ScreenSaverVC : UIViewController
//싱글톤 패턴으로 생성
+(ScreenSaverVC *)sharedObject;
@end
NS_ASSUME_NONNULL_END
ScreenSaverVC.m
#import "ScreenSaverVC.h"
#import "DetectManager.h"
@interface ScreenSaverVC ()
@end
@implementation ScreenSaverVC
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"ScreenSaverVC - viewDidLoad 호출 ");
}
//화면보호기 - 싱클톤 패턴으로 생성
+ (ScreenSaverVC *)sharedObject{
NSLog(@"ScreenSaverVC - sharedObject 호출 ");
static ScreenSaverVC *commonScreenSaverVC = nil;
/*
dispatch_once_t는 dispatch_once가 실행되었는지 여부를 저장하고 있는 포인터 변수.
이 값을 보존하지 못한다면 여러번 실행될 수 있음.
최초값 : 0
*/
static dispatch_once_t onceToken;
/*
최초로 실행될때 onceToken에 값이 들어간다.
값이 0 일때만 한 번 실행된다. 이후 값이 존재할때는 아래 로직 실행안됨.
*/
dispatch_once(&onceToken, ^{
commonScreenSaverVC = [[self alloc]init];
commonScreenSaverVC.modalPresentationStyle = UIModalPresentationFullScreen;
});
return commonScreenSaverVC;
}
//화면보호기 비밀번호 입력완료 : 맞는 번호
- (IBAction)confirmAction:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
//화면 보호기 띄우기 - 타이머 갱신
[[DetectManager sharedObject] resetDetectTimer];
}
@end
3.호출
AppDelegate 파일에서 앱이 시작할때와, 백그라운드로 들어갈때 타이머를 초기화 시켜준다.
#import "AppDelegate.h"
#import "DetectManager.h"
#import "ScreenSaverVC.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"앱 - 로드 완료");
//화면 보호기 띄우기 - 최초 시작
[[DetectManager sharedObject] resetDetectTimer];
return YES;
}
//앱이 백그라운드 상태로 돌아갔을때 호출
- (void)applicationDidEnterBackground:(UIApplication *)application{
NSLog(@"앱 - 백그라운드 모드 이동");
//최상위 뷰로 띄우기
[[[[UIApplication sharedApplication] delegate].window rootViewController] presentViewController:
[ScreenSaverVC sharedObject] animated:YES completion:nil];
}
@end
파일
'아이폰 개발 > ios 개념&튜토리얼' 카테고리의 다른 글
iOS 공통로그 & pch 파일 (0) | 2021.02.08 |
---|---|
iOS UNNotificationServiceExtension 예제 Push Sound (1) | 2021.02.05 |
iOS UIActivityIndicatorView 예제 (0) | 2021.02.02 |
iOS WKWebView 예제 (0) | 2021.01.30 |
NSURLSession 공통 모듈 예제 (0) | 2021.01.29 |