Η κατάσταση του NEVPNManager είναι άκυρη μέχρι να φορτωθούν οι προτιμήσεις
Η ανάγνωση κατάστασης ή η αποθήκευση πριν ολοκληρωθεί το loadFromPreferences δίνει ξεπερασμένα ή αποτυχημένα αποτελέσματα. Η σειρά φόρτωσης, οι αναφορές κλειδοθήκης και οι ομάδες πρόσβασης το καθορίζουν.
Επανεκκινήστε την εφαρμογή, ζητήστε από τον διαχειριστή την κατάσταση σύνδεσης και αυτός αναφέρει αποσυνδεδεμένο, ενώ το μενού συστήματος δείχνει καθαρά ένα ενεργό τούνελ. Ή μια κλήση αποθήκευσης επιστρέφει σφάλμα που δεν εξηγεί τίποτα, ή ένα κοινόχρηστο μυστικό δηλώνεται απόν δευτερόλεπτα αφού ανατέθηκε. Τρία συμπτώματα, ένας μηχανισμός: ο διαχειριστής είναι όψη πάνω σε μια αποθήκη του συστήματος, και μια όψη διαβάζεται κενή μέχρι κάποιος να τη φορτώσει.
Πριν αποσφαλματώσετε οτιδήποτε από αυτά, ξεκαθαρίστε ποιο API πρέπει να χρησιμοποιήσετε. Ένα τούνελ IPsec ή IKEv2 του συστήματος ταιριάζει στον ενσωματωμένο διαχειριστή· ένα πρωτόκολλο που το σύστημα δεν υλοποιεί χρειάζεται πάροχο τούνελ με δική σας διαχείριση πακέτων, και κανένας συνδυασμός πεδίων δεν το αλλάζει.
Ο διαχειριστής είναι όψη πάνω σε αποθήκη
Δημιουργήστε ή ανακτήστε τον διαχειριστή, ζητήστε του να φορτώσει τις προτιμήσεις του και αφήστε τον χειριστή ολοκλήρωσης να τελειώσει πριν διαβάσετε κατάσταση ή αλλάξετε ρυθμίσεις πρωτοκόλλου. Όταν το ζητούμενο είναι η απαρίθμηση αποθηκευμένων διαμορφώσεων, χρησιμοποιήστε την κλήση όλων των παραλλαγών αντί να επαναχρησιμοποιείτε ένα στιγμιότυπο για δύο σκοπούς. Πριν φτάσει η φόρτωση, η κατάσταση είναι συνήθως άκυρη, και η αντιστοίχιση του άκυρου σε κλειστό είναι ακριβώς το σφάλμα που κάνει μια εφαρμογή να φαίνεται λάθος μόνο μετά από επανεκκίνηση.
Η εγγραφή ακολουθεί την ίδια σειρά. Μια προσπάθεια αποθήκευσης σε διαχειριστή που δεν φόρτωσε ποτέ τίποτα μπορεί να αποτύχει χωρίς χρήσιμο μήνυμα, γιατί δεν υπάρχει αποθηκευμένη ταυτότητα στην οποία να εφαρμοστεί η αλλαγή. Φορτώστε, τροποποιήστε, αποθηκεύστε και μετά διαβάστε ξανά την κατάσταση. Το αντικείμενο στο οποίο συνδέεται το σύστημα είναι το αποθηκευμένο προφίλ, όχι αυτό που επεξεργαζόσασταν στη μνήμη.
Οι αλλαγές κατάστασης φτάνουν μόνο όσο κοιτάτε
Μόλις φορτωθούν οι προτιμήσεις, η κατάσταση περνά από αποσυνδεδεμένο, συνδέεται, συνδεδεμένο, επαναβεβαιώνει και αποσυνδέεται. Αρχικοποιήστε το περιβάλλον από μία ανάγνωση και μετά ακούτε την ειδοποίηση αλλαγής αντί να ερωτάτε με χρονόμετρο. Η ερώτηση λειτουργεί στο προσκήνιο και λέει ψέματα στο παρασκήνιο, κι έτσι οι εφαρμογές καταλήγουν με έναν δείκτη που δεν ολοκληρώνεται ποτέ.
Οι ειδοποιήσεις φτάνουν μόνο όσο η εφαρμογή είναι στο προσκήνιο. Οτιδήποτε διατηρεί κατάσταση στο παρασκήνιο θα φαίνεται ξεπερασμένο μετά από επανεκκίνηση, οπότε ανανεώστε κατά την εκκίνηση και ξανά όταν η εφαρμογή επιστρέφει στο προσκήνιο. Αν κάποιος πάροχος κατέχει το τούνελ, οδηγήστε το μέσω του αντίστοιχου αντικειμένου συνεδρίας· η απλή ιδιότητα σύνδεσης δεν μοντελοποιεί τον κύκλο ζωής του παρόχου.
Τα μυστικά είναι αναφορές, όχι συμβολοσειρές
Η αναφορά ότι λείπει ένα κοινόχρηστο μυστικό σπάνια σημαίνει ότι δεν το ανέθεσε κανείς. Το αντικείμενο πρωτοκόλλου θέλει αναφορά: μία για τον κωδικό πρόσβασης του χρήστη και μία για το προκοινόχρηστο κλειδί IPsec. Το πέρασμα nil, ή αναφοράς που προέρχεται από λανθασμένη καταχώριση κλειδοθήκης, δίνει το ίδιο παράπονο με μια κενή θέση. Το σφάλμα ονομάζει το σύμπτωμα και κρύβει την αιτία, γι' αυτό οι άνθρωποι ξαναγράφουν το ίδιο μυστικό αρκετές φορές.
Γράψτε πρώτα το μυστικό ως στοιχείο γενικού κωδικού πρόσβασης και μετά διαβάστε πίσω μια επίμονη αναφορά σε αυτό. Μια επίμονη αναφορά επιβιώνει από επανεκκίνηση, σε αντίθεση με δείκτη στη μνήμη, και είναι η αναπαράσταση που σειριοποιεί το προφίλ. Διαλέξτε κλάση προσβασιμότητας που επιτρέπει ακόμη πρόσβαση αφού ξεκλειδωθεί η συσκευή, αλλιώς ένα τούνελ που πρέπει να επανασυνδεθεί σε κλειδωμένη οθόνη θα αποτύχει στην ταυτοποίηση με ένα απολύτως έγκυρο μυστικό.
Η επέκταση έχει τη δική της όψη κλειδοθήκης
Μια επέκταση δικτύου είναι ξεχωριστή διεργασία, οπότε η προεπιλεγμένη πρόσβαση της εφαρμογής στην κλειδοθήκη δεν τη φτάνει. Δώστε και στους δύο στόχους την ίδια ομάδα πρόσβασης κλειδοθήκης στα δικαιώματά τους, αποθηκεύστε το στοιχείο μία φορά μέσα σε αυτή την ομάδα και αφήστε κάθε διεργασία να το διαβάζει. Χωρίς την ομάδα, η επέκταση δεν βρίσκει τίποτα και αναφέρει αποτυχία διαπιστευτηρίων που η εφαρμογή δεν μπορεί να αναπαραγάγει.
Αν ο πάροχος διαμορφώνεται μέσω του αντικειμένου διαμόρφωσης παρόχου, μην ενσωματώσετε το μυστικό και μέσα στην εφαρμογή. Δύο αντίγραφα αποκλίνουν, και η απόκλιση εμφανίζεται ως κακά διαπιστευτήρια και όχι ως διπλοτυπία. Ένα widget ή μια δεύτερη διεργασία που αναφέρει άλλη κατάσταση έχει την ίδια εξήγηση: το καθένα χρειάζεται την ομάδα και το καθένα πρέπει να φορτώσει τις προτιμήσεις πριν διαβάσει.
Ταιριάξτε το API με το πρωτόκολλο
Ο ενσωματωμένος διαχειριστής φέρει αντικείμενα πρωτοκόλλου IPsec και IKEv2. Δεν γίνεται γενικός πελάτης SSL VPN μέσω πρόσθετων πεδίων, και ένα αταίριαστο προφίλ μπορεί να αποθηκευτεί καθαρά και παρόλα αυτά να μη συνδεθεί ποτέ. Αποφασίστε σε ποια κατηγορία ανήκετε πριν ερευνήσετε την κατάσταση, γιατί ένα σφάλμα κατάστασης και ένα μη υποστηριζόμενο πρωτόκολλο φαίνονται ίδια από έξω.
Για την επόμενη επανεκκίνηση, η λίστα ελέγχου είναι σύντομη: φορτώστε τις προτιμήσεις, διαβάστε την κατάσταση, κρατήστε τις συνδρομές αλλαγών στο προσκήνιο, ξαναχτίστε τις αναφορές από την κοινή ομάδα και επιβεβαιώστε ότι το αντικείμενο πρωτοκόλλου ταιριάζει με το API που υλοποιήσατε. Η εκτέλεση αυτής της λίστας παίρνει ένα λεπτό· το μάντεμα πάνω της παίρνει ένα απόγευμα.