앱을 다시 실행하고 관리자에게 연결 상태를 물으면 연결 끊김이라고 보고하지만, 시스템 메뉴는 분명히 살아 있는 터널을 보여 줍니다. 또는 저장 호출이 아무것도 설명하지 않는 오류를 반환하거나, 공유 암호가 할당된 지 몇 초 만에 없다고 선언됩니다. 세 가지 증상, 하나의 원리: 관리자는 시스템 저장소에 대한 뷰이고, 뷰는 누군가 로드할 때까지 비어 있는 것으로 읽힙니다.

이 중 무엇이든 디버깅하기 전에 어떤 API를 써야 하는지 정하세요. 시스템 IPsec 또는 IKEv2 터널은 내장 관리자에 맞습니다. 시스템이 구현하지 않는 프로토콜에는 자체 패킷 처리가 있는 터널 제공자가 필요하며, 필드 조합으로는 바뀌지 않습니다.

관리자는 저장소에 대한 뷰

관리자를 만들거나 가져오고, 환경설정 로드를 요청하고, 상태를 읽거나 프로토콜 설정을 바꾸기 전에 완료 핸들러가 끝나게 하세요. 저장된 구성을 열거하는 것이 작업이라면 하나의 인스턴스를 두 용도로 재사용하지 말고 모든 변형 호출을 사용하세요. 로드가 도착하기 전 상태는 보통 유효하지 않으며, 유효하지 않음을 꺼짐으로 해석하는 것이 바로 재실행 후에만 앱이 잘못 보이게 만드는 버그입니다.

쓰기도 같은 순서를 따릅니다. 아무것도 로드한 적 없는 관리자에 대한 저장 시도는 변경을 적용할 저장된 정체성이 없기 때문에 유용한 메시지 없이 실패할 수 있습니다. 로드하고 수정하고 저장한 다음 상태를 다시 읽으세요. 시스템이 연결하는 객체는 저장된 프로필이며, 메모리에서 편집하던 객체가 아닙니다.

상태 변화는 보고 있는 동안에만 도착합니다

환경설정이 로드되면 상태는 연결 끊김, 연결 중, 연결됨, 재확인, 연결 해제 중을 거칩니다. 한 번의 읽기로 인터페이스를 초기화한 다음 타이머로 폴링하는 대신 변경 알림을 구독하세요. 폴링은 전면에서는 동작하고 배경에서는 거짓말을 하며, 그래서 앱에는 끝나지 않는 스피너가 남습니다.

알림은 앱이 전면에 있는 동안에만 도착합니다. 배경에서 상태를 유지하는 모든 것은 재실행 후 오래된 것으로 보이므로, 실행 시 그리고 앱이 전면으로 돌아올 때 다시 새로 고치세요. 제공자가 터널을 소유한다면 해당 세션 객체를 통해 구동하세요. 단순한 연결 속성은 제공자의 수명 주기를 모델링하지 않습니다.

암호는 문자열이 아니라 참조

공유 암호가 없다는 보고는 누구도 할당하지 않았다는 뜻인 경우가 드뭅니다. 프로토콜 객체는 참조를 원합니다. 하나는 사용자 암호용, 하나는 IPsec 사전 공유 키용입니다. nil을 전달하거나 잘못된 키체인 항목에서 파생된 참조를 전달하면 빈 슬롯과 같은 불평이 나옵니다. 오류는 증상을 말하고 원인을 숨기므로, 사람들은 같은 암호를 여러 번 다시 입력합니다.

먼저 암호를 일반 암호 항목으로 쓰고, 그다음 그에 대한 영구 참조를 다시 읽으세요. 영구 참조는 메모리에 있는 포인터와 달리 재실행 후에도 살아남으며, 프로필이 직렬화하는 표현이 바로 그것입니다. 기기가 잠금 해제된 뒤에도 접근을 허용하는 접근성 등급을 고르세요. 그렇지 않으면 잠긴 화면에서 다시 연결해야 하는 터널은 완전히 유효한 암호로도 인증에 실패합니다.

확장은 자체 키체인 뷰를 가진다

네트워크 확장은 별도 프로세스이므로 앱의 기본 키체인 접근이 거기에 닿지 않습니다. 두 대상에게 각자의 자격에 같은 키체인 접근 그룹을 주고, 항목을 그 그룹 안에 한 번만 저장하고, 각 프로세스가 그것을 읽게 하세요. 그룹이 없으면 확장은 아무것도 찾지 못하고 앱이 재현할 수 없는 자격 증명 실패를 보고합니다.

제공자가 자체 제공자 구성 객체로 구성된다면 암호를 앱 안에도 포함하지 마세요. 두 사본이 어긋나고, 그 어긋남은 중복이 아니라 잘못된 자격 증명으로 나타납니다. 다른 상태를 보고하는 위젯이나 두 번째 프로세스도 설명은 같습니다. 각자 그룹이 필요하고, 각자 읽기 전에 환경설정을 로드해야 합니다.

API를 프로토콜에 맞추세요

내장 관리자는 IPsec과 IKEv2 프로토콜 객체를 담습니다. 추가 필드로 일반 SSL VPN 클라이언트가 되지 않으며, 맞지 않는 프로필은 깔끔하게 저장되고도 결코 연결되지 않을 수 있습니다. 상태를 조사하기 전에 어느 범주인지 정하세요. 상태 버그와 지원되지 않는 프로토콜은 밖에서 보면 같기 때문입니다.

다음 재실행을 위해 점검 목록은 짧습니다. 환경설정을 로드하고, 상태를 읽고, 변경 구독을 전면에 유지하고, 공유 그룹에서 참조를 다시 만들고, 프로토콜 객체가 구현한 API와 일치하는지 확인하세요. 그 목록을 실행하는 데 일 분이 걸리고, 추측하는 데 반나절이 걸립니다.

관련 글