คุณต้องการหน้าจอหนึ่งที่ทำงานต่างออกไปเมื่ออุโมงค์เชื่อมต่ออยู่ และไม่มีการเรียกใดที่บอกคุณได้ นี่คือข้อจำกัดในการปล่อย: บน macOS ไม่มีเฟรมเวิร์กสาธารณะใดรายงานว่ามี VPN ใด ๆ เชื่อมต่ออยู่หรือไม่ และบน iOS สถานะเป็นของแอปที่ติดตั้งการกำหนดค่า การตรวจสอบด้านล่างพาจากขีดจำกัดนั้นไปสู่สิ่งที่คุณปล่อยได้ และแต่ละข้อสามารถยุติการค้นหาได้ก่อนเวลา

การตรวจสอบ 1: คำถามนี้ตอบได้หรือไม่

sandbox ตัดสินคำถามก่อน API ใด ๆ กระบวนการของบุคคลที่สามไม่สามารถแจกแจงส่วนขยายของผู้ให้บริการรายอื่น และอ่านการกำหนดค่าของส่วนขยายนั้นไม่ได้ด้วย ดังนั้นจึงไม่มีออบเจกต์ที่รองรับให้ถาม

ทุกทางเลี่ยงชนกำแพงเดียวกัน รายการอินเทอร์เฟซ scutil --nc list และการอ่านการกำหนดค่าระบบโดยตรงต้องใช้สิทธิ์ที่ sandbox เก็บกักไว้ หรือพึ่งพาพฤติกรรมที่ Apple ไม่เคยสัญญา หากแผนต้องใช้สิ่งใดสิ่งหนึ่ง ปัญหาคือแผนนั้น ฟีเจอร์ที่สร้างบนรายละเอียดที่ไม่มีเอกสารคือตั๋วสนับสนุนที่มีวันส่งมอบ

การตรวจสอบ 2: แอปของคุณจัดการอุโมงค์เองหรือไม่

ถ้าใช่ คุณมีคำตอบที่รองรับสำหรับการกำหนดค่าของคุณเอง โหลดค่ากำหนด จัดการข้อผิดพลาด จากนั้นอ่านสถานะและสมัครรับการเปลี่ยนแปลงแทนการ polling:

vpnManager.loadFromPreferences { error in
    // handle a load failure before reading status
}

NotificationCenter.default.addObserver(
    forName: .NEVPNStatusDidChange,
    object: nil,
    queue: nil
) { note in
    let status = (note.object as? NEVPNConnection)?.status
}

จงแม่นยำเกี่ยวกับสิ่งที่ส่งกลับมา: สถานะของอุโมงค์ที่คุณติดตั้ง ผู้ใช้ที่ใช้ไคลเอนต์อื่นจะแสดงเป็นตัดการเชื่อมต่อ และนั่นไม่ใช่บั๊กในโค้ดของคุณ ตัดสินว่าฟีเจอร์ของคุณกำลังถามคำถามใดในสองข้อนี้จริง ๆ ก่อนสร้างบนคำตอบ

การตรวจสอบ 3: ฮิวริสติกจะบอกอะไรคุณจริง ๆ

วิธีการที่ถูกคัดลอกกันมากถามพจนานุกรมพร็อกซีของระบบถึงรายการที่มีขอบเขตและอ่านคีย์ ซึ่งบังเอิญเป็นชื่ออินเทอร์เฟซ:

let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []

คีย์ที่ขึ้นต้นด้วย tap, tun, ppp, ipsec หรือ utun บ่งชี้ว่ามีอินเทอร์เฟซที่มีขอบเขตอุโมงค์อยู่ การจับคู่ชื่อเต็มล้มเหลวทันที เพราะ iOS 12 มาพร้อม utun1 และ utun2 และบางโปรไฟล์ปรากฏเป็น ipsec4, ppp0 หรือ utun0 ให้เปรียบเทียบคำนำหน้าแทน

ถึงกระนั้น ชื่อไม่ได้ระบุเจ้าของ ฟีเจอร์ระบบและส่วนขยายของผู้ให้บริการรายอื่นก็สร้างอินเทอร์เฟซ utun เช่นกัน และอาจมีอยู่โดยไม่บรรทุกทราฟฟิกของคุณเลย อ่านสิ่งนี้เป็นเบาะแสว่ามีอะไรบางอย่างรูปร่างคล้ายอุโมงค์อยู่ใกล้ ๆ ไม่มากไปกว่านั้น ผลบวกลวงตรงนี้มีราคาถูกถ้าคุณจำกัดฟีเจอร์เดียว และแพงถ้าคุณจำกัดหน้าจอเข้าสู่ระบบ

การตรวจสอบ 4: คุณทดสอบปลายทางแทนได้หรือไม่

ถ้าแอปเพียงต้องการรู้ว่าบริการภายในเข้าถึงได้หรือไม่ ให้ทดสอบบริการนั้น การตรวจสอบสั้น ๆ ที่มีเวลาหมดอายุตอบคำถามที่ฟีเจอร์พึ่งพาจริง ๆ และยังทำงานได้เมื่อผู้ใช้เปลี่ยนไคลเอนต์หรืออุโมงค์เปลี่ยนรูปร่าง

การเข้าถึงได้เป็นการสังเกตเกี่ยวกับเส้นทางของคุณ ชื่ออินเทอร์เฟซเป็นการอนุมานเกี่ยวกับสิ่งที่อยู่ติดกับเส้นทางของคุณ นั่นคือเหตุผลที่ฮิวริสติกสร้างข้อโต้แย้งในรายงานบั๊ก และการตรวจสอบสร้างหลักฐาน หากการตรวจสอบล้มเหลวในขณะที่ผู้ใช้ยืนยันว่า VPN เปิดอยู่ ตอนนี้คุณมีเส้นทางเฉพาะให้ดีบัก: การแปลงชื่อ เส้นทาง หรือสิทธิ์ของบริการ

การตรวจสอบ 5: แพลตฟอร์มบังคับใช้สิ่งที่คุณต้องการได้หรือไม่

เมื่อข้อกำหนดคือการรับประกันว่าไม่มีสิ่งใดหลุดออกจากอุโมงค์ โปรไฟล์คือที่ของมัน ไม่ใช่ตัวตรวจจับ การเปิด includeAllNetworks ในการกำหนดค่าอุโมงค์เต็มบน iOS 14 หรือใหม่กว่าจะเปลี่ยนพฤติกรรมของแพลตฟอร์มแทนที่จะให้แอปของคุณอนุมาน ธงนี้มีเอกสารอยู่ใน เอกสารอ้างอิง NEVPNProtocol.

นี่คือคำตอบอีกชนิดหนึ่ง: การบังคับใช้แทนการสังเกต นอกจากนี้ยังใช้ได้กับโปรไฟล์ที่คุณควบคุมเท่านั้น จึงไม่ช่วยแอปผู้บริโภคที่เฝ้าดูอุโมงค์ของคนอื่น

การตรวจสอบ 6: ทำให้ความล้มเหลวปลอดภัยและสังเกตได้

ปิดเฉพาะความสามารถที่ต้องใช้อุโมงค์และปล่อยส่วนที่เหลือของแอปให้ใช้งานได้ ตัวตรวจจับที่ซ่อนอินเทอร์เฟซทั้งหมดทุกครั้งที่ไม่แน่ใจจะสร้างเหตุขัดข้องให้ทุกคนที่อุโมงค์ใช้ชื่อที่คุณไม่เคยคาดคิด กลับไปสู่พฤติกรรมอนุรักษ์นิยมแทน: ฟีเจอร์ภายในยังทำงานอยู่ และเฉพาะการเรียกระยะไกลที่ต้องใช้อุโมงค์จริง ๆ เท่านั้นที่ถูกปิดใช้งาน ทางเลือกนั้นเป็นการตัดสินใจของผลิตภัณฑ์ และสมควรถูกเขียนไว้ข้างฮิวริสติก

บันทึกสิ่งที่คุณสังเกต: ชื่ออินเทอร์เฟซ เวอร์ชันแพลตฟอร์ม และผลของการตรวจสอบหนึ่งครั้ง นั่นเปลี่ยนรายงานถัดไปจากข้อโต้แย้งเป็นการตรวจสอบ จากนั้นให้ความสำคัญกับคำประกาศที่รองรับเมื่อคุณมี เพราะการกำหนดค่าที่จัดการได้สามารถบรรทุกเจตนาได้อย่างชัดเจนและขจัดเหตุผลส่วนใหญ่ในการตรวจสอบชื่อ

หากการตรวจสอบ 1 ถึง 5 ทำให้คุณไม่มีคำตอบที่รองรับ ให้ปล่อยการตรวจสอบและติดป้ายผลลัพธ์อย่างซื่อสัตย์ สัญญาณความพยายามที่ดีที่สุดที่มีเอกสารเป็นการตัดสินใจของผลิตภัณฑ์ที่ดีกว่า API ส่วนตัวที่พังในการเปิดตัวครั้งถัดไป

บทความที่เกี่ยวข้อง