NEVPNManager સાચવતું નથી? ક્રમ છે લોડ, સક્રિય, સાચવો, જોડાઓ
કોડ 4 અને કોડ 5 સામાન્ય રીતે એમ કહે છે કે પ્રોફાઇલ લોડ થવા પહેલાં સંપાદિત થઈ હતી અથવા નિષ્ક્રિય હતી ત્યારે સાચવવામાં આવી હતી. કૉલનો ક્રમ સુધારો, પછી entitlement ચકાસો.
બે ભૂલ કોડ iOS પર Network Extension VPN માટેના મોટા ભાગના પ્રથમ પ્રયાસો સમજાવે છે: NEVPNErrorDomain Code=4 અને Code=5. બંનેમાંથી કોઈ સર્વરની ફરિયાદ નથી. એક ત્યારે દેખાય છે જ્યારે એપ એવા ઑબ્જેક્ટમાં સેટિંગ્સ લખે છે જે ક્યારેય ડિસ્ક પરથી વાંચવામાં આવ્યું નથી, અને બીજું ત્યારે જ્યારે લખવું જ નિષ્ફળ જાય છે, ઘણી વાર કારણ કે પ્રોફાઇલ હજી નિષ્ક્રિય હોય ત્યારે સાચવવામાં આવે છે. બંને ચાર કૉલનો ક્રમ બદલીને સુધારાય છે, IKEv2 પરિમાણોને અડ્યા વિના.
પહેલાં લોડ કરો, નહીં તો સાચવવા પાસે સરખાવવા જેવું કંઈ નથી
મેનેજર સંગ્રહિત પ્રોફાઇલની નકલ રાખે છે, અને તમે સંપાદિત કરો છો તે ઑબ્જેક્ટ તે નકલ નથી જ્યાં સુધી તમે તેને વાંચતા નથી. પહેલાં loadFromPreferences કૉલ કરો, તેના કમ્પ્લિશન હેન્ડલરની અંદર સંપાદિત કરો, પછી સાચવો. વાંચન છોડી દો તો ફ્રેમવર્ક તેની પાસે જે છે અને તમે જે લખો છો તે વચ્ચે અસંગતિ જુએ છે. Swift માં દરેક પગલા માટે સ્વરૂપ સમાન છે, અને દરેક પગલું તેના પોતાના ક્લોઝરમાં આવે છે:
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
}
}
સાચવવાના ક્લોઝરની અંદરથી ટનલ શરૂ કરવી એ બીજી જગ્યાએ એ જ ભૂલ છે. તે પ્રોફાઇલ ફરી વાંચવામાં આવે તે પહેલાં ચાલે છે, તેથી શરૂ કરવાનો કૉલ તમે બનાવેલી સ્થિતિ જુએ છે, સંગ્રહિત સ્થિતિ નહીં. સાચવવાનું ક્લોઝર બીજા loadFromPreferences સાથે પૂરું થાય છે, અને ફક્ત તે જ કમ્પ્લિશન હેન્ડલર startVPNTunnel કૉલ કરે છે.
સક્રિયકરણ ફ્લેગ સાચવવાનો ભાગ છે
સંગ્રહિત પ્રોફાઇલ ચાલુ ન થાય ત્યાં સુધી નિષ્ક્રિય છે. isEnabled = true એ જ લખાણમાં સેટ કરો, નહીં તો પ્રોફાઇલ ડિસ્ક પર નિષ્ક્રિય પહોંચે છે અને સેટિંગ્સ સંપૂર્ણ દેખાતું રૂપરેખાંકન બતાવે તો પણ startVPNTunnel ના પાડે છે.
બાહ્ય સંપાદનો આનો બીજો અડધો ભાગ છે. જો વપરાશકર્તા સેટિંગ્સમાં કંઈક બદલે, અથવા ઉપકરણ નેટવર્ક વચ્ચે ખસે, તો મેમરીમાં હજી રાખેલા મૂલ્યો પર ભરોસો કરતા પહેલાં ફરી વાંચો. ઑબ્જેક્ટ તમારા માટે તે ફેરફારો નિહાળતું નથી. જૂની નકલ એ રીત છે જેમાં એપ એવી પ્રોફાઇલ લખે છે જે વપરાશકર્તાનું સંપાદન શાંતિથી પાછું વાળે છે. બે બાજુના ફીલ્ડ એ જ ક્ષણે શાંત મુશ્કેલી ઊભી કરે છે: on-demand નિયમો ખાલી પ્લેસહોલ્ડર નહીં, નિયમ ઑબ્જેક્ટની એરે હોવા જોઈએ, અને disconnectOnSleep એ કૉપી કરેલા ડિફૉલ્ટને બદલે તમે પસંદ કરેલા વર્તનને પ્રતિબિંબિત કરવું જોઈએ.
તૃતીય-પક્ષની એપ્સ માટે ફક્ત બે પ્રોટોકૉલ ઉપલબ્ધ છે
Network Extension એપ્સને IPsec અને IKEv2 આપે છે. L2TP અને PPTP સિસ્ટમની અંદર જ રહે છે, તેથી જે એપને તેની જરૂર હોય તે તે મેળવી શકતી નથી, અને વાસ્તવિક જવાબો IKEv2-સક્ષમ ગેટવે અથવા મેનેજ્ડ કન્ફિગરેશન પ્રોફાઇલ છે.
ઓળખપત્રો એ જ પેટર્ન અનુસરે છે. પાસવર્ડ Keychain માં મૂકો અને સ્ટ્રિંગને બદલે કાયમી સંદર્ભ આપો. સાચવતી વખતે શૂન્ય સંદર્ભ સામાન્ય રીતે એમ કહે છે કે આઇટમ લખાય તે પહેલાં શોધ ચાલી હતી, મેનેજર તૂટેલું નથી.
બંને ડિઝાઇન નિર્ણયો છે, વૈકલ્પિક ઉપાયો નહીં. પોતાની પસંદગીઓમાં પાસવર્ડ રાખતી એપ ફ્રેમવર્ક જે માર્ગને નિરુત્સાહિત કરે છે તે પસંદ કરે છે, અને તે જે નિષ્ફળતા પેદા કરે છે તે સાચવવાની ભૂલ જેવી લાગે છે.
કોડ ફરી લખતા પહેલાં entitlement બાકાત કરો
જ્યારે loadFromPreferences બિલકુલ પાછું કૉલ કરતું નથી, ત્યારે સંભવિત કારણ ગુમ થયેલ Network Extension ક્ષમતા અથવા એવી પ્રોવિઝનિંગ પ્રોફાઇલ છે જે તેને ધરાવતી નથી. તે નિષ્ફળતા ભૂલ આપવાને બદલે અટકી પડે છે, અને તેથી જ કામ કરતો કોડ કલાકો સુધી ફરી લખાય છે. તમે વિતરિત કરવા માંગો છો તે સાઇન કરેલ બિલ્ડ પર entitlement ચકાસો, કારણ કે સિમ્યુલેટર રન અને ઉપકરણ રન અલગ હોઈ શકે છે અને મહત્વનું લક્ષ્ય ઉપકરણ છે. લક્ષ્યની સાઇનિંગ સેટિંગ્સ ખોલો અને ખાતરી કરો કે Network Extension ક્ષમતા તે ચોક્કસ બિલ્ડ માટે હાજર છે.
entitlement વગરની પ્રોવિઝનિંગ પ્રોફાઇલ હાર્ડવેર પર એ જ રીતે નિષ્ફળ જાય છે, જ્યારે એ જ બિલ્ડ સિમ્યુલેટરમાં સામાન્ય રીતે લોડ થઈ શકે છે. કૉલનો ક્રમ ફરી લખતા પહેલાં સાઇન કરેલ આર્કાઇવ વાસ્તવિક ઉપકરણ પર ચકાસો.
ધારણાઓ નહીં, સ્થિતિના ફેરફારો જુઓ
NEVPNStatusDidChangeNotification નિહાળો અને દરેક પગલા પછી manager.connection.status લૉગ કરો. જે સ્થિતિ ક્યારેય invalid છોડતી નથી તેનો અર્થ છે પ્રોફાઇલ સંગ્રહાઈ નથી અથવા entitlement ગુમ છે. connecting સુધી પહોંચીને ક્યારેય જોડાતું નથી તેવું જોડાણ પ્રસ્તાવ અથવા ઓળખપત્રો તરફ ઇશારો કરે છે, જે અલગ પુરાવા સાથેની અલગ તપાસ છે.
પ્રોફાઇલ સેટિંગ્સ, સામાન્ય, VPN હેઠળ દેખાય છે તેની ખાતરી કરો અને દરેક ક્લોઝરની ભૂલ નોંધો. તે બે તથ્યો અનુમાન વિના ક્રમની બગ અને પરવાનગીની બગને અલગ પાડે છે.