passepartout-apple/Library/Sources/CommonLibrary/Domain/BundleConfiguration+AppGroup.swift
Davide ed45e5d2e4
Fix a Core Data crash on Apple TV (#1003)
Could not create the Preferences Core Data container in the App Group
because sub-directories did not exist. Create them upfront when using
App Group URLs.

This was not an issue with other Core Data containers because they are
stored in the app directories, where "Library/Documents" already exists.
2024-12-12 12:48:58 +01:00

69 lines
2.3 KiB
Swift

//
// BundleConfiguration+AppGroup.swift
// Passepartout
//
// Created by Davide De Rosa on 10/4/24.
// Copyright (c) 2024 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
import Foundation
import PassepartoutKit
// WARNING: beware of Constants.shared dependency
extension BundleConfiguration {
public static var urlForAppLog: URL {
urlForGroupCaches.appending(path: Constants.shared.log.appPath)
}
public static var urlForTunnelLog: URL {
urlForGroupCaches.appending(path: Constants.shared.log.tunnelPath)
}
public static var urlForBetaReceipt: URL {
urlForGroupCaches.appending(path: Constants.shared.tunnel.betaReceiptPath)
}
}
extension BundleConfiguration {
public static var urlForGroupCaches: URL {
let url = appGroupURL.appending(components: "Library", "Caches")
try? FileManager.default.createDirectory(at: url, withIntermediateDirectories: true)
return url
}
public static var urlForGroupDocuments: URL {
let url = appGroupURL.appending(components: "Library", "Documents")
try? FileManager.default.createDirectory(at: url, withIntermediateDirectories: true)
return url
}
}
private extension BundleConfiguration {
static var appGroupURL: URL {
let groupId = mainString(for: .groupId)
guard let url = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: groupId) else {
pp_log(.app, .error, "Unable to access App Group container")
return FileManager.default.temporaryDirectory
}
return url
}
}