অনেক অ্যাপের একটি বৈশিষ্ট্য রয়েছে যা একটি নির্দিষ্ট সময়ের নিষ্ক্রিয়তার পরে স্বয়ংক্রিয়ভাবে আপনাকে লগ আউট করে। যাইহোক, এই অ্যাপগুলির মধ্যে কিছু API নিষ্ক্রিয়তার উপর ভিত্তি করে আপনাকে লগ আউট করে, অন্যরা UIView নিয়ন্ত্রণগুলিকে ওভাররাইড করে একটি লগআউট টাইমার প্রয়োগ করে। এই নিবন্ধে, আমরা হিটটেস্ট পদ্ধতি ব্যবহার করে এই আচরণটি অর্জন করার একটি ভাল উপায় অন্বেষণ করব। এবং বর্তমান সময়ের সাথে শেষ লগইন/এপিআই কলের সময়ের পার্থক্যের উপর ভিত্তি করে কিছু অ্যাপ আপনাকে লগ আউট করে। শেষ পদ্ধতির সমস্যা হল যে আপনি লগইন সময় পয়েন্টে একটি ডিভাইসে আপনার সময় ম্যানুয়ালি সেট করে আপনার সেশনকে ক্রমাগত জীবিত রাখতে পারেন।
প্রথম পদ্ধতির সমস্যা হল যে কিছু ব্যবহারকারী লগ আউট হতে পারে এমনকি যদি তারা শুধুমাত্র বিষয়বস্তুর মাধ্যমে স্ক্রোল করে এবং ব্যাকএন্ডে কোনো অনুরোধ না করে। একজন ব্যবহারকারীর কথা কল্পনা করুন যিনি একটি নির্দিষ্ট ব্যাঙ্কিং পণ্য খোলার আগে শর্তাবলী পড়েন এবং তিনি লগ আউট হয়ে যাচ্ছেন। আমরা অবশ্যই এটি এড়াতে চাই।
দ্বিতীয় পদ্ধতির সমস্যা হল যে একটি বিদ্যমান কোডবেসে নিষ্ক্রিয়তা লগআউট বৈশিষ্ট্যটি বাস্তবায়ন করা কঠিন হতে পারে, বিশেষ করে যদি অ্যাপটির কাস্টম ভিউ সহ একটি বড় কোডবেস থাকে।
এখানেই হিটটেস্ট পদ্ধতি খুব সহায়ক হতে পারে।
তালিকাভুক্ত সমস্যাগুলিকে প্রাধান্য দেওয়ার জন্য আমরা হিটটেস্ট পদ্ধতি সহ একটি হ্যাক ব্যবহার করতে পারি।
আসুন ধরে নিই যে আমাদের কাছে ইতিমধ্যেই একটি ক্লাসের একটি বাস্তবায়িত সংস্করণ রয়েছে যা ব্যবহারকারীর কার্যকলাপের সময় ট্র্যাক করার জন্য দায়ী৷
আমরা নিম্নলিখিত 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-এর একটি সাবক্লাস ঘোষণা করতে পারেন এবং সেখানে একটি হিটটেস্ট পদ্ধতি ওভাররাইড করতে পারেন।
iOS- এ টাচ ইভেন্টগুলি সাধারণত ডিভাইসের টাচ স্ক্রিনের সাথে ব্যবহারকারীর মিথস্ক্রিয়া থেকে উদ্ভূত হয়।
যখন ব্যবহারকারী স্ক্রীন স্পর্শ করে, তখন হার্ডওয়্যার স্পর্শ সনাক্ত করে এবং কাঁচা স্পর্শ ডেটার একটি স্ট্রীম তৈরি করে যাতে স্থান, চাপ এবং স্পর্শের সময়কালের মতো তথ্য অন্তর্ভুক্ত থাকে।
এই কাঁচা স্পর্শ ডেটা অপারেটিং সিস্টেম দ্বারা প্রক্রিয়া করা হয় এবং উচ্চ-স্তরের স্পর্শ ইভেন্টে রূপান্তরিত হয় যা UIKit দ্বারা পরিচালনা করা যেতে পারে। অপারেটিং সিস্টেম নির্ধারণ করে কোন UIWindow অবজেক্টের সাথে টাচ ইভেন্টটি স্পর্শের অবস্থান এবং ভিউ হায়ারার্কির উপর ভিত্তি করে, এবং তারপর প্রক্রিয়াকরণের জন্য সেই বস্তুর UIResponder অবজেক্টে স্পর্শ ইভেন্ট পাঠায়।
যখন একটি স্পর্শ ঘটনা ঘটে, iOS অপারেটিং সিস্টেমটি স্পর্শ ইভেন্টটি কোন UIView বা UIWindow অবজেক্টের সাথে সামঞ্জস্যপূর্ণ তা নির্ধারণ করতে একটি হিট-টেস্টিং অ্যালগরিদম ব্যবহার করে৷
হিট-টেস্টিং অ্যালগরিদম শীর্ষ-স্তরের UIWindow অবজেক্ট থেকে শুরু হয় এবং টাচ পয়েন্ট ধারণ করে এমন গভীরতম ভিউ না পাওয়া পর্যন্ত ভিউ হায়ারার্কিতে প্রতিটি সাবভিউকে বারবার চেক করে। এটি প্রতিটি সাবভিউ-এর ফ্রেমের ভিতরে টাচ পয়েন্ট আছে কিনা তা পরীক্ষা করে এটি করে।
হিট-টেস্টিং একটি গভীরতা-প্রথম বিপরীত প্রি-অর্ডার ট্রাভার্সাল অ্যালগরিদম ব্যবহার করে। অন্য কথায়, অ্যালগরিদম প্রথমে রুট নোড পরিদর্শন করে এবং তারপর তার সাবট্রিগুলিকে উচ্চ থেকে নিম্ন সূচকে অতিক্রম করে।
এই ধরনের ট্রাভার্সাল ট্রাভার্সাল পুনরাবৃত্তির সংখ্যা হ্রাস করতে এবং স্পর্শ-পয়েন্ট ধারণ করে এমন প্রথম গভীরতম বংশধর দৃশ্য পাওয়া গেলে অনুসন্ধান প্রক্রিয়া বন্ধ করার অনুমতি দেয়।
এটি সম্ভব যেহেতু একটি সাবভিউ সর্বদা তার তত্ত্বাবধানের সামনে রেন্ডার করা হয় এবং একটি ভাইবোন ভিউ সর্বদা সাবভিউ অ্যারেতে একটি নিম্ন সূচক সহ তার ভাইবোন ভিউগুলির সামনে রেন্ডার করা হয়। যখন একাধিক ওভারল্যাপিং দৃশ্যে একটি নির্দিষ্ট বিন্দু থাকে, তখন ডানদিকের সাবট্রির গভীরতম দৃশ্যটি হবে সামনের দৃশ্য (1) ।
আমরা দেখতে পাচ্ছি, ট্রাভার্স অ্যালগরিদম সর্বদা UIWindow অবজেক্ট থেকে শুরু হয়, ব্যবহারকারী যে ভিউ বা নিয়ন্ত্রণ ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করুক না কেন।
এবং আমরা অবশ্যই UIWindow ক্লাসের হিটটেস্ট পদ্ধতিতে এই ইভেন্টগুলিকে বাধা দিয়ে আমাদের উদ্দেশ্যে এটি ব্যবহার করতে পারি!
এটাই! নীচের মন্তব্যে আপনি কি মনে করেন তা আমাকে জানান।