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

افسانه: API یک ویرایشگر تنظیمات است

باور بر این است که چون iOS می‌تواند پروفایل‌های IKEv1، IKEv2، L2TP و IPsec را پیکربندی کند، یک برنامه می‌تواند هر یک از آن‌ها را برنامه‌نویسی‌شده بسازد. نمی‌تواند. این چارچوب دقیقاً یک جایگاه پیکربندی را در اختیار برنامه فراخوان می‌گذارد و آن جایگاه مجموعه کوچکی از کلاس‌های پروتکل عمومی را می‌پذیرد. هر چیز دیگری که مردم انتظار دارند، از L2TP تا یک پروفایل دانلودشده، بیرون از این سطح است یا متعلق به اپل است.

خطاهایی که در پی می‌آیند معمولاً باگ نیستند. آن‌ها امتناع API از کاری است که هرگز به آن سپرده نشده بود، و راه‌حل این است که صفحه را حول آنچه API مالک آن است طراحی کنید.

سه شیء پروتکل و آن‌هایی که وجود ندارند

گزینه‌های شما IKEv1 از طریق NEVPNProtocolIPSec، IKEv2 از طریق NEVPNProtocolIKEv2، و NETunnelProviderProtocol است اگر افزونه تونل بسته خودتان را عرضه کنید. مرجع NEVPNManager اشیاء پروتکل پذیرفته‌شده را فهرست می‌کند. L2TP و PPTP هرگز در آن فهرست ظاهر نمی‌شوند چون اپل هیچ کلاسی برای آن‌ها منتشر نکرد. تلاش برای هر یک از آن‌ها در زمان ذخیره با خطا پایان می‌یابد، یا بدتر، با پیکربندی‌ای که سیستم بی‌صدا از استفاده از آن سر باز می‌زند.

کد دسکتاپ از قواعد دیگری پیروی می‌کند. در macOS، SCNetworkInterfaceCreateWithInterface یک نوع رابط مانند L2TP روی IPv4 را روی هم می‌چیند و آن را به یک سرویس شبکه متصل می‌کند، و networksetup -connectpppoeservice نتیجه را آغاز می‌کند. حقوق مدیر و یک ابزار کمکی لازم است، زیرا راز مشترک و گذرواژه به زنجیره کلید سیستم می‌روند. آن طراحی را به iOS منتقل کنید و هیچ چیز کامپایل نمی‌شود.

یک ارجاع زنجیره کلید بدهید، نه گذرواژه

هیچ‌یک از دو کلاس IKE گذرواژه را به‌صورت متن نمی‌پذیرد. دو ویژگی passwordReference و sharedSecretReference یک ارجاع پایدار زنجیره کلید می‌خواهند که آن را از SecItemCopyMatching با درخواست kSecReturnPersistentRef به دست می‌آورید. عبور دادن داده‌های آیتم، یا ریختن یک رشته در فیلد، یک شکست در ذخیره یا اتصالی با اعتبارنامه خالی تولید می‌کند. ارجاع تنها به اندازه آیتم زنجیره کلید پشت آن پایدار است، و همین دلیل است که آیتم باید پیش از مونتاژ پیکربندی وجود داشته باشد. آن را در همان تراکنش ذخیره بسازید و یک کلاس کامل از باگ‌های ترتیب را حذف می‌کنید.

احراز هویت گواهی مسیر دیگری می‌رود: identityData به‌همراه identityDataPassword برای یک بلاب PKCS#12. حمل آن بلاب داخل بسته برنامه عادتی است که از کد نمونه به ارث رسیده، نه تصمیمی برای عرضه، چون گذرواژه با آن سفر می‌کند و هر نسخه از برنامه همان هویت را حمل می‌کند.

حق دسترسی و دسترس‌پذیری همه چیز را کنترل می‌کنند

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

اگر این را نادیده بگیرید، نمونه مشترک nil برمی‌گرداند، یا ذخیره با خطایی شکست می‌خورد که هرگز به حق دسترسی اشاره نمی‌کند. دسترس‌پذیری دروازه دیگر است. هر چیزی قدیمی‌تر از iOS 8 را هدف بگیرید و نماد در زمان اجرا غایب است، پس خطا یک کرش یا یک مدیر nil است، نه مدیری بدون پیکربندی. پیش از اشکال‌زدایی گراف شیء خود، زمان اجرا و حق دسترسی را بررسی کنید.

بارگذاری کنید، تغییر دهید، ذخیره کنید، سپس ترتیب درخواستی را زیر نظر بگیرید

چرخه عمر را بارگذاری، تغییر، ذخیره بدانید و هرگز بارگذاری را جا نیندازید. تا زمانی که loadFromPreferences کامل نشود، مدیر چیزی نگه نمی‌دارد و شیء پروتکل را نمی‌توان خواند یا عوض کرد.

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

وقتی اقدام کاربر باید برنده شود، قاعده قطع اتصال را به جلو ببرید. آنچه بیرون از کنترل برنامه می‌ماند به همان اندازه مهم است. مسیرها از تونل یا سیاست سرور می‌آیند نه از ترجیحی که شما تعیین می‌کنید، و ارائه‌دهنده تونل بسته هنگام شروع آن‌ها را گزارش می‌کند. برنامه نمی‌تواند پروفایل‌های نصب‌شده توسط برنامه‌های دیگر یا پروفایل‌های پیکربندی را فهرست یا ویرایش کند، پس صفحه‌ای که همه وی‌پی‌ان‌های دستگاه را نشان می‌دهد وعده ندهید.

مقالات مرتبط