Refactor to eliminate hardcoded identifiers
Read package identifier and app group ID from Info.plist at runtime via AppConfiguration. This enables SFM.System to use TeamID-prefixed app group format required by macOS Sequoia, fixing the privacy prompt when accessing app group data.
This commit is contained in:
@@ -7,7 +7,7 @@ import Library
|
|||||||
|
|
||||||
#if os(iOS) || os(tvOS)
|
#if os(iOS) || os(tvOS)
|
||||||
public class UIProfileUpdateTask: BGAppRefreshTask {
|
public class UIProfileUpdateTask: BGAppRefreshTask {
|
||||||
private static let taskSchedulerPermittedIdentifier = "\(FilePath.packageName).update_profiles"
|
private static let taskSchedulerPermittedIdentifier = AppConfiguration.backgroundTaskID
|
||||||
|
|
||||||
private static var registered = false
|
private static var registered = false
|
||||||
public static func configure() throws {
|
public static func configure() throws {
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ public struct CoreView: View {
|
|||||||
private nonisolated func openInFilesApp() async {
|
private nonisolated func openInFilesApp() async {
|
||||||
do {
|
do {
|
||||||
let domains = try await NSFileProviderManager.domains()
|
let domains = try await NSFileProviderManager.domains()
|
||||||
guard let domain = domains.first(where: { $0.identifier.rawValue == "io.nekohasekai.sfavt.workingdir" }) else {
|
guard let domain = domains.first(where: { $0.identifier.rawValue == AppConfiguration.fileProviderDomainID }) else {
|
||||||
throw NSError(domain: "CoreView", code: 0, userInfo: [NSLocalizedDescriptionKey: "File provider domain not found"])
|
throw NSError(domain: "CoreView", code: 0, userInfo: [NSLocalizedDescriptionKey: "File provider domain not found"])
|
||||||
}
|
}
|
||||||
guard let manager = NSFileProviderManager(for: domain) else {
|
guard let manager = NSFileProviderManager(for: domain) else {
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>BasePackageIdentifier</key>
|
||||||
|
<string>$(BASE_PACKAGE_IDENTIFIER)</string>
|
||||||
|
<key>AppGroupIdentifier</key>
|
||||||
|
<string>$(APP_GROUP_IDENTIFIER)</string>
|
||||||
<key>NSExtension</key>
|
<key>NSExtension</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSExtensionPointIdentifier</key>
|
<key>NSExtensionPointIdentifier</key>
|
||||||
|
|||||||
@@ -4,8 +4,15 @@ import UniformTypeIdentifiers
|
|||||||
class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension {
|
class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension {
|
||||||
let domain: NSFileProviderDomain
|
let domain: NSFileProviderDomain
|
||||||
|
|
||||||
|
private static let appGroupID: String = {
|
||||||
|
guard let value = Bundle.main.object(forInfoDictionaryKey: "AppGroupIdentifier") as? String else {
|
||||||
|
fatalError("Missing AppGroupIdentifier in Info.plist")
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}()
|
||||||
|
|
||||||
private var workingDirectory: URL {
|
private var workingDirectory: URL {
|
||||||
let groupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.io.nekohasekai.sfavt")!
|
let groupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: Self.appGroupID)!
|
||||||
return groupURL
|
return groupURL
|
||||||
.appendingPathComponent("Library", isDirectory: true)
|
.appendingPathComponent("Library", isDirectory: true)
|
||||||
.appendingPathComponent("Caches", isDirectory: true)
|
.appendingPathComponent("Caches", isDirectory: true)
|
||||||
|
|||||||
@@ -2,10 +2,14 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>BasePackageIdentifier</key>
|
||||||
|
<string>$(BASE_PACKAGE_IDENTIFIER)</string>
|
||||||
|
<key>AppGroupIdentifier</key>
|
||||||
|
<string>$(APP_GROUP_IDENTIFIER)</string>
|
||||||
<key>NSExtension</key>
|
<key>NSExtension</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSExtensionFileProviderDocumentGroup</key>
|
<key>NSExtensionFileProviderDocumentGroup</key>
|
||||||
<string>group.io.nekohasekai.sfavt</string>
|
<string>$(APP_GROUP_IDENTIFIER)</string>
|
||||||
<key>NSExtensionFileProviderSupportsEnumeration</key>
|
<key>NSExtensionFileProviderSupportsEnumeration</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSExtensionPointIdentifier</key>
|
<key>NSExtensionPointIdentifier</key>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>BasePackageIdentifier</key>
|
||||||
|
<string>$(BASE_PACKAGE_IDENTIFIER)</string>
|
||||||
|
<key>AppGroupIdentifier</key>
|
||||||
|
<string>$(APP_GROUP_IDENTIFIER)</string>
|
||||||
<key>EXAppExtensionAttributes</key>
|
<key>EXAppExtensionAttributes</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>EXExtensionPointIdentifier</key>
|
<key>EXExtensionPointIdentifier</key>
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ public struct TypedProfile: Transferable, Codable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public extension UTType {
|
public extension UTType {
|
||||||
static var profile: UTType { .init(exportedAs: "io.nekohasekai.sfavt.profile") }
|
static var profile: UTType { .init(exportedAs: AppConfiguration.profileUTType) }
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !os(tvOS)
|
#if !os(tvOS)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import NetworkExtension
|
|||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
public class ExtensionProfile: ObservableObject {
|
public class ExtensionProfile: ObservableObject {
|
||||||
public static let controlKind = "io.nekohasekai.sfavt.widget.ServiceToggle"
|
public static let controlKind = AppConfiguration.widgetControlKind
|
||||||
|
|
||||||
private let manager: NEVPNManager
|
private let manager: NEVPNManager
|
||||||
private var connection: NEVPNConnection
|
private var connection: NEVPNConnection
|
||||||
@@ -162,9 +162,9 @@ public class ExtensionProfile: ObservableObject {
|
|||||||
manager.localizedDescription = Variant.applicationName
|
manager.localizedDescription = Variant.applicationName
|
||||||
let tunnelProtocol = NETunnelProviderProtocol()
|
let tunnelProtocol = NETunnelProviderProtocol()
|
||||||
if Variant.useSystemExtension {
|
if Variant.useSystemExtension {
|
||||||
tunnelProtocol.providerBundleIdentifier = "\(FilePath.packageName).system"
|
tunnelProtocol.providerBundleIdentifier = AppConfiguration.systemExtensionBundleID
|
||||||
} else {
|
} else {
|
||||||
tunnelProtocol.providerBundleIdentifier = "\(FilePath.packageName).extension"
|
tunnelProtocol.providerBundleIdentifier = AppConfiguration.extensionBundleID
|
||||||
}
|
}
|
||||||
tunnelProtocol.serverAddress = "sing-box"
|
tunnelProtocol.serverAddress = "sing-box"
|
||||||
manager.protocolConfiguration = tunnelProtocol
|
manager.protocolConfiguration = tunnelProtocol
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import Foundation
|
||||||
|
|
||||||
|
public enum AppConfiguration {
|
||||||
|
public static let packageName: String = {
|
||||||
|
guard let value = Bundle.main.object(forInfoDictionaryKey: "BasePackageIdentifier") as? String else {
|
||||||
|
fatalError("Missing BasePackageIdentifier in Info.plist")
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}()
|
||||||
|
|
||||||
|
public static let appGroupID: String = {
|
||||||
|
guard let value = Bundle.main.object(forInfoDictionaryKey: "AppGroupIdentifier") as? String else {
|
||||||
|
fatalError("Missing AppGroupIdentifier in Info.plist")
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}()
|
||||||
|
|
||||||
|
public static var extensionBundleID: String { "\(packageName).extension" }
|
||||||
|
public static var systemExtensionBundleID: String { "\(packageName).system" }
|
||||||
|
public static var fileProviderDomainID: String { "\(packageName).workingdir" }
|
||||||
|
public static var widgetControlKind: String { "\(packageName).widget.ServiceToggle" }
|
||||||
|
public static var profileUTType: String { "\(packageName).profile" }
|
||||||
|
public static var backgroundTaskID: String { "\(packageName).update_profiles" }
|
||||||
|
public static var iCloudContainerID: String { "iCloud.\(packageName)" }
|
||||||
|
}
|
||||||
@@ -1,32 +1,29 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public enum FilePath {
|
public enum FilePath {
|
||||||
public static let packageName = "io.nekohasekai.sfavt"
|
public static let packageName = AppConfiguration.packageName
|
||||||
}
|
public static let groupName = AppConfiguration.appGroupID
|
||||||
|
|
||||||
public extension FilePath {
|
private static let defaultSharedDirectory: URL! = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: groupName)
|
||||||
static let groupName = "group.\(packageName)"
|
|
||||||
|
|
||||||
private static let defaultSharedDirectory: URL! = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: FilePath.groupName)
|
|
||||||
|
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
static let sharedDirectory = defaultSharedDirectory!
|
public static let sharedDirectory = defaultSharedDirectory!
|
||||||
#elseif os(tvOS)
|
#elseif os(tvOS)
|
||||||
static let sharedDirectory = defaultSharedDirectory
|
public static let sharedDirectory = defaultSharedDirectory
|
||||||
.appendingPathComponent("Library", isDirectory: true)
|
.appendingPathComponent("Library", isDirectory: true)
|
||||||
.appendingPathComponent("Caches", isDirectory: true)
|
.appendingPathComponent("Caches", isDirectory: true)
|
||||||
#elseif os(macOS)
|
#elseif os(macOS)
|
||||||
static var sharedDirectory: URL! = defaultSharedDirectory
|
public static var sharedDirectory: URL! = defaultSharedDirectory
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
static let cacheDirectory = sharedDirectory
|
public static let cacheDirectory = sharedDirectory
|
||||||
.appendingPathComponent("Library", isDirectory: true)
|
.appendingPathComponent("Library", isDirectory: true)
|
||||||
.appendingPathComponent("Caches", isDirectory: true)
|
.appendingPathComponent("Caches", isDirectory: true)
|
||||||
#elseif os(tvOS)
|
#elseif os(tvOS)
|
||||||
static let cacheDirectory = sharedDirectory
|
public static let cacheDirectory = sharedDirectory
|
||||||
#elseif os(macOS)
|
#elseif os(macOS)
|
||||||
static var cacheDirectory: URL {
|
public static var cacheDirectory: URL {
|
||||||
sharedDirectory
|
sharedDirectory
|
||||||
.appendingPathComponent("Library", isDirectory: true)
|
.appendingPathComponent("Library", isDirectory: true)
|
||||||
.appendingPathComponent("Caches", isDirectory: true)
|
.appendingPathComponent("Caches", isDirectory: true)
|
||||||
@@ -34,15 +31,15 @@ public extension FilePath {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if os(macOS)
|
#if os(macOS)
|
||||||
static var workingDirectory: URL {
|
public static var workingDirectory: URL {
|
||||||
cacheDirectory.appendingPathComponent("Working", isDirectory: true)
|
cacheDirectory.appendingPathComponent("Working", isDirectory: true)
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static let workingDirectory = cacheDirectory.appendingPathComponent("Working", isDirectory: true)
|
public static let workingDirectory = cacheDirectory.appendingPathComponent("Working", isDirectory: true)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static var iCloudDirectory = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents", isDirectory: true) ?? URL(string: "stub")!
|
public static var iCloudDirectory = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents", isDirectory: true) ?? URL(string: "stub")!
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension URL {
|
public extension URL {
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ class ApplicationDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCe
|
|||||||
@available(iOS 16.0, *)
|
@available(iOS 16.0, *)
|
||||||
private nonisolated func registerFileProviderDomain() {
|
private nonisolated func registerFileProviderDomain() {
|
||||||
let domain = NSFileProviderDomain(
|
let domain = NSFileProviderDomain(
|
||||||
identifier: NSFileProviderDomainIdentifier("io.nekohasekai.sfavt.workingdir"),
|
identifier: NSFileProviderDomainIdentifier(AppConfiguration.fileProviderDomainID),
|
||||||
displayName: "sing-box"
|
displayName: "sing-box"
|
||||||
)
|
)
|
||||||
NSFileProviderManager.add(domain) { error in
|
NSFileProviderManager.add(domain) { error in
|
||||||
|
|||||||
+9
-5
@@ -2,9 +2,13 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>BasePackageIdentifier</key>
|
||||||
|
<string>$(BASE_PACKAGE_IDENTIFIER)</string>
|
||||||
|
<key>AppGroupIdentifier</key>
|
||||||
|
<string>$(APP_GROUP_IDENTIFIER)</string>
|
||||||
<key>BGTaskSchedulerPermittedIdentifiers</key>
|
<key>BGTaskSchedulerPermittedIdentifiers</key>
|
||||||
<array>
|
<array>
|
||||||
<string>io.nekohasekai.sfavt.update_profiles</string>
|
<string>$(BASE_PACKAGE_IDENTIFIER).update_profiles</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleDocumentTypes</key>
|
<key>CFBundleDocumentTypes</key>
|
||||||
<array>
|
<array>
|
||||||
@@ -19,7 +23,7 @@
|
|||||||
<string>Owner</string>
|
<string>Owner</string>
|
||||||
<key>LSItemContentTypes</key>
|
<key>LSItemContentTypes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>io.nekohasekai.sfavt.profile</string>
|
<string>$(BASE_PACKAGE_IDENTIFIER).profile</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
@@ -55,7 +59,7 @@
|
|||||||
</dict>
|
</dict>
|
||||||
<key>NSUbiquitousContainers</key>
|
<key>NSUbiquitousContainers</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>iCloud.io.nekohasekai.sfavt</key>
|
<key>iCloud.$(BASE_PACKAGE_IDENTIFIER)</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
|
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
|
||||||
<true/>
|
<true/>
|
||||||
@@ -84,7 +88,7 @@
|
|||||||
<key>UTTypeIconFiles</key>
|
<key>UTTypeIconFiles</key>
|
||||||
<array/>
|
<array/>
|
||||||
<key>UTTypeIdentifier</key>
|
<key>UTTypeIdentifier</key>
|
||||||
<string>io.nekohasekai.sfavt.profile</string>
|
<string>$(BASE_PACKAGE_IDENTIFIER).profile</string>
|
||||||
<key>UTTypeTagSpecification</key>
|
<key>UTTypeTagSpecification</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>public.filename-extension</key>
|
<key>public.filename-extension</key>
|
||||||
@@ -110,7 +114,7 @@
|
|||||||
<string>AppIcon.icns</string>
|
<string>AppIcon.icns</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UTTypeIdentifier</key>
|
<key>UTTypeIdentifier</key>
|
||||||
<string>io.nekohasekai.sfavt.profile</string>
|
<string>$(BASE_PACKAGE_IDENTIFIER).profile</string>
|
||||||
<key>UTTypeTagSpecification</key>
|
<key>UTTypeTagSpecification</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>public.filename-extension</key>
|
<key>public.filename-extension</key>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>BasePackageIdentifier</key>
|
||||||
|
<string>$(BASE_PACKAGE_IDENTIFIER)</string>
|
||||||
|
<key>AppGroupIdentifier</key>
|
||||||
|
<string>$(APP_GROUP_IDENTIFIER)</string>
|
||||||
<key>CFBundleDocumentTypes</key>
|
<key>CFBundleDocumentTypes</key>
|
||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
@@ -15,7 +19,7 @@
|
|||||||
<string>Owner</string>
|
<string>Owner</string>
|
||||||
<key>LSItemContentTypes</key>
|
<key>LSItemContentTypes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>io.nekohasekai.sfavt.profile</string>
|
<string>$(BASE_PACKAGE_IDENTIFIER).profile</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
@@ -38,7 +42,7 @@
|
|||||||
<false/>
|
<false/>
|
||||||
<key>NSUbiquitousContainers</key>
|
<key>NSUbiquitousContainers</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>iCloud.io.nekohasekai.sfavt</key>
|
<key>iCloud.$(BASE_PACKAGE_IDENTIFIER)</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
|
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
|
||||||
<true/>
|
<true/>
|
||||||
@@ -62,7 +66,7 @@
|
|||||||
<key>UTTypeIconFiles</key>
|
<key>UTTypeIconFiles</key>
|
||||||
<array/>
|
<array/>
|
||||||
<key>UTTypeIdentifier</key>
|
<key>UTTypeIdentifier</key>
|
||||||
<string>io.nekohasekai.sfavt.profile</string>
|
<string>$(BASE_PACKAGE_IDENTIFIER).profile</string>
|
||||||
<key>UTTypeTagSpecification</key>
|
<key>UTTypeTagSpecification</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>public.filename-extension</key>
|
<key>public.filename-extension</key>
|
||||||
@@ -88,7 +92,7 @@
|
|||||||
<string>AppIcon.icns</string>
|
<string>AppIcon.icns</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UTTypeIdentifier</key>
|
<key>UTTypeIdentifier</key>
|
||||||
<string>io.nekohasekai.sfavt.profile</string>
|
<string>$(BASE_PACKAGE_IDENTIFIER).profile</string>
|
||||||
<key>UTTypeTagSpecification</key>
|
<key>UTTypeTagSpecification</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>public.filename-extension</key>
|
<key>public.filename-extension</key>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.application-groups</key>
|
<key>com.apple.security.application-groups</key>
|
||||||
<array>
|
<array>
|
||||||
<string>group.io.nekohasekai.sfavt</string>
|
<string>$(TeamIdentifierPrefix)$(BASE_PACKAGE_IDENTIFIER)</string>
|
||||||
</array>
|
</array>
|
||||||
<key>com.apple.security.files.user-selected.read-write</key>
|
<key>com.apple.security.files.user-selected.read-write</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
|||||||
+8
-4
@@ -2,6 +2,10 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>BasePackageIdentifier</key>
|
||||||
|
<string>$(BASE_PACKAGE_IDENTIFIER)</string>
|
||||||
|
<key>AppGroupIdentifier</key>
|
||||||
|
<string>$(APP_GROUP_IDENTIFIER)</string>
|
||||||
<key>CFBundleDocumentTypes</key>
|
<key>CFBundleDocumentTypes</key>
|
||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
@@ -15,7 +19,7 @@
|
|||||||
<string>Owner</string>
|
<string>Owner</string>
|
||||||
<key>LSItemContentTypes</key>
|
<key>LSItemContentTypes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>io.nekohasekai.sfavt.profile</string>
|
<string>$(BASE_PACKAGE_IDENTIFIER).profile</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
@@ -38,7 +42,7 @@
|
|||||||
<false/>
|
<false/>
|
||||||
<key>NSUbiquitousContainers</key>
|
<key>NSUbiquitousContainers</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>iCloud.io.nekohasekai.sfavt</key>
|
<key>iCloud.$(BASE_PACKAGE_IDENTIFIER)</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
|
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
|
||||||
<true/>
|
<true/>
|
||||||
@@ -62,7 +66,7 @@
|
|||||||
<key>UTTypeIconFiles</key>
|
<key>UTTypeIconFiles</key>
|
||||||
<array/>
|
<array/>
|
||||||
<key>UTTypeIdentifier</key>
|
<key>UTTypeIdentifier</key>
|
||||||
<string>io.nekohasekai.sfavt.profile</string>
|
<string>$(BASE_PACKAGE_IDENTIFIER).profile</string>
|
||||||
<key>UTTypeTagSpecification</key>
|
<key>UTTypeTagSpecification</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>public.filename-extension</key>
|
<key>public.filename-extension</key>
|
||||||
@@ -88,7 +92,7 @@
|
|||||||
<string>AppIcon.icns</string>
|
<string>AppIcon.icns</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UTTypeIdentifier</key>
|
<key>UTTypeIdentifier</key>
|
||||||
<string>io.nekohasekai.sfavt.profile</string>
|
<string>$(BASE_PACKAGE_IDENTIFIER).profile</string>
|
||||||
<key>UTTypeTagSpecification</key>
|
<key>UTTypeTagSpecification</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>public.filename-extension</key>
|
<key>public.filename-extension</key>
|
||||||
|
|||||||
+5
-1
@@ -2,9 +2,13 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>BasePackageIdentifier</key>
|
||||||
|
<string>$(BASE_PACKAGE_IDENTIFIER)</string>
|
||||||
|
<key>AppGroupIdentifier</key>
|
||||||
|
<string>$(APP_GROUP_IDENTIFIER)</string>
|
||||||
<key>BGTaskSchedulerPermittedIdentifiers</key>
|
<key>BGTaskSchedulerPermittedIdentifiers</key>
|
||||||
<array>
|
<array>
|
||||||
<string>io.nekohasekai.sfavt.update_profiles</string>
|
<string>$(BASE_PACKAGE_IDENTIFIER).update_profiles</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleURLTypes</key>
|
<key>CFBundleURLTypes</key>
|
||||||
<array>
|
<array>
|
||||||
|
|||||||
@@ -2,10 +2,14 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>BasePackageIdentifier</key>
|
||||||
|
<string>$(BASE_PACKAGE_IDENTIFIER)</string>
|
||||||
|
<key>AppGroupIdentifier</key>
|
||||||
|
<string>$(APP_GROUP_IDENTIFIER)</string>
|
||||||
<key>NetworkExtension</key>
|
<key>NetworkExtension</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NEMachServiceName</key>
|
<key>NEMachServiceName</key>
|
||||||
<string>group.io.nekohasekai.sfavt.system</string>
|
<string>$(APP_GROUP_IDENTIFIER).system</string>
|
||||||
<key>NEProviderClasses</key>
|
<key>NEProviderClasses</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>com.apple.networkextension.packet-tunnel</key>
|
<key>com.apple.networkextension.packet-tunnel</key>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>com.apple.security.application-groups</key>
|
<key>com.apple.security.application-groups</key>
|
||||||
<array>
|
<array>
|
||||||
<string>group.io.nekohasekai.sfavt</string>
|
<string>$(TeamIdentifierPrefix)$(BASE_PACKAGE_IDENTIFIER)</string>
|
||||||
</array>
|
</array>
|
||||||
<key>com.apple.security.app-sandbox</key>
|
<key>com.apple.security.app-sandbox</key>
|
||||||
<false/>
|
<false/>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>BasePackageIdentifier</key>
|
||||||
|
<string>$(BASE_PACKAGE_IDENTIFIER)</string>
|
||||||
|
<key>AppGroupIdentifier</key>
|
||||||
|
<string>$(APP_GROUP_IDENTIFIER)</string>
|
||||||
<key>NSExtension</key>
|
<key>NSExtension</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSExtensionPointIdentifier</key>
|
<key>NSExtensionPointIdentifier</key>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>BasePackageIdentifier</key>
|
||||||
|
<string>$(BASE_PACKAGE_IDENTIFIER)</string>
|
||||||
|
<key>AppGroupIdentifier</key>
|
||||||
|
<string>$(APP_GROUP_IDENTIFIER)</string>
|
||||||
<key>NSExtension</key>
|
<key>NSExtension</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSExtensionPointIdentifier</key>
|
<key>NSExtensionPointIdentifier</key>
|
||||||
|
|||||||
@@ -1984,7 +1984,9 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
APP_GROUP_IDENTIFIER = "group.$(BASE_PACKAGE_IDENTIFIER)";
|
||||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||||
|
BASE_PACKAGE_IDENTIFIER = io.nekohasekai.sfavt;
|
||||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
@@ -2052,7 +2054,9 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
APP_GROUP_IDENTIFIER = "group.$(BASE_PACKAGE_IDENTIFIER)";
|
||||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||||
|
BASE_PACKAGE_IDENTIFIER = io.nekohasekai.sfavt;
|
||||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
@@ -2367,6 +2371,7 @@
|
|||||||
3AEECBFD2A6DF40A006A0E0C /* Debug */ = {
|
3AEECBFD2A6DF40A006A0E0C /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
APP_GROUP_IDENTIFIER = "$(TeamIdentifierPrefix)$(BASE_PACKAGE_IDENTIFIER)";
|
||||||
CODE_SIGN_ENTITLEMENTS = SystemExtension/SystemExtension.entitlements;
|
CODE_SIGN_ENTITLEMENTS = SystemExtension/SystemExtension.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application";
|
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application";
|
||||||
@@ -2403,6 +2408,7 @@
|
|||||||
3AEECBFE2A6DF40A006A0E0C /* Release */ = {
|
3AEECBFE2A6DF40A006A0E0C /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
APP_GROUP_IDENTIFIER = "$(TeamIdentifierPrefix)$(BASE_PACKAGE_IDENTIFIER)";
|
||||||
CODE_SIGN_ENTITLEMENTS = SystemExtension/SystemExtension.entitlements;
|
CODE_SIGN_ENTITLEMENTS = SystemExtension/SystemExtension.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application";
|
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application";
|
||||||
@@ -2439,6 +2445,7 @@
|
|||||||
3AEECC112A6DF9CA006A0E0C /* Debug */ = {
|
3AEECC112A6DF9CA006A0E0C /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
APP_GROUP_IDENTIFIER = "$(TeamIdentifierPrefix)$(BASE_PACKAGE_IDENTIFIER)";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
|
||||||
@@ -2480,6 +2487,7 @@
|
|||||||
3AEECC122A6DF9CA006A0E0C /* Release */ = {
|
3AEECC122A6DF9CA006A0E0C /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
APP_GROUP_IDENTIFIER = "$(TeamIdentifierPrefix)$(BASE_PACKAGE_IDENTIFIER)";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
|
||||||
|
|||||||
Reference in New Issue
Block a user