دو کد خطا بیشتر تلاش‌های نخست برای VPN از نوع Network Extension در iOS را توضیح می‌دهند: NEVPNErrorDomain Code=4 و Code=5. هیچ‌کدام شکایت سرور نیست. یکی ظاهر می‌شود وقتی برنامه تنظیمات را در شیئی می‌نویسد که هرگز از دیسک خوانده نشده، و دیگری وقتی خود نوشتن شکست می‌خورد، اغلب چون پروفایل در حالی ذخیره می‌شود که هنوز غیرفعال است. هر دو با تغییر ترتیب چهار فراخوانی درست می‌شوند، نه با دست زدن به پارامترهای IKEv2.

اول بارگذاری کنید، وگرنه ذخیره چیزی برای مقایسه ندارد

مدیر نسخه‌ای از پروفایل ذخیره‌شده را نگه می‌دارد و شیئی که ویرایش می‌کنید تا آن را نخوانید همان نسخه نیست. نخست loadFromPreferences را فراخوانی کنید، داخل کنترل‌کننده تکمیل آن ویرایش کنید، سپس ذخیره کنید. اگر خواندن را جا بیندازید، چارچوب ناسازگاری میان آنچه دارد و آنچه می‌نویسید می‌بیند. در Swift شکل برای هر گام یکسان است و هر گام به بستار خودش تعلق دارد:

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
    }
}

شروع تونل از داخل بستار ذخیره همان اشتباه در جای دیگری است. پیش از آنکه پروفایل دوباره خوانده شود اجرا می‌شود، پس فراخوانی شروع حالتی را می‌بیند که ساخته‌اید نه حالتی که ذخیره شده. بستار ذخیره با یک loadFromPreferences دوم پایان می‌یابد و تنها همان کنترل‌کننده تکمیل startVPNTunnel را فراخوانی می‌کند.

پرچم فعال‌سازی بخشی از ذخیره است

پروفایل ذخیره‌شده تا روشن نشود بی‌اثر است. isEnabled = true را در همان نوشتن تنظیم کنید، وگرنه پروفایل غیرفعال روی دیسک می‌نشیند و startVPNTunnel رد می‌کند حتی وقتی تنظیمات پیکربندی‌ای کامل به نظر می‌رسد را نشان می‌دهد.

ویرایش‌های بیرونی نیمه دیگر ماجراست. اگر کاربر چیزی را در تنظیمات عوض کند، یا دستگاه میان شبکه‌ها جابه‌جا شود، پیش از اعتماد به مقادیری که هنوز در حافظه دارید دوباره بخوانید. شیء آن تغییرها را برای شما رصد نمی‌کند. نسخه کهنه راهی است که برنامه پروفایلی می‌نویسد که بی‌صدا ویرایش کاربر را برمی‌گرداند. دو فیلد مجاور در همان لحظه دردسر خاموش می‌سازند: قواعد on-demand باید آرایه‌ای از اشیای قاعده باشند نه جای‌گیر خالی، و disconnectOnSleep باید رفتاری را که انتخاب کرده‌اید بازتاب دهد نه یک پیش‌فرض کپی‌شده.

فقط دو پروتکل برای برنامه‌های شخص ثالث در دسترس است

Network Extension به برنامه‌ها IPsec و IKEv2 می‌دهد. L2TP و PPTP درون سامانه می‌مانند، پس برنامه‌ای که به آنها نیاز دارد نمی‌تواند داشته باشدشان، و پاسخ‌های واقع‌بینانه دروازه‌ای با پشتیبانی IKEv2 یا پروفایل پیکربندی مدیریت‌شده است.

اعتبارنامه‌ها همین الگو را دنبال می‌کنند. گذرواژه را در Keychain بگذارید و به‌جای رشته یک ارجاع پایدار بدهید. ارجاع تهی هنگام ذخیره معمولاً یعنی جست‌وجو پیش از نوشته شدن آیتم اجرا شده، نه اینکه مدیر خراب است.

هر دو تصمیم طراحی‌اند نه راه‌حل میان‌بر. برنامه‌ای که گذرواژه را در ترجیحات خودش نگه می‌دارد راهی را برمی‌گزیند که چارچوب تشویق نمی‌کند، و شکستی که تولید می‌کند مانند خطای ذخیره خوانده می‌شود.

پیش از بازنویسی کد، حق را کنار بگذارید

وقتی loadFromPreferences اصلاً پاسخ نمی‌دهد، علت محتمل نبود توانایی Network Extension یا پروفایل تأمینی است که آن را حمل نمی‌کند. آن شکست به‌جای دادن خطا معلق می‌ماند، و همین است که کد سالم ساعت‌ها بازنویسی می‌شود. حق را روی بیلد امضاشده‌ای که می‌خواهید منتشر کنید بررسی کنید، چون اجرا در شبیه‌ساز و اجرا روی دستگاه می‌تواند متفاوت باشد و هدفی که مهم است دستگاه است. تنظیمات امضای هدف را باز کنید و تأیید کنید که توانایی Network Extension برای همان بیلد دقیق موجود است.

پروفایل تأمینی بدون حق روی سخت‌افزار به همان شکل شکست می‌خورد، در حالی که همان بیلد ممکن است در شبیه‌ساز عادی بارگذاری شود. پیش از بازنویسی ترتیب فراخوانی، آرشیو امضاشده را روی دستگاه واقعی آزمایش کنید.

تغییرهای وضعیت را ببینید، نه گمانه‌ها را

NEVPNStatusDidChangeNotification را رصد کنید و پس از هر گام manager.connection.status را ثبت کنید. وضعیتی که هرگز از invalid بیرون نمی‌آید یعنی پروفایل ذخیره نشده یا حق وجود ندارد. اتصالی که به connecting می‌رسد و هرگز وصل نمی‌شود به پیشنهاد یا اعتبارنامه‌ها اشاره دارد، که تحقیقی دیگر با شواهدی دیگر است.

تأیید کنید پروفایل زیر تنظیمات، عمومی، VPN دیده می‌شود و خطای هر بستار را ثبت کنید. این دو واقعیت بدون حدس‌زدن، باگ ترتیب را از باگ مجوز جدا می‌کند.

مقالات مرتبط