Эки ката коду iOS'то Network Extension VPN үчүн алгачкы аракеттердин көбүн түшүндүрөт: NEVPNErrorDomain Code=4 жана Code=5. Экөө тең сервердин даттануусу эмес. Бири колдонмо дисктен эч качан окулбаган объектиге жөндөөлөрдү жазганда пайда болот, экинчиси жазуу өзү ишке ашпаганда, көбүнчө профиль дагы өчүк абалда сакталып жаткандыктан. Экөө тең төрт чакыруунун тартибин өзгөртүү менен оңдолот, IKEv2 параметрлерин кармабастан.

Алгач жүктөңүз, болбосо сактоонун салыштырар эч нерсеси жок

Менеджер сакталган профилдин көчүрмөсүн кармайт, жана сиз оңдоп жаткан объект аны окуганга чейин ошол көчүрмө эмес. Алгач loadFromPreferences чакырыңыз, анын аяктоо иштетүүчүсүнүн ичинде оңдоңуз, анан сактаңыз. Окууну өткөрүп жиберсеңиз, каркас өзүндө бар нерсе менен жазганыңыздын ортосунда шайкешсиздикти көрөт. Swift'те форма ар бир кадамда бирдей, жана ар бир кадам өзүнүн closure'ына таандык:

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

Туннелди сактоо closure'ынын ичинен баштоо — бул башка жердеги ошол эле ката. Ал профиль кайра окулганга чейин иштейт, ошондуктан баштоо чакыруусу сакталган абалды эмес, сиз курган абалды көрөт. Сактоо closure'ы экинчи 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 астында көрүнөрүн ырастаңыз жана ар бир closure'дун катасын жазып алыңыз. Бул эки факт болжолсуз тартип катасын укук катасынан ажыратат.

Тектеш макалалар