본문 바로가기
아이폰 개발/ios 개념&튜토리얼

iOS 화면보호기 예제

by 인생여희 2021. 2. 3.

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

 

 

파일

 

ActivityViewTest 2.zip
0.08MB