ทำไมแอป iPhone ของคุณจึงเปิดหรือปิด VPN ของระบบไม่ได้
แอปสาธารณะไม่สามารถสลับ VPN ของระบบ อ่านสถานะ หรือบังคับการเชื่อมต่อได้ กฎ On Demand โปรไฟล์ Always On บนอุปกรณ์ที่ถูกกำกับดูแล และ MDM คือทางเลือก
ผู้จัดการผลิตภัณฑ์ขอปุ่มที่เปิด VPN ของบริษัท และคำขอก็ฟังดูเป็นเรื่องเล็ก บน iOS นี่ไม่ใช่ฟีเจอร์เล็ก ๆ มันอยู่นอกสัญญาสาธารณะ และทุกทางลัดก็ไม่ผ่านการตรวจสอบหรือพังในรีลีสถัดไป ลองพาคำขอผ่านสิ่งที่แพลตฟอร์มอนุญาตจริง และการออกแบบก็เขียนตัวเองได้เกือบทั้งหมด แอปสามารถเป็นเจ้าของการกำหนดค่า VPN และเริ่มมันได้ แอป เอื้อมไม่ถึงสวิตช์ของระบบ อ่านสถานะของโปรไฟล์ที่ตัวเองไม่ได้สร้างไม่ได้ และไม่สามารถทำให้ผู้ใช้เชื่อมต่ออยู่โดยขัดกับความต้องการได้
เริ่มจากสามสิ่งที่ผู้ใช้หมายถึง
แยกความหมายก่อนแยก API บางครั้งผู้ใช้ต้องการให้อุโมงค์ของแอปคุณเชื่อมต่ออยู่ บางครั้งต้องการสลับสวิตช์ใน Settings สำหรับโปรไฟล์ที่คนอื่นติดตั้งไว้ และบางครั้งต้องการให้โทรศัพท์ท่องเว็บไม่ได้หากไม่มีอุโมงค์ สิ่งเหล่านี้ตรงกับกลไกที่ต่างกันสามอย่าง และมีเพียงอย่างแรกที่เปิดให้แอปทั่วไป
ความหมายที่สองคือสิ่งที่สร้างคำถามบน Stack Overflow และไม่มีคำตอบที่รองรับ สวิตช์ใน Settings เป็นของผู้ใช้ และบนอุปกรณ์ที่จัดการก็เป็นของโปรไฟล์ ไม่มี API สาธารณะใดที่แจกแจงการกำหนดค่า VPN รายงานว่าอุโมงค์ของระบบทำงานอยู่หรือไม่ หรือสลับมัน
สิ่งที่แอปสร้างได้จริง
NetworkExtension ให้แอปมีการกำหนดค่าของตัวเองผ่าน NEVPNManager ด้วยสิทธิ์ Personal VPN และความยินยอมของผู้ใช้ แอปจะบันทึกการกำหนดค่าที่ปรากฏใน Settings ภายใต้ชื่อของตัวเอง และสามารถเริ่มหรือหยุดการเชื่อมต่อนั้นเพียงหนึ่งเดียวได้ นี่คือความสามารถจริงที่ตรวจสอบได้ และยังเป็นขอบเขตทั้งหมดด้วย: ตัวจัดการอ่านและเขียนเฉพาะสิ่งที่ตัวเองสร้าง
สิทธิ์ไม่ได้มาโดยอัตโนมัติ คุณขอจาก Apple และอธิบายว่าเหตุใดแอปจึงต้องมีอุโมงค์เลย และไคลเอนต์ที่มีเป้าหมายเดียวคือเปิดโปรไฟล์ของคนอื่นก็ไม่มีคำตอบที่ดี ผู้ให้บริการอุโมงค์แบบแพ็กเก็ตปฏิบัติตามกฎเดียวกันด้วยคลาสที่ต่างกัน: NETunnelProviderManager เป็นเจ้าของการกำหนดค่าที่อิงผู้ให้บริการซึ่งแอปติดตั้งเอง ไม่มีเส้นทางใดไปถึงโปรไฟล์ที่ MDM ส่งมา
ความยินยอมใช้บังคับตอนบันทึกด้วย การเขียนการกำหนดค่าจะถามผู้ใช้ และคำถามนั้นไม่ใช่สิ่งที่แอปจะระงับเพื่อความสะดวกได้
การอ่านสถานะก็ชนกำแพงเดียวกัน
สถานะดูเป็นมิตรกว่าการควบคุมและปิดพอ ๆ กัน NEVPNStatus รายงานว่าไม่ถูกต้อง ตัดการเชื่อมต่อ กำลังเชื่อมต่อ เชื่อมต่อแล้ว กำลังยืนยันซ้ำ หรือกำลังตัดการเชื่อมต่อ สำหรับการกำหนดค่าของแอปเอง และมีการแจ้งเตือนทุกครั้งที่เปลี่ยน มันไม่บอกอะไรเกี่ยวกับอุโมงค์ที่ติดตั้งโดยโปรไฟล์การจัดการ ซึ่งเป็นสถานะที่ฝ่ายช่วยเหลือต้องการเห็นจริง ๆ
การเฝ้าตรวจเส้นทางเครือข่ายและการเปลี่ยนแปลงอินเทอร์เฟซถูกเสนอเป็นตัวแทนในการรีวิวดีไซน์ สิ่งเหล่านี้อธิบายเส้นทางที่ทราฟฟิกของแอปไป ซึ่งเปลี่ยนด้วยเหตุผลที่ไม่เกี่ยวกับสถานะ VPN และการนำมาใช้เป็นการอ่านค่า VPN ก็ได้อินเทอร์เฟซที่โกหกทั้งสองทาง
On Demand และ Always On คือคันโยกจริง
คันโยกที่รองรับอยู่ในโปรไฟล์ไม่ใช่ในแอป กฎ On Demand บอกระบบว่าเมื่อใดควรเชื่อมต่อ: รายการเงื่อนไขพร้อมการกระทำที่เรียงลำดับ ซึ่งระบบปฏิบัติการเป็นผู้ประเมิน ไม่ใช่โค้ดของคุณ กฎที่เชื่อมต่อบนอินเทอร์เฟซใดก็ได้สร้างความรู้สึกว่าเชื่อมต่อตลอดเวลาโดยไม่ให้การควบคุมใด ๆ แก่แอป
Always On VPN คือกลไกบังคับ และผูกกับการกำกับดูแล บนอุปกรณ์ที่ถูกกำกับดูแล MDM ติดตั้งโปรไฟล์ที่ทำให้อุโมงค์ทำงานอยู่ บนโทรศัพท์ส่วนตัวที่ไม่ได้กำกับดูแล กุญแจเดียวกันไม่ได้ให้พฤติกรรมเดียวกัน ความไม่สมมาตรนั้นเป็นเจตนา และไม่มีชุดกุญแจเพย์โหลดใดกำจัดมันได้ เมื่อข้อกำหนดคือ VPN ต้องเปิดอยู่จริง ๆ ข้อกำหนดก็คืออุปกรณ์ต้องถูกจัดการ
ระหว่างสองอย่างนั้นมีลูกพี่ลูกน้องที่อ่อนแอกว่าอยู่: กฎที่เชื่อมต่อใหม่หลังจากผู้ใช้ตัดการเชื่อมต่อ มันเชื่อมต่อใหม่เมื่อกฎถูกประเมินครั้งถัดไป ซึ่งไม่เหมือนกับการทำทันที และผู้ใช้ที่ตัดการเชื่อมต่อโดยตั้งใจจะสังเกตเห็นความต่าง ออกแบบอินเทอร์เฟซรอบช่องว่างนั้นแทนที่จะสัญญาว่าจะล็อก
ส่งมอบเส้นทางที่รองรับ
สี่คำถามตัดสินกลไกก่อนจะมีโค้ด: ใครเป็นเจ้าของอุปกรณ์ อุปกรณ์ถูกกำกับดูแลหรือไม่ ไคลเอนต์ใดเป็นตัวปิดอุโมงค์ และโปรไฟล์มาจากไหน หากข้อใดไม่ทราบ คำขอฟีเจอร์ยังไม่พร้อมประเมิน
API ส่วนตัวที่ไปยุ่งกับ VPN ของระบบจะผ่านเดโมและตกการตรวจสอบ และถ้าส่งด้วยวิธีอื่นมันจะพังในรีลีส iOS ถัดไป ไม่มีเวอร์ชันของการแลกเปลี่ยนนั้นที่คุ้มค่าสำหรับสวิตช์เดียว
เทเลเมทรีการจัดการเป็นช่องทางแยก: รายงานว่ามีการติดตั้งโปรไฟล์และอุปกรณ์เป็นไปตามข้อกำหนดหรือไม่ ซึ่งเป็นการรายงานไม่ใช่พื้นผิวควบคุมรายแอป ทดสอบโฟลว์บนอุปกรณ์จริงหลังทุกการอัปเดต เพราะพฤติกรรมที่รองรับอาศัยอยู่ใน OS และ OS เคลื่อนที่