कई ऐप्स में ऐसी सुविधा होती है जो एक निश्चित अवधि की निष्क्रियता के बाद आपको स्वचालित रूप से लॉग आउट कर देती है। हालाँकि, इनमें से कुछ ऐप आपको एपीआई निष्क्रियता के आधार पर लॉग आउट करते हैं, जबकि अन्य UIView नियंत्रणों को ओवरराइड करके लॉगआउट टाइमर को लागू करते हैं। इस लेख में, हम हिटटेस्ट विधि का उपयोग करके इस व्यवहार को प्राप्त करने का एक बेहतर तरीका तलाशेंगे। और कुछ ऐप्स वर्तमान समय के साथ अंतिम लॉगिन/एपीआई कॉल के बीच के समय के अंतर के आधार पर आपको लॉग आउट कर रहे हैं। अंतिम दृष्टिकोण के साथ समस्या यह है कि आप डिवाइस पर अपना समय मैन्युअल रूप से लॉगिन समय बिंदु पर सेट करके अपने सत्र को लगातार जीवित रख सकते हैं।
पहले दृष्टिकोण के साथ समस्या यह है कि कुछ उपयोगकर्ता लॉग आउट हो सकते हैं भले ही वे केवल सामग्री के माध्यम से स्क्रॉल कर रहे हों और बैकएंड के लिए कोई अनुरोध नहीं कर रहे हों। एक ऐसे उपयोगकर्ता की कल्पना करें जो खोलने से पहले एक निश्चित बैंकिंग उत्पाद के नियम और शर्तें पढ़ता है और उसे लॉग आउट किया जा रहा है। हम निश्चित रूप से इससे बचना चाहते हैं।
दूसरे दृष्टिकोण के साथ समस्या यह है कि मौजूदा कोडबेस में निष्क्रियता लॉगआउट सुविधा को लागू करना मुश्किल हो सकता है, खासकर अगर ऐप में कस्टम व्यू के साथ एक बड़ा कोडबेस है।
यह वह जगह है जहाँ हिटटेस्ट विधि बहुत मददगार हो सकती है।
सूचीबद्ध मुद्दों को प्रबल करने के लिए हम हिटटेस्ट विधि के साथ एक हैक का उपयोग कर सकते हैं।
आइए मान लें कि हमारे पास पहले से ही एक वर्ग का एक कार्यान्वित संस्करण है जो उपयोगकर्ता गतिविधि समय को ट्रैक करने के लिए ज़िम्मेदार है।
हम इसे निम्नलिखित एपीआई के साथ व्यक्त करने जा रहे हैं:
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 का उपवर्ग भी घोषित कर सकते हैं और वहां एक हिटटेस्ट विधि को ओवरराइड कर सकते हैं।
IOS में टच इवेंट आमतौर पर डिवाइस की टच स्क्रीन के साथ उपयोगकर्ता के इंटरैक्शन से उत्पन्न होते हैं।
जब उपयोगकर्ता स्क्रीन को छूता है, तो हार्डवेयर स्पर्श का पता लगाता है और कच्चे स्पर्श डेटा की एक धारा उत्पन्न करता है जिसमें स्थान, दबाव और स्पर्श की अवधि जैसी जानकारी शामिल होती है।
यह कच्चा स्पर्श डेटा तब ऑपरेटिंग सिस्टम द्वारा संसाधित किया जाता है और उच्च-स्तरीय स्पर्श घटनाओं में परिवर्तित हो जाता है जिसे UIKit द्वारा नियंत्रित किया जा सकता है। ऑपरेटिंग सिस्टम यह निर्धारित करता है कि स्पर्श स्थान और दृश्य पदानुक्रम के आधार पर कौन सा UIWindow ऑब्जेक्ट टच इवेंट से मेल खाता है, और फिर उस ऑब्जेक्ट के UIResponder ऑब्जेक्ट को प्रोसेसिंग के लिए टच इवेंट भेजता है।
जब कोई टच इवेंट होता है, तो आईओएस ऑपरेटिंग सिस्टम यह निर्धारित करने के लिए हिट-टेस्टिंग एल्गोरिदम का उपयोग करता है कि कौन सा UIView या UIWindow ऑब्जेक्ट टच इवेंट से मेल खाता है।
हिट-टेस्टिंग एल्गोरिथ्म शीर्ष-स्तरीय UIWindow ऑब्जेक्ट पर शुरू होता है और दृश्य पदानुक्रम में प्रत्येक सबव्यूव की पुनरावर्ती जांच करता है जब तक कि यह गहनतम दृश्य नहीं पाता है जिसमें स्पर्श बिंदु होता है। यह यह जांच कर करता है कि स्पर्श बिंदु प्रत्येक सबव्यू के फ्रेम के अंदर है या नहीं।
हिट-परीक्षण गहराई-पहले रिवर्स प्री-ऑर्डर ट्रैवर्सल एल्गोरिदम का उपयोग करता है। दूसरे शब्दों में, एल्गोरिद्म पहले रूट नोड पर जाता है और फिर इसके उप-ट्री को उच्च से निम्न इंडेक्स तक ट्रेस करता है।
इस तरह का ट्रैवर्सल ट्रैवर्सल पुनरावृत्तियों की संख्या को कम करने और खोज प्रक्रिया को रोकने की अनुमति देता है, जब एक बार सबसे गहरा डिसेंडेंट व्यू जिसमें टच-पॉइंट शामिल होता है, मिल जाता है।
यह संभव है क्योंकि एक सबव्यू हमेशा इसके सुपरव्यू के सामने प्रस्तुत किया जाता है, और एक सिबलिंग व्यू हमेशा इसके सिबलिंग व्यूज के सामने प्रस्तुत किया जाता है, जो कि सबव्यूज एरे में कम इंडेक्स के साथ होता है। जब एकाधिक अतिव्यापी दृश्यों में एक विशिष्ट बिंदु होता है, तो सबसे दाहिने सबट्री में सबसे गहरा दृश्य सबसे सामने का दृश्य (1) होगा।
जैसा कि हम देख सकते हैं, ट्रैवर्स एल्गोरिथम हमेशा UIWindow ऑब्जेक्ट से शुरू होता है, इससे कोई फर्क नहीं पड़ता कि उपयोगकर्ता किसके साथ इंटरैक्ट करता है या नियंत्रित करता है।
और हम निश्चित रूप से इन घटनाओं को UIWindow क्लास के हिटटेस्ट मेथड में इंटरसेप्ट करके अपने उद्देश्य के लिए इसका उपयोग कर सकते हैं!
इतना ही! मुझे बताएं कि आप नीचे दी गई टिप्पणियों में क्या सोचते हैं।