많은 앱에는 일정 기간 동안 활동이 없으면 자동으로 로그아웃되는 기능이 있습니다. 그러나 이러한 앱 중 일부는 API 비활성으로 인해 로그아웃되는 반면 다른 앱은 UIView 컨트롤을 재정의하여 로그아웃 타이머를 구현합니다. 이 기사에서는 hitTest 메서드를 사용하여 이 동작을 달성하는 더 나은 방법을 살펴보겠습니다. 그리고 일부 앱은 마지막 로그인/API 호출과 현재 시간 사이의 시간차를 기반으로 로그아웃합니다. 마지막 접근 방식의 문제는 장치의 시간을 로그인 시점으로 수동으로 설정하여 세션을 지속적으로 유지할 수 있다는 것입니다.
첫 번째 접근 방식의 문제점은 일부 사용자가 콘텐츠만 스크롤하고 백엔드에 요청을 하지 않는 경우에도 로그아웃될 수 있다는 것입니다. 사용자가 특정 은행 상품을 개설하기 전에 이용 약관을 읽고 로그아웃했다고 상상해 보십시오. 우리는 이것을 확실히 피하고 싶습니다.
두 번째 접근 방식의 문제는 특히 앱에 사용자 지정 보기가 포함된 대규모 코드베이스가 있는 경우 기존 코드베이스에서 비활성 로그아웃 기능을 구현하기 어려울 수 있다는 것입니다.
이것이 바로 hitTest 메소드가 매우 도움이 될 수 있는 부분입니다.
나열된 문제를 해결하기 위해 hitTest 메소드로 해킹을 사용할 수 있습니다.
사용자 활동 시간을 추적하는 클래스의 구현 버전이 이미 있다고 가정해 보겠습니다.
이를 다음 API로 표현하겠습니다.
protocol IUserActivity { func resetInactiveTime() }
extension UIWindow { open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { userActivity.resetInactiveTime() return super.hitTest(point, with: event) } }
그리고 그게 다야! 이제 이 메서드는 테이핑, 스크롤 및 기타 동작 활동과 같이 화면에서 사용자가 수행하는 모든 대화형 이벤트에서 트리거됩니다.
UIWindow의 하위 클래스를 선언하고 거기에서 hitTest 메서드를 재정의할 수도 있습니다.
iOS 의 터치 이벤트는 일반적으로 기기 터치 스크린과의 사용자 상호 작용에서 발생합니다.
사용자가 화면을 터치하면 하드웨어가 터치를 감지하고 터치 위치, 압력, 지속 시간 등의 정보가 포함된 원시 터치 데이터 스트림을 생성합니다.
그런 다음 이 원시 터치 데이터는 운영 체제에 의해 처리되고 UIKit에서 처리할 수 있는 상위 수준 터치 이벤트로 변환됩니다. 운영 체제는 터치 위치와 뷰 계층 구조를 기반으로 터치 이벤트가 어떤 UIWindow 객체에 해당하는지 확인한 다음 처리를 위해 해당 객체의 UIResponder 객체에 터치 이벤트를 보냅니다.
터치 이벤트가 발생하면 iOS 운영 체제는 적중 테스트 알고리즘을 사용하여 터치 이벤트가 해당하는 UIView 또는 UIWindow 객체를 결정합니다.
적중 테스트 알고리즘은 최상위 UIWindow 개체에서 시작하여 터치 지점이 포함된 가장 깊은 뷰를 찾을 때까지 뷰 계층 구조의 각 하위 뷰를 반복적으로 확인합니다. 이는 터치 포인트가 각 하위 뷰의 프레임 내부에 있는지 확인하여 수행됩니다.
적중 테스트는 깊이 우선 역방향 선주문 탐색 알고리즘을 사용합니다. 즉, 알고리즘은 먼저 루트 노드를 방문한 다음 상위 인덱스에서 하위 인덱스로 하위 트리를 순회합니다.
이러한 종류의 순회를 사용하면 순회 반복 횟수를 줄이고 터치 포인트가 포함된 첫 번째 가장 깊은 하위 뷰가 발견되면 검색 프로세스를 중지할 수 있습니다.
이는 하위 뷰가 항상 상위 뷰 앞에 렌더링되고, 형제 뷰가 항상 하위 뷰 배열에 대한 낮은 인덱스를 사용하여 형제 뷰 앞에 렌더링되기 때문에 가능합니다. 여러 개의 겹치는 뷰에 특정 점이 포함된 경우 가장 오른쪽 하위 트리의 가장 깊은 뷰가 맨 앞의 뷰 (1) 가 됩니다.
보시다시피, 트래버스 알고리즘은 사용자가 어떤 뷰나 컨트롤과 상호 작용하든 관계없이 항상 UIWindow 개체에서 시작됩니다.
그리고 우리는 UIWindow 클래스의 hitTest 메서드에서 이러한 이벤트를 가로채기만 하면 우리의 목적에 맞게 이를 사용할 수 있습니다!
그게 다야! 아래 댓글을 통해 여러분의 생각을 알려주세요.