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:
世界
2026-01-03 02:46:52 +08:00
parent 64e2ece819
commit 81d6827334
21 changed files with 118 additions and 41 deletions
@@ -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 {
+4
View File
@@ -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)
+5 -1
View File
@@ -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>
+4
View File
@@ -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>
+1 -1
View File
@@ -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)
+3 -3
View File
@@ -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
+25
View File
@@ -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)" }
}
+12 -15
View File
@@ -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 {
+1 -1
View File
@@ -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
View File
@@ -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>
+8 -4
View File
@@ -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>
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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>
+5 -1
View File
@@ -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>
+1 -1
View File
@@ -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/>
+4
View File
@@ -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
View File
@@ -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>
+8
View File
@@ -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;