Перезапустите приложение, спросите у менеджера состояние подключения — и он сообщает об отключении, хотя меню системы явно показывает работающий туннель. Либо вызов сохранения возвращает ошибку, которая ничего не объясняет, либо общий секрет объявляется отсутствующим через несколько секунд после назначения. Три симптома, один механизм: менеджер — это представление хранилища системы, а представление читается пустым, пока кто-то его не загрузит.

Прежде чем отлаживать что-либо из этого, определите, какой API вы должны использовать. Системный туннель IPsec или IKEv2 подходит встроенному менеджеру; протокол, который система не реализует, требует поставщика туннеля с собственной обработкой пакетов, и никакая комбинация полей этого не изменит.

Менеджер — представление хранилища

Создайте или получите менеджер, попросите его загрузить свои настройки и дайте обработчику завершения закончить, прежде чем читать статус или менять настройки протокола. Когда задача — перечислить сохранённые конфигурации, используйте вызов всех вариантов, а не переиспользуйте один экземпляр для двух целей. Пока загрузка не пришла, статус обычно недействителен, и трактовка недействительного как выключенного — именно та ошибка, из-за которой приложение выглядит неправильно только после перезапуска.

Запись следует тому же порядку. Попытка сохранения на менеджере, который ничего не загружал, может завершиться неудачей без полезного сообщения, потому что нет сохранённой идентичности, к которой применить изменение. Загрузите, измените, сохраните, затем снова прочитайте статус. Объект, к которому подключается система, — это сохранённый профиль, а не тот, который вы редактировали в памяти.

Изменения статуса приходят только пока вы смотрите

После загрузки настроек статус проходит через отключено, подключение, подключено, повторное подтверждение и отключение. Инициализируйте интерфейс одним чтением, а затем слушайте уведомление об изменении вместо опроса по таймеру. Опрос работает на переднем плане и лжёт в фоне, и именно так приложения остаются с индикатором, который никогда не завершается.

Уведомления приходят только пока приложение на переднем плане. Всё, что поддерживает состояние в фоне, после перезапуска будет выглядеть устаревшим, поэтому обновляйте при запуске и снова, когда приложение возвращается на передний план. Если туннелем владеет поставщик, управляйте им через соответствующий объект сеанса; обычное свойство соединения не моделирует жизненный цикл поставщика.

Секреты — это ссылки, а не строки

Сообщение об отсутствующем общем секрете редко означает, что его никто не назначил. Объект протокола хочет ссылку: одну для пароля пользователя и одну для предварительно общего ключа IPsec. Передача nil или ссылки, полученной из неправильной записи связки ключей, даёт ту же жалобу, что и пустая ячейка. Ошибка называет симптом и скрывает причину, поэтому люди вводят один и тот же секрет несколько раз.

Сначала запишите секрет как элемент обычного пароля, затем прочитайте обратно постоянную ссылку на него. Постоянная ссылка переживает перезапуск, в отличие от указателя в памяти, и именно она сериализуется в профиле. Выберите класс доступности, который по-прежнему разрешает доступ после разблокировки устройства, иначе туннель, которому нужно переподключиться на заблокированном экране, не пройдёт аутентификацию с совершенно действительным секретом.

У расширения своё представление связки ключей

Сетевое расширение — отдельный процесс, поэтому доступ приложения к связке ключей по умолчанию до него не доходит. Дайте обеим целям одну и ту же группу доступа к связке ключей в их правах, сохраните элемент один раз внутри этой группы и позвольте каждому процессу читать его. Без группы расширение ничего не находит и сообщает об ошибке учётных данных, которую приложение не может воспроизвести.

Если поставщик настраивается через свой объект конфигурации, не встраивайте секрет ещё и в приложение. Две копии расходятся, и расхождение проявляется как плохие учётные данные, а не как дублирование. Виджет или второй процесс, сообщающий другое состояние, имеет то же объяснение: каждому нужна группа, и каждый должен загрузить настройки, прежде чем читать.

Согласуйте API с протоколом

Встроенный менеджер несёт объекты протоколов IPsec и IKEv2. Он не превращается в универсальный клиент SSL VPN за счёт дополнительных полей, а неподходящий профиль может чисто сохраниться и всё равно никогда не подключиться. Решите, к какой категории вы относитесь, прежде чем исследовать статус, потому что ошибка статуса и неподдерживаемый протокол снаружи выглядят одинаково.

Для следующего перезапуска список короткий: загрузите настройки, прочитайте статус, держите подписки на изменения на переднем плане, пересоберите ссылки из общей группы и подтвердите, что объект протокола соответствует реализованному API. Пройти этот список — минута; гадать по нему — целый день.

Похожие статьи