აქტიური VPN-ის ამოცნობა sandbox-ში მოქცეულ Mac აპში
ამ კითხვისთვის საჯარო API არ არსებობს, და ინტერფეისის სახელის ხრიკი მხოლოდ ევრისტიკაა. ექვსი შემოწმება იმის გადასაწყვეტად, რას უნდა დაეყრდნოს თქვენი აპი სინამდვილეში.
გჭირდებათ ერთი ეკრანი, რომელიც სხვაგვარად იქცევა, როცა გვირაბი ჩართულია, და არ არსებობს გამოძახება, რომელიც ამას გეტყვით. ეს არის გამოშვების შეზღუდვა: macOS-ზე არცერთი საჯარო ჩარჩო არ იუწყება, დაკავშირებულია თუ არა თვითნებური VPN, ხოლო iOS-ზე სტატუსი ეკუთვნის იმ აპს, რომელმაც კონფიგურაცია დააყენა. ქვემოთ მოცემული შემოწმებები ამ ზღვრიდან მიდიან იქამდე, რისი გამოშვებაც შეგიძლიათ, და რომელიმე მათგანს შეუძლია ძიება ადრე დაასრულოს.
შემოწმება 1: საერთოდ შეიძლება კითხვაზე პასუხის გაცემა?
Sandbox კითხვას წყვეტს ნებისმიერ API-მდე. მესამე მხარის პროცესს არ შეუძლია სხვა მომწოდებლის გაფართოების ჩამოთვლა და ვერც ამ გაფართოების კონფიგურაციის წაკითხვა, ამიტომ კითხვისთვის მხარდაჭერილი ობიექტი არ არსებობს.
ყოველი გვერდის ავლა იმავე კედელს ეჯახება. ინტერფეისების სიები, scutil --nc list და სისტემის კონფიგურაციის პირდაპირი წაკითხვა ან მოითხოვს ნებართვებს, რომლებსაც sandbox აკავებს, ან დამოკიდებულია ქცევაზე, რომელიც Apple-ს არასდროს არ დაუპირებია. თუ გეგმას ერთ-ერთი მათგანი სჭირდება, პრობლემა თავად გეგმაა. დოკუმენტირებულ დეტალზე აგებული ფუნქცია მიწოდების თარიღიანი მხარდაჭერის ბილეთია.
შემოწმება 2: თქვენი აპი თავად მართავს გვირაბს?
თუ კი, საკუთარი კონფიგურაციისთვის მხარდაჭერილი პასუხი გაქვთ. ჩატვირთეთ პარამეტრები, დაამუშავეთ შეცდომა, შემდეგ წაიკითხეთ სტატუსი და გამოიწერეთ ცვლილებები ხშირი კითხვის ნაცვლად:
vpnManager.loadFromPreferences { error in
// handle a load failure before reading status
}
NotificationCenter.default.addObserver(
forName: .NEVPNStatusDidChange,
object: nil,
queue: nil
) { note in
let status = (note.object as? NEVPNConnection)?.status
}იყავით ზუსტი, რას აბრუნებს ეს: თქვენს მიერ დაყენებული გვირაბის მდგომარეობას. სხვა კლიენტის გამომყენებელი მომხმარებელი გამოჩნდება როგორც გათიშული, და ეს თქვენს კოდში შეცდომა არ არის. გადაწყვიტეთ, ამ ორი კითხვიდან რომელს სვამს თქვენი ფუნქცია სინამდვილეში, სანამ პასუხზე ააგებთ.
შემოწმება 3: რას გეტყვით ევრისტიკა რეალურად?
ფართოდ გადაწერილი მიდგომა სისტემის პროქსის ლექსიკონს ეკითხება მისი შემოსაზღვრული ჩანაწერების შესახებ და კითხულობს გასაღებებს, რომლებიც შემთხვევით ინტერფეისების სახელებია:
let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []გასაღები, რომელიც იწყება tap, tun, ppp, ipsec ან utun-ით, მიუთითებს, რომ არსებობს გვირაბის შემოსაზღვრული ინტერფეისი. მთლიანი სახელის შედარება მაშინვე ცდება, რადგან iOS 12 მოვიდა utun1-ით და utun2-ით, და ზოგიერთი პროფილი ჩნდება როგორც ipsec4, ppp0 ან utun0. შეადარეთ პრეფიქსები ამის ნაცვლად.
მიუხედავად ამისა, სახელი არ იდენტიფიცირებს მფლობელს. სისტემის ფუნქციები და სხვა მომწოდებლების გაფართოებებიც ქმნიან utun ინტერფეისებს, და ერთი შეიძლება არსებობდეს თქვენი ტრაფიკის არაფრის გადატანის გარეშე. წაიკითხეთ ეს როგორც მინიშნება, რომ ახლოს არის გვირაბის ფორმის რაღაც, და მეტი არაფერი. ცრუ დადებითი აქ იაფია, თუ მხოლოდ ერთ ფუნქციას ზღუდავთ, და ძვირი, თუ შესვლის ეკრანს ზღუდავთ.
შემოწმება 4: შეგიძლიათ სამაგიეროდ დანიშნულების შემოწმება?
თუ აპს მხოლოდ იმის ცოდნა სჭირდება, ხელმისაწვდომია თუ არა შიდა სერვისი, შეამოწმეთ ის სერვისი. ხანმოკლე ტესტი დროის ლიმიტით პასუხობს კითხვას, რომელზეც ფუნქცია რეალურადაა დამოკიდებული, და ის აგრძელებს მუშაობას, როცა მომხმარებელი კლიენტს იცვლის ან გვირაბი ფორმას იცვლის.
ხელმისაწვდომობა დაკვირვებაა თქვენს გზაზე. ინტერფეისის სახელი დასკვნაა თქვენი გზის მიმდებარე რაღაცაზე, ამიტომ ევრისტიკა ბაგების რეპორტებში კამათს ბადებს, ხოლო ტესტი მტკიცებულებას. თუ ტესტი ცდება, სანამ მომხმარებელი ამტკიცებს, რომ VPN ჩართულია, ახლა გაქვთ კონკრეტული გზა გამართვისთვის: სახელების გარჩევა, მარშრუტი ან სერვისის ნებართვა.
შემოწმება 5: შეუძლია პლატფორმას იმის იძულება, რაც გჭირდებათ?
როცა მოთხოვნა გარანტიაა, რომ გვირაბიდან არაფერი გაქცევა, პროფილია მისი ადგილი და არა დეტექტორი. includeAllNetworks-ის ჩართვა სრული გვირაბის კონფიგურაციაში iOS 14 ან უფრო ახალზე ცვლის პლატფორმის ქცევას იმის ნაცვლად, რომ თქვენს აპს დაასკვნევინოს. დროშა დოკუმენტირებულია NEVPNProtocol-ის ცნობარში.
ეს სხვა სახის პასუხია: იძულება დაკვირვების ნაცვლად. ის ასევე მხოლოდ თქვენს მიერ კონტროლირებულ პროფილებზე ვრცელდება, ამიტომ არ ეხმარება სამომხმარებლო აპს, რომელიც სხვის გვირაბს აკვირდება.
შემოწმება 6: გახადეთ წარუმატებლობა უსაფრთხო და დაკვირვებადი
გამორთეთ მხოლოდ ის შესაძლებლობა, რომელსაც გვირაბი სჭირდება, და დანარჩენი აპი გამოსაყენებლად დატოვეთ. დეტექტორი, რომელიც მთელ ინტერფეისს მალავს, როცა დარწმუნებული არ არის, შეფერხებას უქმნის ყველას, ვისი გვირაბიც ისეთ სახელს იყენებს, რომელიც არასდროს გივარაუდიათ. სამაგიეროდ დაუბრუნდით კონსერვატიულ ქცევას: ლოკალური ფუნქციები აგრძელებენ მუშაობას და გამოირთვება მხოლოდ ის დისტანციური გამოძახება, რომელსაც ნამდვილად სჭირდება გვირაბი. ეს არჩევანი პროდუქტის გადაწყვეტილებაა და იმსახურებს ევრისტიკის გვერდით ჩაწერას.
ჩაწერეთ, რაც დააკვირდით: ინტერფეისების სახელები, პლატფორმის ვერსია და ერთი ტესტის შედეგი. ეს შემდეგ ანგარიშს კამათიდან შემოწმებად აქცევს. შემდეგ უპირატესობა მიანიჭეთ მხარდაჭერილ დეკლარაციას, სადაც გაქვთ, რადგან მართული კონფიგურაცია განზრახვას ცხადად ატარებს და სახელების შემოწმების მიზეზის უმეტეს ნაწილს აცილებს.
თუ 1-დან 5-მდე შემოწმებებმა მხარდაჭერილი პასუხის გარეშე დაგტოვათ, გამოუშვით ტესტი და შედეგი პატიოსნად მონიშნეთ. დოკუმენტირებული საუკეთესო-ძალისხმევის სიგნალი უკეთესი პროდუქტის გადაწყვეტილებაა, ვიდრე კერძო API, რომელიც შემდეგ გამოშვებაში ტყდება.