چرا برنامهٔ iPhone شما نمیتواند VPN سیستم را روشن یا خاموش کند
یک برنامهٔ عمومی نمیتواند VPN سیستم را تغییر دهد، وضعیت آن را بخواند یا اتصال را تحمیل کند. قواعد On Demand، نمایههای Always On روی دستگاههای تحت نظارت و MDM گزینهها هستند.
یک مدیر محصول دکمهای میخواهد که VPN شرکت را روشن کند، و این درخواست پیشپاافتاده به نظر میرسد. در iOS این یک قابلیت کوچک نیست؛ بیرون از قرارداد عمومی قرار دارد، و هر راه دورزدنی یا در بازبینی رد میشود یا در انتشار بعدی میشکند. درخواست را از میان آنچه پلتفرم واقعاً اجازه میدهد بگذرانید، و طراحی تا حد زیادی خودش نوشته میشود. یک برنامه میتواند پیکربندی VPN داشته باشد و آن را راه بیندازد. یک برنامه به کلید سیستم دسترسی ندارد، نمیتواند وضعیت نمایهای را که خودش نساخته بخواند، و نمیتواند کاربری را برخلاف میلش متصل نگه دارد.
از سه چیزی که کاربر منظور دارد شروع کنید
معناها را پیش از جدا کردن APIها جدا کنید. گاهی کاربر میخواهد تونل برنامهٔ شما متصل باشد، گاهی میخواهد کلید تنظیمات برای نمایهای که شخص دیگری نصب کرده روشن شود، و گاهی میخواهد تلفن نتواند بدون تونل مرور کند. اینها به سه سازوکار متفاوت نگاشت میشوند، و تنها اولی برای یک برنامهٔ معمولی باز است.
معنای دوم همان است که پرسشهای Stack Overflow را میسازد، و پاسخ پشتیبانیشدهای ندارد. کلید تنظیمات از آنِ کاربر است و در دستگاههای مدیریتشده از آنِ نمایه. هیچ API عمومی پیکربندیهای VPN را برنمیشمارد، گزارش نمیدهد که تونل سیستم بالاست یا نه، و آن را تغییر نمیدهد.
یک برنامه واقعاً چه چیزی میتواند بسازد
NetworkExtension به یک برنامه پیکربندی خودش را از طریق NEVPNManager میدهد. با حق Personal VPN و رضایت کاربر، برنامه پیکربندیای را ذخیره میکند که در تنظیمات با نام خودش ظاهر میشود، و میتواند همان یک اتصال را راه بیندازد یا متوقف کند. این توانایی واقعی و قابل بازبینی است، و همانا کل دامنه است: مدیر فقط آنچه را ساخته میخواند و مینویسد.
این حق خودکار نیست. آن را از Apple درخواست میکنید و توضیح میدهید که چرا برنامه اصلاً به تونل نیاز دارد، و مشتریای که تنها هدفش روشن کردن نمایهٔ شخص دیگری است پاسخ خوبی ندارد. ارائهدهندگان تونل بسته همان قاعده را با کلاس دیگری دنبال میکنند: NETunnelProviderManager مالک پیکربندیهای مبتنی بر ارائهدهنده است که خود برنامه نصب کرده است. هیچیک از دو مسیر به نمایهای که MDM تحویل داده نمیرسد.
رضایت در زمان ذخیره هم اعمال میشود. نوشتن پیکربندی از کاربر میپرسد، و این پرسش چیزی نیست که برنامه بتواند برای راحتی سرکوب کند.
خواندن وضعیت به همان دیوار میخورد
وضعیت دوستانهتر از کنترل به نظر میرسد و به همان اندازه بسته است. NEVPNStatus برای پیکربندی خود برنامه نامعتبر، قطعشده، در حال اتصال، متصل، در حال تأیید مجدد یا در حال قطع را گزارش میکند، و با هر تغییر اعلانی فعال میشود. دربارهٔ تونلی که نمایهٔ مدیریت نصب کرده چیزی نمیگوید، و همان وضعیتی است که میز پشتیبانی میخواهد ببیند.
پایش مسیر شبکه و تغییرات رابط در بازبینیهای طراحی به عنوان جانشین پیشنهاد میشوند. آنها مسیری را توصیف میکنند که ترافیک برنامه طی میکند، و این مسیر به دلایلی نامرتبط با وضعیت VPN تغییر میکند، و به کار بردنشان به عنوان نشانگر VPN رابطی میدهد که در هر دو جهت دروغ میگوید.
On Demand و Always On اهرمهای واقعی هستند
اهرمهای پشتیبانیشده در نمایه زندگی میکنند نه در برنامه. قواعد On Demand به سیستم میگویند کِی متصل شود: فهرستی مرتب از شرطها همراه با کنشها، که سیستمعامل ارزیابی میکند، نه کد شما. قاعدهای که روی هر رابطی متصل میشود حس همیشهمتصل را میسازد بدون آنکه به هیچ برنامهای کنترل بدهد.
Always On VPN سازوکار اجرا است، و به نظارت گره خورده است. روی دستگاهی تحت نظارت، MDM نمایهای نصب میکند که تونل را بالا نگه میدارد؛ روی تلفن شخصی بدون نظارت همان کلیدها همان رفتار را تولید نمیکنند. این عدم تقارن عمدی است، و هیچ ترکیبی از کلیدهای بار داده آن را برنمیدارد. وقتی خواسته واقعاً این است که VPN باید روشن باشد، خواسته در حقیقت این است که دستگاه باید مدیریت شود.
میان این دو، پسرعموی ضعیفتر مینشیند: قاعدهای که پس از قطع شدن کاربر دوباره وصل میشود. وقتی قاعدهٔ بعدی ارزیابی شود دوباره وصل میشود، که با «فوراً» یکی نیست، و کاربری که عمداً قطع کرده تفاوت را متوجه میشود. رابط را حول این شکاف طراحی کنید، نه با وعدهٔ قفل.
مسیر پشتیبانیشده را منتشر کنید
چهار پرسش سازوکار را پیش از وجود هر کدی روشن میکنند: دستگاه از آنِ کیست، آیا تحت نظارت است، کدام مشتری تونل را پایان میدهد، و نمایه از کجا میآید. اگر هر یک از اینها ناشناخته باشد، درخواست قابلیت آمادهٔ برآورد نیست.
یک API خصوصی که در VPN سیستم دست میبرد یک نمایش را میگذراند و در بازبینی رد میشود، و اگر از راه دیگری منتشر شود در انتشار بعدی iOS میشکند. هیچ نسخهای از این معامله به ارزش یک کلید نیست.
تلهمتری مدیریت کانالی جداگانه است: گزارش میدهد که نمایهای نصب شده و آیا دستگاه منطبق است، که این گزارشدهی است نه سطح کنترل برای هر برنامه. جریان را پس از هر بهروزرسانی روی دستگاه واقعی آزمایش کنید، چون رفتار پشتیبانیشده در سیستمعامل زندگی میکند و سیستمعامل حرکت میکند.