mirror of
https://github.com/DefinedNet/mobile_nebula.git
synced 2025-01-18 03:07:02 +00:00
Fix iOS 16 support (#222)
In older versions of iOS, it's not possible to call `NETunnelProviderManager.loadAllFromPreferences()` from inside the network extension process. We were seeing `NETunnelProviderManager objects cannot be instantiated from NEProvider processes` errors in iOS 16. It's unclear exactly when the change happened to allow it, but as far as we can tell it was in iOS 17. To Test: 1. On a real device running iOS 16, ensure that enrolling as a Managed Nebula host works correctly. 2. Start the site. 3. Update the host in the admin panel and wait at least 15 minutes for a `checkForUpdate` from the mobile client. You should get a `Host renewed` audit log for the host. 4. Verify that there's a log for "Reloading Nebula" in the mobile host, and that it has an up-to-date config.
This commit is contained in:
parent
6ed64b7349
commit
87c16ea95c
2 changed files with 17 additions and 8 deletions
|
@ -52,14 +52,20 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
|
||||||
var config: Data
|
var config: Data
|
||||||
var key: String
|
var key: String
|
||||||
|
|
||||||
manager = try await self.findManager()
|
|
||||||
|
|
||||||
guard let foundManager = manager else {
|
|
||||||
throw VPNStartError.couldNotFindManager
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
self.site = try Site(manager: foundManager)
|
// Cannot use NETunnelProviderManager.loadAllFromPreferences() in earlier versions of iOS
|
||||||
|
// TODO: Remove else once we drop support for iOS 16
|
||||||
|
if ProcessInfo().isOperatingSystemAtLeast(OperatingSystemVersion(majorVersion: 17, minorVersion: 0, patchVersion: 0)) {
|
||||||
|
manager = try await self.findManager()
|
||||||
|
guard let foundManager = manager else {
|
||||||
|
throw VPNStartError.couldNotFindManager
|
||||||
|
}
|
||||||
|
self.site = try Site(manager: foundManager)
|
||||||
|
} else {
|
||||||
|
// This does not save the manager with the site, which means we cannot update the
|
||||||
|
// vpn profile name when updates happen (rare).
|
||||||
|
self.site = try Site(proto: self.protocolConfiguration as! NETunnelProviderProtocol)
|
||||||
|
}
|
||||||
config = try self.site!.getConfig()
|
config = try self.site!.getConfig()
|
||||||
} catch {
|
} catch {
|
||||||
//TODO: need a way to notify the app
|
//TODO: need a way to notify the app
|
||||||
|
|
|
@ -63,7 +63,10 @@ class DNUpdater {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
newSite?.save(manager: site.manager) { error in
|
let siteManager = site.manager
|
||||||
|
let shouldSaveToManager = siteManager != nil || ProcessInfo().isOperatingSystemAtLeast(OperatingSystemVersion(majorVersion: 17, minorVersion: 0, patchVersion: 0))
|
||||||
|
|
||||||
|
newSite?.save(manager: site.manager, saveToManager: shouldSaveToManager) { error in
|
||||||
if (error != nil) {
|
if (error != nil) {
|
||||||
self.log.error("failed to save update: \(error!.localizedDescription, privacy: .public)")
|
self.log.error("failed to save update: \(error!.localizedDescription, privacy: .public)")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue