Перезапустіть застосунок, запитайте в менеджера стан з'єднання — і він повідомляє про відключення, хоча меню системи явно показує робочий тунель. Або виклик збереження повертає помилку, яка нічого не пояснює, або спільний секрет оголошується відсутнім через кілька секунд після призначення. Три симптоми, один механізм: менеджер — це подання сховища системи, а подання читається порожнім, доки хтось його не завантажить.

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

Менеджер — це подання сховища

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

Запис дотримується того самого порядку. Спроба збереження на менеджері, який нічого не завантажував, може не вдатися без корисного повідомлення, бо немає збереженої ідентичності, до якої застосувати зміну. Завантажте, змініть, збережіть, а потім знову прочитайте стан. Об'єкт, до якого підключається система, — це збережений профіль, а не той, який ви редагували в пам'яті.

Зміни стану надходять лише поки ви спостерігаєте

Після завантаження налаштувань стан проходить через відключено, підключення, підключено, повторне підтвердження й відключення. Ініціалізуйте інтерфейс одним читанням, а потім слухайте сповіщення про зміну замість опитування за таймером. Опитування працює на передньому плані й бреше у фоні, і саме так застосунки залишаються з індикатором, який ніколи не завершується.

Сповіщення надходять лише поки застосунок на передньому плані. Усе, що підтримує стан у фоні, після перезапуску виглядатиме застарілим, тому оновлюйте під час запуску і знову, коли застосунок повертається на передній план. Якщо тунелем володіє постачальник, керуйте ним через відповідний об'єкт сеансу; звичайна властивість з'єднання не моделює життєвий цикл постачальника.

Секрети — це посилання, а не рядки

Повідомлення про відсутній спільний секрет рідко означає, що його ніхто не призначив. Об'єкт протоколу хоче посилання: одне для пароля користувача і одне для попередньо спільного ключа IPsec. Передача nil або посилання, отриманого з неправильного запису зв'язки ключів, дає ту саму скаргу, що й порожня комірка. Помилка називає симптом і приховує причину, тому люди вводять той самий секрет кілька разів.

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

Розширення має власне подання зв'язки ключів

Мережеве розширення — окремий процес, тому доступ застосунку до зв'язки ключів за замовчуванням до нього не доходить. Дайте обом цілям ту саму групу доступу до зв'язки ключів у їхніх правах, збережіть елемент один раз усередині цієї групи і дозвольте кожному процесу читати його. Без групи розширення нічого не знаходить і повідомляє про помилку облікових даних, яку застосунок не може відтворити.

Якщо постачальник налаштовується через свій об'єкт конфігурації, не вбудовуйте секрет ще й у застосунок. Дві копії розходяться, і розходження проявляється як погані облікові дані, а не як дублювання. Віджет або другий процес, що повідомляє про інший стан, має те саме пояснення: кожному потрібна група, і кожен має завантажити налаштування, перш ніж читати.

Узгодьте API з протоколом

Вбудований менеджер несе об'єкти протоколів IPsec і IKEv2. Він не стає універсальним клієнтом SSL VPN через додаткові поля, а невідповідний профіль може чисто зберегтися і все одно ніколи не підключитися. Вирішіть, до якої категорії ви належите, перш ніж досліджувати стан, бо помилка стану й непідтримуваний протокол зовні виглядають однаково.

Для наступного перезапуску список короткий: завантажте налаштування, прочитайте стан, тримайте підписки на зміни на передньому плані, перебудуйте посилання зі спільної групи й підтвердьте, що об'єкт протоколу відповідає реалізованому API. Пройти цей список — хвилина; гадати щодо нього — цілий день.

Схожі статті