Hai mã lỗi giải thích phần lớn những lần thử đầu tiên với VPN Network Extension trên iOS: NEVPNErrorDomain Code=4 và Code=5. Không mã nào là phàn nàn từ máy chủ. Một mã xuất hiện khi ứng dụng ghi cài đặt vào một đối tượng chưa từng được đọc từ đĩa, mã còn lại khi chính việc ghi thất bại, thường là vì hồ sơ được lưu trong khi vẫn đang tắt. Cả hai đều được sửa bằng cách thay đổi thứ tự bốn lệnh gọi, không phải bằng cách chạm vào các tham số IKEv2.

Tải trước, nếu không việc lưu chẳng có gì để so sánh

Trình quản lý giữ một bản sao của hồ sơ đã lưu, và đối tượng bạn sửa không phải bản sao đó cho đến khi bạn đọc nó. Gọi loadFromPreferences trước, sửa bên trong trình xử lý hoàn tất của nó, rồi lưu. Nếu bỏ qua bước đọc, framework sẽ thấy sự không khớp giữa thứ nó có và thứ bạn đang ghi. Trong Swift hình thức giống nhau ở mọi bước, và mỗi bước thuộc về closure riêng của nó:

let mgr = NEVPNManager.shared()
mgr.loadFromPreferences { loadErr in
    guard loadErr == nil else { return }
    let proto = NEVPNProtocolIKEv2()
    proto.serverAddress = "vpn.example.net"
    proto.username = "alice"
    proto.useExtendedAuthentication = true
    mgr.protocolConfiguration = proto
    mgr.isEnabled = true
    mgr.saveToPreferences { saveErr in
        // do not start here; reload, then connect
    }
}

Khởi động đường hầm từ bên trong closure lưu là cùng một lỗi ở chỗ khác. Nó chạy trước khi hồ sơ được đọc lại, nên lệnh gọi khởi động thấy trạng thái bạn đã dựng chứ không phải trạng thái đã được lưu. Closure lưu kết thúc bằng loadFromPreferences thứ hai, và chỉ trình xử lý hoàn tất đó gọi startVPNTunnel.

Cờ bật là một phần của việc lưu

Hồ sơ đã lưu là bất động cho đến khi được bật. Đặt isEnabled = true trong cùng lần ghi, nếu không hồ sơ sẽ nằm trên đĩa ở trạng thái tắt và startVPNTunnel từ chối ngay cả khi Cài đặt hiển thị một cấu hình trông có vẻ đầy đủ.

Các sửa đổi bên ngoài là nửa còn lại. Nếu người dùng thay đổi điều gì đó trong Cài đặt, hoặc thiết bị di chuyển giữa các mạng, hãy đọc lại trước khi tin vào những giá trị bạn vẫn giữ trong bộ nhớ. Đối tượng không quan sát những thay đổi đó thay bạn. Một bản sao cũ là cách ứng dụng ghi một hồ sơ âm thầm hoàn tác sửa đổi của người dùng. Hai trường liền kề gây ra rắc rối âm thầm cùng lúc: các quy tắc on-demand phải là một mảng đối tượng quy tắc chứ không phải một chỗ giữ chỗ rỗng, và disconnectOnSleep phải phản ánh hành vi bạn đã chọn chứ không phải giá trị mặc định được sao chép.

Chỉ có hai giao thức dành cho ứng dụng bên thứ ba

Network Extension cung cấp cho ứng dụng IPsec và IKEv2. L2TP và PPTP ở lại bên trong hệ thống, nên ứng dụng cần chúng không thể có, và câu trả lời thực tế là một cổng hỗ trợ IKEv2 hoặc một hồ sơ cấu hình được quản lý.

Thông tin đăng nhập cũng theo mẫu đó. Đặt mật khẩu vào Keychain và truyền một tham chiếu lâu dài thay vì chuỗi. Tham chiếu rỗng khi lưu thường có nghĩa là việc tra cứu chạy trước khi mục được ghi, không phải trình quản lý bị hỏng.

Cả hai là quyết định thiết kế chứ không phải cách lách. Ứng dụng giữ mật khẩu trong tùy chọn riêng của nó chọn con đường mà framework không khuyến khích, và thất bại nó tạo ra đọc như một lỗi lưu.

Loại trừ quyền trước khi viết lại mã

Khi loadFromPreferences không bao giờ gọi lại, nguyên nhân khả dĩ là thiếu khả năng Network Extension hoặc một hồ sơ cấp phép không mang nó. Thất bại đó treo thay vì báo lỗi, và đó là lý do mã đang chạy bị viết lại hàng giờ. Kiểm tra quyền trên bản dựng đã ký mà bạn định phát hành, vì chạy trên trình mô phỏng và trên thiết bị có thể khác nhau và mục tiêu quan trọng là thiết bị. Mở cài đặt ký của mục tiêu và xác nhận khả năng Network Extension có mặt cho đúng bản dựng đó.

Hồ sơ cấp phép không có quyền thất bại theo cùng cách trên phần cứng, trong khi cùng bản dựng có thể tải bình thường trong trình mô phỏng. Kiểm tra kho lưu trữ đã ký trên thiết bị thật trước khi viết lại thứ tự các lệnh gọi.

Hãy xem những thay đổi trạng thái, không phải giả định

Quan sát NEVPNStatusDidChangeNotification và ghi lại manager.connection.status sau mỗi bước. Một trạng thái không bao giờ rời khỏi invalid nghĩa là hồ sơ chưa được lưu hoặc thiếu quyền. Một kết nối đạt tới connecting và không bao giờ kết nối chỉ ra đề xuất hoặc thông tin đăng nhập, và đó là một cuộc điều tra khác với bằng chứng khác.

Xác nhận hồ sơ xuất hiện dưới Cài đặt, Chung, VPN, và ghi lại lỗi từ mỗi closure. Hai sự thật đó tách lỗi thứ tự khỏi lỗi quyền mà không cần đoán.

Bài viết liên quan