Overhaul native approval UX and add widget surfaces
Some checks failed
CI / test (push) Has been cancelled

Bring the SwiftUI app in line with the Apple-native mock and keep pending approvals actionable from Live Activities and watch complications.
This commit is contained in:
2026-04-19 16:29:13 +02:00
parent a6939453f8
commit 61a0cc1f7d
63 changed files with 3496 additions and 1769 deletions

View File

@@ -40,6 +40,29 @@
B1000000000000000000001F /* OneTimePasscodeGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000018 /* OneTimePasscodeGeneratorTests.swift */; };
B10000000000000000000020 /* AppViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000019 /* AppViewModelTests.swift */; };
B10000000000000000000021 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B2000000000000000000001B /* XCTest.framework */; };
B10000000000000000000022 /* IdPTokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2000000000000000000001C /* IdPTokens.swift */; };
B10000000000000000000023 /* ButtonStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2000000000000000000001D /* ButtonStyles.swift */; };
B10000000000000000000024 /* GlassChrome.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2000000000000000000001E /* GlassChrome.swift */; };
B10000000000000000000025 /* Cards.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2000000000000000000001F /* Cards.swift */; };
B10000000000000000000026 /* StatusDot.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000020 /* StatusDot.swift */; };
B10000000000000000000027 /* Haptics.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000021 /* Haptics.swift */; };
B10000000000000000000028 /* IdPTokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000022 /* IdPTokens.swift */; };
B10000000000000000000029 /* ButtonStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000023 /* ButtonStyles.swift */; };
B1000000000000000000002A /* GlassChrome.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000024 /* GlassChrome.swift */; };
B1000000000000000000002B /* Cards.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000025 /* Cards.swift */; };
B1000000000000000000002C /* StatusDot.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000026 /* StatusDot.swift */; };
B1000000000000000000002D /* Haptics.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000027 /* Haptics.swift */; };
B1000000000000000000002E /* ApprovalActivityController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000028 /* ApprovalActivityController.swift */; };
B1000000000000000000002F /* ApprovalActivityController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000028 /* ApprovalActivityController.swift */; };
B10000000000000000000030 /* ApprovalActivityModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000029 /* ApprovalActivityModels.swift */; };
B10000000000000000000031 /* ApprovalActivityModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000029 /* ApprovalActivityModels.swift */; };
B10000000000000000000032 /* IDPGlobalWidgetsBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2000000000000000000002A /* IDPGlobalWidgetsBundle.swift */; };
B10000000000000000000033 /* IDPGlobalWidgets.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = B2000000000000000000002C /* IDPGlobalWidgets.appex */; platformFilter = ios; };
B10000000000000000000034 /* IDPGlobalWidgets.appex in Embed Widget Extensions */ = {isa = PBXBuildFile; fileRef = B2000000000000000000002C /* IDPGlobalWidgets.appex */; platformFilter = watchos; };
B10000000000000000000035 /* AppModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000003 /* AppModels.swift */; };
B10000000000000000000036 /* AppStateStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000011 /* AppStateStore.swift */; };
B10000000000000000000037 /* MockIDPService.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000004 /* MockIDPService.swift */; };
B10000000000000000000038 /* PairingPayloadParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20000000000000000000013 /* PairingPayloadParser.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -57,6 +80,13 @@
remoteGlobalIDString = B50000000000000000000001;
remoteInfo = IDPGlobal;
};
B90000000000000000000005 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = B60000000000000000000001 /* Project object */;
proxyType = 1;
remoteGlobalIDString = B50000000000000000000004;
remoteInfo = IDPGlobalWidgets;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -71,6 +101,28 @@
name = "Embed Watch Content";
runOnlyForDeploymentPostprocessing = 0;
};
B3000000000000000000000B /* Embed App Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
B10000000000000000000033 /* IDPGlobalWidgets.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
B3000000000000000000000F /* Embed Widget Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
B10000000000000000000034 /* IDPGlobalWidgets.appex in Embed Widget Extensions */,
);
name = "Embed Widget Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
@@ -101,6 +153,23 @@
B20000000000000000000019 /* AppViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppViewModelTests.swift; sourceTree = "<group>"; };
B2000000000000000000001A /* IDPGlobalTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IDPGlobalTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
B2000000000000000000001B /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/MacOSX.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
B2000000000000000000001C /* IdPTokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdPTokens.swift; sourceTree = "<group>"; };
B2000000000000000000001D /* ButtonStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonStyles.swift; sourceTree = "<group>"; };
B2000000000000000000001E /* GlassChrome.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlassChrome.swift; sourceTree = "<group>"; };
B2000000000000000000001F /* Cards.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cards.swift; sourceTree = "<group>"; };
B20000000000000000000020 /* StatusDot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusDot.swift; sourceTree = "<group>"; };
B20000000000000000000021 /* Haptics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Haptics.swift; sourceTree = "<group>"; };
B20000000000000000000022 /* IdPTokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdPTokens.swift; sourceTree = "<group>"; };
B20000000000000000000023 /* ButtonStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonStyles.swift; sourceTree = "<group>"; };
B20000000000000000000024 /* GlassChrome.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlassChrome.swift; sourceTree = "<group>"; };
B20000000000000000000025 /* Cards.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cards.swift; sourceTree = "<group>"; };
B20000000000000000000026 /* StatusDot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusDot.swift; sourceTree = "<group>"; };
B20000000000000000000027 /* Haptics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Haptics.swift; sourceTree = "<group>"; };
B20000000000000000000028 /* ApprovalActivityController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApprovalActivityController.swift; sourceTree = "<group>"; };
B20000000000000000000029 /* ApprovalActivityModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApprovalActivityModels.swift; sourceTree = "<group>"; };
B2000000000000000000002A /* IDPGlobalWidgetsBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IDPGlobalWidgetsBundle.swift; sourceTree = "<group>"; };
B2000000000000000000002B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
B2000000000000000000002C /* IDPGlobalWidgets.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = IDPGlobalWidgets.appex; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -126,6 +195,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
B3000000000000000000000C /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@@ -163,6 +239,7 @@
children = (
B20000000000000000000010 /* AppTheme.swift */,
B2000000000000000000000F /* AppComponents.swift */,
B20000000000000000000028 /* ApprovalActivityController.swift */,
B20000000000000000000001 /* IDPGlobalApp.swift */,
B20000000000000000000002 /* AppViewModel.swift */,
);
@@ -172,6 +249,7 @@
B40000000000000000000005 /* Core */ = {
isa = PBXGroup;
children = (
B40000000000000000000010 /* Design */,
B40000000000000000000006 /* Models */,
B40000000000000000000007 /* Services */,
);
@@ -182,6 +260,7 @@
isa = PBXGroup;
children = (
B20000000000000000000003 /* AppModels.swift */,
B20000000000000000000029 /* ApprovalActivityModels.swift */,
);
path = Models;
sourceTree = "<group>";
@@ -212,6 +291,7 @@
children = (
B20000000000000000000009 /* IDPGlobal.app */,
B2000000000000000000000A /* IDPGlobalWatch.app */,
B2000000000000000000002C /* IDPGlobalWidgets.appex */,
B2000000000000000000001A /* IDPGlobalTests.xctest */,
);
name = Products;
@@ -242,7 +322,9 @@
isa = PBXGroup;
children = (
B4000000000000000000000D /* App */,
B40000000000000000000011 /* Design */,
B4000000000000000000000E /* Features */,
B40000000000000000000012 /* Widgets */,
);
path = WatchApp;
sourceTree = "<group>";
@@ -273,6 +355,41 @@
path = Tests;
sourceTree = "<group>";
};
B40000000000000000000010 /* Design */ = {
isa = PBXGroup;
children = (
B2000000000000000000001D /* ButtonStyles.swift */,
B2000000000000000000001F /* Cards.swift */,
B2000000000000000000001E /* GlassChrome.swift */,
B20000000000000000000021 /* Haptics.swift */,
B2000000000000000000001C /* IdPTokens.swift */,
B20000000000000000000020 /* StatusDot.swift */,
);
path = Design;
sourceTree = "<group>";
};
B40000000000000000000011 /* Design */ = {
isa = PBXGroup;
children = (
B20000000000000000000023 /* ButtonStyles.swift */,
B20000000000000000000025 /* Cards.swift */,
B20000000000000000000024 /* GlassChrome.swift */,
B20000000000000000000027 /* Haptics.swift */,
B20000000000000000000022 /* IdPTokens.swift */,
B20000000000000000000026 /* StatusDot.swift */,
);
path = Design;
sourceTree = "<group>";
};
B40000000000000000000012 /* Widgets */ = {
isa = PBXGroup;
children = (
B2000000000000000000002A /* IDPGlobalWidgetsBundle.swift */,
B2000000000000000000002B /* Info.plist */,
);
path = Widgets;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -284,11 +401,13 @@
B30000000000000000000001 /* Frameworks */,
B30000000000000000000003 /* Resources */,
B30000000000000000000004 /* Embed Watch Content */,
B3000000000000000000000B /* Embed App Extensions */,
);
buildRules = (
);
dependencies = (
B90000000000000000000002 /* PBXTargetDependency */,
B90000000000000000000006 /* PBXTargetDependency */,
);
name = IDPGlobal;
productName = IDPGlobal;
@@ -302,10 +421,12 @@
B30000000000000000000007 /* Sources */,
B30000000000000000000005 /* Frameworks */,
B30000000000000000000006 /* Resources */,
B3000000000000000000000F /* Embed Widget Extensions */,
);
buildRules = (
);
dependencies = (
B90000000000000000000007 /* PBXTargetDependency */,
);
name = IDPGlobalWatch;
productName = IDPGlobalWatch;
@@ -330,6 +451,23 @@
productReference = B2000000000000000000001A /* IDPGlobalTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
B50000000000000000000004 /* IDPGlobalWidgets */ = {
isa = PBXNativeTarget;
buildConfigurationList = B70000000000000000000005 /* Build configuration list for PBXNativeTarget "IDPGlobalWidgets" */;
buildPhases = (
B3000000000000000000000E /* Sources */,
B3000000000000000000000C /* Frameworks */,
B3000000000000000000000D /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = IDPGlobalWidgets;
productName = IDPGlobalWidgets;
productReference = B2000000000000000000002C /* IDPGlobalWidgets.appex */;
productType = "com.apple.product-type.app-extension";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@@ -350,6 +488,9 @@
CreatedOnToolsVersion = 26.0;
TestTargetID = B50000000000000000000001;
};
B50000000000000000000004 = {
CreatedOnToolsVersion = 26.0;
};
};
};
buildConfigurationList = B70000000000000000000001 /* Build configuration list for PBXProject "IDPGlobal" */;
@@ -368,6 +509,7 @@
B50000000000000000000001 /* IDPGlobal */,
B50000000000000000000002 /* IDPGlobalWatch */,
B50000000000000000000003 /* IDPGlobalTests */,
B50000000000000000000004 /* IDPGlobalWidgets */,
);
};
/* End PBXProject section */
@@ -395,6 +537,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
B3000000000000000000000D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -402,15 +551,22 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B1000000000000000000002E /* ApprovalActivityController.swift in Sources */,
B10000000000000000000030 /* ApprovalActivityModels.swift in Sources */,
B10000000000000000000015 /* AppStateStore.swift in Sources */,
B10000000000000000000012 /* AppComponents.swift in Sources */,
B10000000000000000000014 /* AppTheme.swift in Sources */,
B10000000000000000000002 /* AppViewModel.swift in Sources */,
B10000000000000000000023 /* ButtonStyles.swift in Sources */,
B10000000000000000000025 /* Cards.swift in Sources */,
B10000000000000000000024 /* GlassChrome.swift in Sources */,
B10000000000000000000027 /* Haptics.swift in Sources */,
B10000000000000000000019 /* HomeCards.swift in Sources */,
B10000000000000000000018 /* HomePanels.swift in Sources */,
B10000000000000000000008 /* HomeRootView.swift in Sources */,
B1000000000000000000001A /* HomeSheets.swift in Sources */,
B10000000000000000000001 /* IDPGlobalApp.swift in Sources */,
B10000000000000000000022 /* IdPTokens.swift in Sources */,
B10000000000000000000006 /* LoginRootView.swift in Sources */,
B10000000000000000000004 /* MockIDPService.swift in Sources */,
B10000000000000000000010 /* NFCPairingView.swift in Sources */,
@@ -419,6 +575,7 @@
B10000000000000000000003 /* AppModels.swift in Sources */,
B10000000000000000000017 /* PairingPayloadParser.swift in Sources */,
B10000000000000000000007 /* QRScannerView.swift in Sources */,
B10000000000000000000026 /* StatusDot.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -426,15 +583,22 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B1000000000000000000002F /* ApprovalActivityController.swift in Sources */,
B1000000000000000000001C /* AppStateStore.swift in Sources */,
B10000000000000000000013 /* AppComponents.swift in Sources */,
B1000000000000000000001B /* AppTheme.swift in Sources */,
B10000000000000000000009 /* AppViewModel.swift in Sources */,
B1000000000000000000000A /* AppModels.swift in Sources */,
B10000000000000000000029 /* ButtonStyles.swift in Sources */,
B1000000000000000000002B /* Cards.swift in Sources */,
B1000000000000000000002A /* GlassChrome.swift in Sources */,
B1000000000000000000002D /* Haptics.swift in Sources */,
B1000000000000000000000D /* IDPGlobalWatchApp.swift in Sources */,
B10000000000000000000028 /* IdPTokens.swift in Sources */,
B1000000000000000000000B /* MockIDPService.swift in Sources */,
B1000000000000000000000C /* NotificationCoordinator.swift in Sources */,
B1000000000000000000001D /* PairingPayloadParser.swift in Sources */,
B1000000000000000000002C /* StatusDot.swift in Sources */,
B1000000000000000000000E /* WatchRootView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -449,6 +613,19 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
B3000000000000000000000E /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B10000000000000000000031 /* ApprovalActivityModels.swift in Sources */,
B10000000000000000000035 /* AppModels.swift in Sources */,
B10000000000000000000036 /* AppStateStore.swift in Sources */,
B10000000000000000000032 /* IDPGlobalWidgetsBundle.swift in Sources */,
B10000000000000000000037 /* MockIDPService.swift in Sources */,
B10000000000000000000038 /* PairingPayloadParser.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
@@ -463,6 +640,18 @@
target = B50000000000000000000001 /* IDPGlobal */;
targetProxy = B90000000000000000000003 /* PBXContainerItemProxy */;
};
B90000000000000000000006 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
platformFilter = ios;
target = B50000000000000000000004 /* IDPGlobalWidgets */;
targetProxy = B90000000000000000000005 /* PBXContainerItemProxy */;
};
B90000000000000000000007 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
platformFilter = watchos;
target = B50000000000000000000004 /* IDPGlobalWidgets */;
targetProxy = B90000000000000000000005 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
@@ -485,8 +674,8 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
MACOSX_DEPLOYMENT_TARGET = 14.0;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
MACOSX_DEPLOYMENT_TARGET = 26.0;
SDKROOT = auto;
SWIFT_VERSION = 5.0;
};
@@ -512,8 +701,8 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
MACOSX_DEPLOYMENT_TARGET = 14.0;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
MACOSX_DEPLOYMENT_TARGET = 26.0;
SDKROOT = auto;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
@@ -533,11 +722,23 @@
ENABLE_TESTABILITY = YES;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleURLTypes = (
{
CFBundleTypeRole = Editor;
CFBundleURLName = idpglobal;
CFBundleURLSchemes = (
idpglobal,
);
},
);
INFOPLIST_KEY_CFBundleDisplayName = "idp.global";
INFOPLIST_KEY_LSUIElement = YES;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
INFOPLIST_KEY_NSCameraUsageDescription = "Scan pairing QR codes from the idp.global web portal.";
INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Attach a signed GPS position to NFC authentication before binding this device.";
INFOPLIST_KEY_NFCReaderUsageDescription = "Read an idp.global pairing tag to bind this device.";
INFOPLIST_KEY_NSSupportsLiveActivities = YES;
INFOPLIST_KEY_NSSupportsLiveActivitiesFrequentUpdates = YES;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
LD_RUNPATH_SEARCH_PATHS = (
@@ -554,6 +755,8 @@
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
MACOSX_DEPLOYMENT_TARGET = 26.0;
};
name = Debug;
};
@@ -568,11 +771,23 @@
DEVELOPMENT_ASSET_PATHS = "";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleURLTypes = (
{
CFBundleTypeRole = Editor;
CFBundleURLName = idpglobal;
CFBundleURLSchemes = (
idpglobal,
);
},
);
INFOPLIST_KEY_CFBundleDisplayName = "idp.global";
INFOPLIST_KEY_LSUIElement = YES;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
INFOPLIST_KEY_NSCameraUsageDescription = "Scan pairing QR codes from the idp.global web portal.";
INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "Attach a signed GPS position to NFC authentication before binding this device.";
INFOPLIST_KEY_NFCReaderUsageDescription = "Read an idp.global pairing tag to bind this device.";
INFOPLIST_KEY_NSSupportsLiveActivities = YES;
INFOPLIST_KEY_NSSupportsLiveActivitiesFrequentUpdates = YES;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
LD_RUNPATH_SEARCH_PATHS = (
@@ -588,6 +803,8 @@
SWIFT_OBSERVATION_ENABLED = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
MACOSX_DEPLOYMENT_TARGET = 26.0;
};
name = Release;
};
@@ -595,11 +812,21 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CODE_SIGN_ENTITLEMENTS = IDPGlobalShared.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleURLTypes = (
{
CFBundleTypeRole = Editor;
CFBundleURLName = idpglobal;
CFBundleURLSchemes = (
idpglobal,
);
},
);
INFOPLIST_KEY_CFBundleDisplayName = "idp.global Watch";
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = global.idp.app;
LD_RUNPATH_SEARCH_PATHS = (
@@ -616,7 +843,7 @@
SWIFT_OBSERVATION_ENABLED = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 10.0;
WATCHOS_DEPLOYMENT_TARGET = 11.0;
};
name = Debug;
};
@@ -624,11 +851,21 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CODE_SIGN_ENTITLEMENTS = IDPGlobalShared.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleURLTypes = (
{
CFBundleTypeRole = Editor;
CFBundleURLName = idpglobal;
CFBundleURLSchemes = (
idpglobal,
);
},
);
INFOPLIST_KEY_CFBundleDisplayName = "idp.global Watch";
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = global.idp.app;
LD_RUNPATH_SEARCH_PATHS = (
@@ -645,18 +882,23 @@
SWIFT_OBSERVATION_ENABLED = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 10.0;
WATCHOS_DEPLOYMENT_TARGET = 11.0;
};
name = Release;
};
B80000000000000000000007 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/IDPGlobal.app/Contents/MacOS/IDPGlobal.debug.dylib";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MACOSX_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@loader_path/../Frameworks",
"@loader_path/../../../IDPGlobal.app/Contents/MacOS",
);
MACOSX_DEPLOYMENT_TARGET = 26.0;
MARKETING_VERSION = 0.1.0;
PRODUCT_BUNDLE_IDENTIFIER = global.idp.app.tests;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -664,7 +906,6 @@
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = macosx;
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/IDPGlobal.app/Contents/MacOS/IDPGlobal";
TEST_TARGET_NAME = IDPGlobal;
};
name = Debug;
@@ -672,11 +913,16 @@
B80000000000000000000008 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/IDPGlobal.app/Contents/MacOS/IDPGlobal.debug.dylib";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MACOSX_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@loader_path/../Frameworks",
"@loader_path/../../../IDPGlobal.app/Contents/MacOS",
);
MACOSX_DEPLOYMENT_TARGET = 26.0;
MARKETING_VERSION = 0.1.0;
PRODUCT_BUNDLE_IDENTIFIER = global.idp.app.tests;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -684,11 +930,68 @@
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = macosx;
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/IDPGlobal.app/Contents/MacOS/IDPGlobal";
TEST_TARGET_NAME = IDPGlobal;
};
name = Release;
};
B80000000000000000000009 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
APPLICATION_EXTENSION_API_ONLY = YES;
CODE_SIGN_ENTITLEMENTS = IDPGlobalShared.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = WatchApp/Widgets/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 0.1.0;
PRODUCT_BUNDLE_IDENTIFIER = global.idp.app.watchkitapp.widgets;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = auto;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator watchos watchsimulator";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
WATCHOS_DEPLOYMENT_TARGET = 11.0;
};
name = Debug;
};
B8000000000000000000000A /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
APPLICATION_EXTENSION_API_ONLY = YES;
CODE_SIGN_ENTITLEMENTS = IDPGlobalShared.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = WatchApp/Widgets/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 0.1.0;
PRODUCT_BUNDLE_IDENTIFIER = global.idp.app.watchkitapp.widgets;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = auto;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator watchos watchsimulator";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
WATCHOS_DEPLOYMENT_TARGET = 11.0;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -728,6 +1031,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
B70000000000000000000005 /* Build configuration list for PBXNativeTarget "IDPGlobalWidgets" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B80000000000000000000009 /* Debug */,
B8000000000000000000000A /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = B60000000000000000000001 /* Project object */;