Compare commits

..
2 Commits
Author SHA1 Message Date
ScarriffleandClaude Opus 5 6a7afe0647 Drop -sdk from the plan's build commands
-sdk overrides SDKROOT for the whole dependency graph, so the watch app was
built against the iOS SDK. It still succeeded, and produced a watch app with no
WKApplication key — the kind of failure that only shows up on the device.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 16:56:37 +02:00
ScarriffleandClaude Opus 5 9394a80ea2 Add the watchOS app and complication targets
The companion dropdown in Xcode's target template came up empty, which left
both bundle identifiers starting with a bare dot and
WKCompanionAppBundleIdentifier as an empty string. Both are set explicitly
here, along with the App Group entitlements and watchOS 26 as the floor.

The iOS app had no Embed Watch Content phase, so the watch app would have built
and never shipped. Added, with the matching target dependency: the product now
lands at Calendarr iOS.app/Watch/CalendarrWatch.app with the complications
inside it.

Folders follow what they contain: CalendarrWatch is the app,
CalendarrWatchComplications the extension. Xcode had them the other way round.

Package.resolved is now tracked. It pins AppAuth, whose version drift is what
produced the two compile errors fixed in 75a6a5b.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 16:56:26 +02:00
21 changed files with 1032 additions and 27 deletions
+621 -19
View File
@@ -7,10 +7,16 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
D0001A0CABCDEF0100AB5001 /* CalendarrWidgets.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D0001A02ABCDEF0100AB5001 /* CalendarrWidgets.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 3934CF4630544C2E003958B8 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3934CF4530544C2E003958B8 /* WidgetKit.framework */; };
3934CF4830544C2E003958B8 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3934CF4730544C2E003958B8 /* SwiftUI.framework */; };
3934CF5530544C2E003958B8 /* CalendarrWatchComplications.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 3934CF4330544C2E003958B8 /* CalendarrWatchComplications.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
AA9701000001000000000001 /* AppAuth in Frameworks */ = {isa = PBXBuildFile; productRef = AA9701000002000000000001 /* AppAuth */; };
CA1E4D0A0002000000000001 /* CalendarrCore in Frameworks */ = {isa = PBXBuildFile; productRef = CA1E4D0A0001000000000001 /* CalendarrCore */; }; CA1E4D0A0002000000000001 /* CalendarrCore in Frameworks */ = {isa = PBXBuildFile; productRef = CA1E4D0A0001000000000001 /* CalendarrCore */; };
CA1E4D0A0002000000000002 /* CalendarrCore in Frameworks */ = {isa = PBXBuildFile; productRef = CA1E4D0A0001000000000002 /* CalendarrCore */; }; CA1E4D0A0002000000000002 /* CalendarrCore in Frameworks */ = {isa = PBXBuildFile; productRef = CA1E4D0A0001000000000002 /* CalendarrCore */; };
AA9701000001000000000001 /* AppAuth in Frameworks */ = {isa = PBXBuildFile; productRef = AA9701000002000000000001 /* AppAuth */; }; CA1E4D0A0002000000000003 /* CalendarrCore in Frameworks */ = {isa = PBXBuildFile; productRef = CA1E4D0A0001000000000003 /* CalendarrCore */; };
CA1E4D0A0002000000000004 /* CalendarrCore in Frameworks */ = {isa = PBXBuildFile; productRef = CA1E4D0A0001000000000004 /* CalendarrCore */; };
D0001A0CABCDEF0100AB5001 /* CalendarrWidgets.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D0001A02ABCDEF0100AB5001 /* CalendarrWidgets.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
39E1B0010001000000000001 /* CalendarrWatch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 3934CF1A30544C01003958B8 /* CalendarrWatch.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@@ -21,6 +27,27 @@
remoteGlobalIDString = C0000A01FB4E10100AB5001; remoteGlobalIDString = C0000A01FB4E10100AB5001;
remoteInfo = "Calendarr iOS"; remoteInfo = "Calendarr iOS";
}; };
3934CF2730544C02003958B8 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = C0000301FB4E10100AB5001 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 3934CF1930544C01003958B8;
remoteInfo = CalendarrWatch;
};
3934CF3130544C02003958B8 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = C0000301FB4E10100AB5001 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 3934CF1930544C01003958B8;
remoteInfo = CalendarrWatch;
};
3934CF5330544C2E003958B8 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = C0000301FB4E10100AB5001 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 3934CF4230544C2E003958B8;
remoteInfo = CalendarrWatchComplications;
};
D0001A0DABCDEF0100AB5001 /* PBXContainerItemProxy */ = { D0001A0DABCDEF0100AB5001 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy; isa = PBXContainerItemProxy;
containerPortal = C0000301FB4E10100AB5001 /* Project object */; containerPortal = C0000301FB4E10100AB5001 /* Project object */;
@@ -28,9 +55,27 @@
remoteGlobalIDString = D0001A01ABCDEF0100AB5001; remoteGlobalIDString = D0001A01ABCDEF0100AB5001;
remoteInfo = CalendarrWidgets; remoteInfo = CalendarrWidgets;
}; };
39E1B0010003000000000001 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = C0000301FB4E10100AB5001 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 3934CF1930544C01003958B8;
remoteInfo = CalendarrWatch;
};
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */ /* Begin PBXCopyFilesBuildPhase section */
3934CF5A30544C2E003958B8 /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
3934CF5530544C2E003958B8 /* CalendarrWatchComplications.appex in Embed Foundation Extensions */,
);
name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
D0001A0BABCDEF0100AB5001 /* Embed Foundation Extensions */ = { D0001A0BABCDEF0100AB5001 /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase; isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -42,15 +87,39 @@
name = "Embed Foundation Extensions"; name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
39E1B0010002000000000001 /* Embed Watch Content */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "$(CONTENTS_FOLDER_PATH)/Watch";
dstSubfolderSpec = 16;
files = (
39E1B0010001000000000001 /* CalendarrWatch.app in Embed Watch Content */,
);
name = "Embed Watch Content";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
3927C7BC2FB99D0E00EAD8ED /* Calendarr iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Calendarr iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 3927C7BC2FB99D0E00EAD8ED /* Calendarr iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Calendarr iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
3934CF1A30544C01003958B8 /* CalendarrWatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CalendarrWatch.app; sourceTree = BUILT_PRODUCTS_DIR; };
3934CF2630544C02003958B8 /* CalendarrWatchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CalendarrWatchTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3934CF3030544C02003958B8 /* CalendarrWatchUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CalendarrWatchUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3934CF4330544C2E003958B8 /* CalendarrWatchComplications.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = CalendarrWatchComplications.appex; sourceTree = BUILT_PRODUCTS_DIR; };
3934CF4530544C2E003958B8 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
3934CF4730544C2E003958B8 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
C0000B01FC4E10100AB5001 /* Calendarr iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Calendarr iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; C0000B01FC4E10100AB5001 /* Calendarr iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Calendarr iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
D0001A02ABCDEF0100AB5001 /* CalendarrWidgets.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = CalendarrWidgets.appex; sourceTree = BUILT_PRODUCTS_DIR; }; D0001A02ABCDEF0100AB5001 /* CalendarrWidgets.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = CalendarrWidgets.appex; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
3934CF5630544C2E003958B8 /* Exceptions for "CalendarrWatchComplications" folder in "CalendarrWatchComplications" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info.plist,
);
target = 3934CF4230544C2E003958B8 /* CalendarrWatchComplications */;
};
D0001A0FABCDEF0100AB5001 /* Exceptions for "CalendarrWidgets" folder in "CalendarrWidgets" target */ = { D0001A0FABCDEF0100AB5001 /* Exceptions for "CalendarrWidgets" folder in "CalendarrWidgets" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet; isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = ( membershipExceptions = (
@@ -66,6 +135,29 @@
path = "Calendarr iOSTests"; path = "Calendarr iOSTests";
sourceTree = "<group>"; sourceTree = "<group>";
}; };
3934CF1B30544C01003958B8 /* CalendarrWatch */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = CalendarrWatch;
sourceTree = "<group>";
};
3934CF2930544C02003958B8 /* CalendarrWatchTests */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = CalendarrWatchTests;
sourceTree = "<group>";
};
3934CF3330544C02003958B8 /* CalendarrWatchUITests */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = CalendarrWatchUITests;
sourceTree = "<group>";
};
3934CF4930544C2E003958B8 /* CalendarrWatchComplications */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
3934CF5630544C2E003958B8 /* Exceptions for "CalendarrWatchComplications" folder in "CalendarrWatchComplications" target */,
);
path = CalendarrWatchComplications;
sourceTree = "<group>";
};
C0000D01FC4E10100AB5001 /* Calendarr iOS */ = { C0000D01FC4E10100AB5001 /* Calendarr iOS */ = {
isa = PBXFileSystemSynchronizedRootGroup; isa = PBXFileSystemSynchronizedRootGroup;
path = "Calendarr iOS"; path = "Calendarr iOS";
@@ -94,6 +186,38 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
3934CF1730544C01003958B8 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
CA1E4D0A0002000000000003 /* CalendarrCore in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
3934CF2330544C02003958B8 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
3934CF2D30544C02003958B8 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
3934CF4030544C2E003958B8 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
3934CF4830544C2E003958B8 /* SwiftUI.framework in Frameworks */,
3934CF4630544C2E003958B8 /* WidgetKit.framework in Frameworks */,
CA1E4D0A0002000000000004 /* CalendarrCore in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C0000801FB4E10100AB5001 /* Frameworks */ = { C0000801FB4E10100AB5001 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -114,6 +238,15 @@
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
3934CF4430544C2E003958B8 /* Frameworks */ = {
isa = PBXGroup;
children = (
3934CF4530544C2E003958B8 /* WidgetKit.framework */,
3934CF4730544C2E003958B8 /* SwiftUI.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
C0000201FB4E10100AB5001 = { C0000201FB4E10100AB5001 = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -121,6 +254,11 @@
D0001A03ABCDEF0100AB5001 /* CalendarrWidgets */, D0001A03ABCDEF0100AB5001 /* CalendarrWidgets */,
D0001A04ABCDEF0100AB5001 /* Shared */, D0001A04ABCDEF0100AB5001 /* Shared */,
3927C7BD2FB99D0F00EAD8ED /* Calendarr iOSTests */, 3927C7BD2FB99D0F00EAD8ED /* Calendarr iOSTests */,
3934CF1B30544C01003958B8 /* CalendarrWatch */,
3934CF2930544C02003958B8 /* CalendarrWatchTests */,
3934CF3330544C02003958B8 /* CalendarrWatchUITests */,
3934CF4930544C2E003958B8 /* CalendarrWatchComplications */,
3934CF4430544C2E003958B8 /* Frameworks */,
C0000C01FB4E10100AB5001 /* Products */, C0000C01FB4E10100AB5001 /* Products */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
@@ -131,6 +269,10 @@
C0000B01FC4E10100AB5001 /* Calendarr iOS.app */, C0000B01FC4E10100AB5001 /* Calendarr iOS.app */,
3927C7BC2FB99D0E00EAD8ED /* Calendarr iOSTests.xctest */, 3927C7BC2FB99D0E00EAD8ED /* Calendarr iOSTests.xctest */,
D0001A02ABCDEF0100AB5001 /* CalendarrWidgets.appex */, D0001A02ABCDEF0100AB5001 /* CalendarrWidgets.appex */,
3934CF1A30544C01003958B8 /* CalendarrWatch.app */,
3934CF2630544C02003958B8 /* CalendarrWatchTests.xctest */,
3934CF3030544C02003958B8 /* CalendarrWatchUITests.xctest */,
3934CF4330544C2E003958B8 /* CalendarrWatchComplications.appex */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -161,6 +303,100 @@
productReference = 3927C7BC2FB99D0E00EAD8ED /* Calendarr iOSTests.xctest */; productReference = 3927C7BC2FB99D0E00EAD8ED /* Calendarr iOSTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test"; productType = "com.apple.product-type.bundle.unit-test";
}; };
3934CF1930544C01003958B8 /* CalendarrWatch */ = {
isa = PBXNativeTarget;
buildConfigurationList = 3934CF3C30544C02003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatch" */;
buildPhases = (
3934CF1630544C01003958B8 /* Sources */,
3934CF1730544C01003958B8 /* Frameworks */,
3934CF1830544C01003958B8 /* Resources */,
3934CF5A30544C2E003958B8 /* Embed Foundation Extensions */,
);
buildRules = (
);
dependencies = (
3934CF5430544C2E003958B8 /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
3934CF1B30544C01003958B8 /* CalendarrWatch */,
);
name = CalendarrWatch;
packageProductDependencies = (
CA1E4D0A0001000000000003 /* CalendarrCore */,
);
productName = CalendarrWatch;
productReference = 3934CF1A30544C01003958B8 /* CalendarrWatch.app */;
productType = "com.apple.product-type.application";
};
3934CF2530544C02003958B8 /* CalendarrWatchTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 3934CF3D30544C02003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatchTests" */;
buildPhases = (
3934CF2230544C02003958B8 /* Sources */,
3934CF2330544C02003958B8 /* Frameworks */,
3934CF2430544C02003958B8 /* Resources */,
);
buildRules = (
);
dependencies = (
3934CF2830544C02003958B8 /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
3934CF2930544C02003958B8 /* CalendarrWatchTests */,
);
name = CalendarrWatchTests;
packageProductDependencies = (
);
productName = CalendarrWatchTests;
productReference = 3934CF2630544C02003958B8 /* CalendarrWatchTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
3934CF2F30544C02003958B8 /* CalendarrWatchUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 3934CF3E30544C02003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatchUITests" */;
buildPhases = (
3934CF2C30544C02003958B8 /* Sources */,
3934CF2D30544C02003958B8 /* Frameworks */,
3934CF2E30544C02003958B8 /* Resources */,
);
buildRules = (
);
dependencies = (
3934CF3230544C02003958B8 /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
3934CF3330544C02003958B8 /* CalendarrWatchUITests */,
);
name = CalendarrWatchUITests;
packageProductDependencies = (
);
productName = CalendarrWatchUITests;
productReference = 3934CF3030544C02003958B8 /* CalendarrWatchUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
3934CF4230544C2E003958B8 /* CalendarrWatchComplications */ = {
isa = PBXNativeTarget;
buildConfigurationList = 3934CF5730544C2E003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatchComplications" */;
buildPhases = (
3934CF3F30544C2E003958B8 /* Sources */,
3934CF4030544C2E003958B8 /* Frameworks */,
3934CF4130544C2E003958B8 /* Resources */,
);
buildRules = (
);
dependencies = (
);
fileSystemSynchronizedGroups = (
3934CF4930544C2E003958B8 /* CalendarrWatchComplications */,
);
name = CalendarrWatchComplications;
packageProductDependencies = (
CA1E4D0A0001000000000004 /* CalendarrCore */,
);
productName = CalendarrWatchComplications;
productReference = 3934CF4330544C2E003958B8 /* CalendarrWatchComplications.appex */;
productType = "com.apple.product-type.app-extension";
};
C0000A01FB4E10100AB5001 /* Calendarr iOS */ = { C0000A01FB4E10100AB5001 /* Calendarr iOS */ = {
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = C0001601FB4E10100AB5001 /* Build configuration list for PBXNativeTarget "Calendarr iOS" */; buildConfigurationList = C0001601FB4E10100AB5001 /* Build configuration list for PBXNativeTarget "Calendarr iOS" */;
@@ -169,11 +405,13 @@
C0000801FB4E10100AB5001 /* Frameworks */, C0000801FB4E10100AB5001 /* Frameworks */,
C0000901FB4E10100AB5001 /* Resources */, C0000901FB4E10100AB5001 /* Resources */,
D0001A0BABCDEF0100AB5001 /* Embed Foundation Extensions */, D0001A0BABCDEF0100AB5001 /* Embed Foundation Extensions */,
39E1B0010002000000000001 /* Embed Watch Content */,
); );
buildRules = ( buildRules = (
); );
dependencies = ( dependencies = (
D0001A0EABCDEF0100AB5001 /* PBXTargetDependency */, D0001A0EABCDEF0100AB5001 /* PBXTargetDependency */,
39E1B0010004000000000001 /* PBXTargetDependency */,
); );
fileSystemSynchronizedGroups = ( fileSystemSynchronizedGroups = (
C0000D01FC4E10100AB5001 /* Calendarr iOS */, C0000D01FC4E10100AB5001 /* Calendarr iOS */,
@@ -219,13 +457,27 @@
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
BuildIndependentTargetsInParallel = 1; BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 2650; LastSwiftUpdateCheck = 2700;
LastUpgradeCheck = 2640; LastUpgradeCheck = 2640;
TargetAttributes = { TargetAttributes = {
3927C7BB2FB99D0E00EAD8ED = { 3927C7BB2FB99D0E00EAD8ED = {
CreatedOnToolsVersion = 26.5; CreatedOnToolsVersion = 26.5;
TestTargetID = C0000A01FB4E10100AB5001; TestTargetID = C0000A01FB4E10100AB5001;
}; };
3934CF1930544C01003958B8 = {
CreatedOnToolsVersion = 27.0;
};
3934CF2530544C02003958B8 = {
CreatedOnToolsVersion = 27.0;
TestTargetID = 3934CF1930544C01003958B8;
};
3934CF2F30544C02003958B8 = {
CreatedOnToolsVersion = 27.0;
TestTargetID = 3934CF1930544C01003958B8;
};
3934CF4230544C2E003958B8 = {
CreatedOnToolsVersion = 27.0;
};
C0000A01FB4E10100AB5001 = { C0000A01FB4E10100AB5001 = {
CreatedOnToolsVersion = 26.4.1; CreatedOnToolsVersion = 26.4.1;
}; };
@@ -256,6 +508,10 @@
C0000A01FB4E10100AB5001 /* Calendarr iOS */, C0000A01FB4E10100AB5001 /* Calendarr iOS */,
D0001A01ABCDEF0100AB5001 /* CalendarrWidgets */, D0001A01ABCDEF0100AB5001 /* CalendarrWidgets */,
3927C7BB2FB99D0E00EAD8ED /* Calendarr iOSTests */, 3927C7BB2FB99D0E00EAD8ED /* Calendarr iOSTests */,
3934CF1930544C01003958B8 /* CalendarrWatch */,
3934CF2530544C02003958B8 /* CalendarrWatchTests */,
3934CF2F30544C02003958B8 /* CalendarrWatchUITests */,
3934CF4230544C2E003958B8 /* CalendarrWatchComplications */,
); );
}; };
/* End PBXProject section */ /* End PBXProject section */
@@ -268,6 +524,34 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
3934CF1830544C01003958B8 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
3934CF2430544C02003958B8 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
3934CF2E30544C02003958B8 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
3934CF4130544C2E003958B8 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
C0000901FB4E10100AB5001 /* Resources */ = { C0000901FB4E10100AB5001 /* Resources */ = {
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -292,6 +576,34 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
3934CF1630544C01003958B8 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
3934CF2230544C02003958B8 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
3934CF2C30544C02003958B8 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
3934CF3F30544C2E003958B8 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
C0000701FB4E10100AB5001 /* Sources */ = { C0000701FB4E10100AB5001 /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -314,11 +626,31 @@
target = C0000A01FB4E10100AB5001 /* Calendarr iOS */; target = C0000A01FB4E10100AB5001 /* Calendarr iOS */;
targetProxy = 3927C7C02FB99D0F00EAD8ED /* PBXContainerItemProxy */; targetProxy = 3927C7C02FB99D0F00EAD8ED /* PBXContainerItemProxy */;
}; };
3934CF2830544C02003958B8 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 3934CF1930544C01003958B8 /* CalendarrWatch */;
targetProxy = 3934CF2730544C02003958B8 /* PBXContainerItemProxy */;
};
3934CF3230544C02003958B8 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 3934CF1930544C01003958B8 /* CalendarrWatch */;
targetProxy = 3934CF3130544C02003958B8 /* PBXContainerItemProxy */;
};
3934CF5430544C2E003958B8 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 3934CF4230544C2E003958B8 /* CalendarrWatchComplications */;
targetProxy = 3934CF5330544C2E003958B8 /* PBXContainerItemProxy */;
};
D0001A0EABCDEF0100AB5001 /* PBXTargetDependency */ = { D0001A0EABCDEF0100AB5001 /* PBXTargetDependency */ = {
isa = PBXTargetDependency; isa = PBXTargetDependency;
target = D0001A01ABCDEF0100AB5001 /* CalendarrWidgets */; target = D0001A01ABCDEF0100AB5001 /* CalendarrWidgets */;
targetProxy = D0001A0DABCDEF0100AB5001 /* PBXContainerItemProxy */; targetProxy = D0001A0DABCDEF0100AB5001 /* PBXContainerItemProxy */;
}; };
39E1B0010004000000000001 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 3934CF1930544C01003958B8 /* CalendarrWatch */;
targetProxy = 39E1B0010003000000000001 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */ /* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */ /* Begin XCBuildConfiguration section */
@@ -372,6 +704,232 @@
}; };
name = Release; name = Release;
}; };
3934CF3630544C02003958B8 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = PP34X97WS3;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = CalendarrWatch;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.scarriffleservices.calendarr.ios;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
CODE_SIGN_ENTITLEMENTS = CalendarrWatch/CalendarrWatch.entitlements;
PRODUCT_BUNDLE_IDENTIFIER = com.scarriffleservices.calendarr.ios.watchkitapp;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 26.0;
};
name = Debug;
};
3934CF3730544C02003958B8 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = PP34X97WS3;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = CalendarrWatch;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.scarriffleservices.calendarr.ios;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
CODE_SIGN_ENTITLEMENTS = CalendarrWatch/CalendarrWatch.entitlements;
PRODUCT_BUNDLE_IDENTIFIER = com.scarriffleservices.calendarr.ios.watchkitapp;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 26.0;
};
name = Release;
};
3934CF3830544C02003958B8 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = PP34X97WS3;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.scarriffleservices.calendarr.ios.watchkitapp.CalendarrWatch-Watch-AppTests";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CalendarrWatch.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/CalendarrWatch";
WATCHOS_DEPLOYMENT_TARGET = 26.0;
};
name = Debug;
};
3934CF3930544C02003958B8 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = PP34X97WS3;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.scarriffleservices.calendarr.ios.watchkitapp.CalendarrWatch-Watch-AppTests";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CalendarrWatch.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/CalendarrWatch";
WATCHOS_DEPLOYMENT_TARGET = 26.0;
};
name = Release;
};
3934CF3A30544C02003958B8 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = PP34X97WS3;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.scarriffleservices.calendarr.ios.watchkitapp.CalendarrWatch-Watch-AppUITests";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
TEST_TARGET_NAME = CalendarrWatch;
WATCHOS_DEPLOYMENT_TARGET = 26.0;
};
name = Debug;
};
3934CF3B30544C02003958B8 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = PP34X97WS3;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.scarriffleservices.calendarr.ios.watchkitapp.CalendarrWatch-Watch-AppUITests";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
TEST_TARGET_NAME = CalendarrWatch;
WATCHOS_DEPLOYMENT_TARGET = 26.0;
};
name = Release;
};
3934CF5830544C2E003958B8 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = PP34X97WS3;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = CalendarrWatchComplications/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = CalendarrWatch;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
"@executable_path/../../../../Frameworks",
);
MARKETING_VERSION = 1.0;
CODE_SIGN_ENTITLEMENTS = CalendarrWatchComplications/CalendarrWatchComplications.entitlements;
PRODUCT_BUNDLE_IDENTIFIER = com.scarriffleservices.calendarr.ios.watchkitapp.complications;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 26.0;
};
name = Debug;
};
3934CF5930544C2E003958B8 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = PP34X97WS3;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = CalendarrWatchComplications/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = CalendarrWatch;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
"@executable_path/../../../../Frameworks",
);
MARKETING_VERSION = 1.0;
CODE_SIGN_ENTITLEMENTS = CalendarrWatchComplications/CalendarrWatchComplications.entitlements;
PRODUCT_BUNDLE_IDENTIFIER = com.scarriffleservices.calendarr.ios.watchkitapp.complications;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 26.0;
};
name = Release;
};
C0001401FB4E10100AB5001 /* Debug */ = { C0001401FB4E10100AB5001 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
@@ -678,6 +1236,42 @@
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
3934CF3C30544C02003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatch" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3934CF3630544C02003958B8 /* Debug */,
3934CF3730544C02003958B8 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
3934CF3D30544C02003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatchTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3934CF3830544C02003958B8 /* Debug */,
3934CF3930544C02003958B8 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
3934CF3E30544C02003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatchUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3934CF3A30544C02003958B8 /* Debug */,
3934CF3B30544C02003958B8 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
3934CF5730544C2E003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatchComplications" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3934CF5830544C2E003958B8 /* Debug */,
3934CF5930544C2E003958B8 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C0000601FB4E10100AB5001 /* Build configuration list for PBXProject "Calendarr iOS" */ = { C0000601FB4E10100AB5001 /* Build configuration list for PBXProject "Calendarr iOS" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (
@@ -707,22 +1301,6 @@
}; };
/* End XCConfigurationList section */ /* End XCConfigurationList section */
/* Begin XCSwiftPackageProductDependency section */
CA1E4D0A0001000000000001 /* CalendarrCore */ = {
isa = XCSwiftPackageProductDependency;
productName = CalendarrCore;
};
CA1E4D0A0001000000000002 /* CalendarrCore */ = {
isa = XCSwiftPackageProductDependency;
productName = CalendarrCore;
};
AA9701000002000000000001 /* AppAuth */ = {
isa = XCSwiftPackageProductDependency;
package = AA9701000003000000000001 /* XCRemoteSwiftPackageReference "AppAuth-iOS" */;
productName = AppAuth;
};
/* End XCSwiftPackageProductDependency section */
/* Begin XCLocalSwiftPackageReference section */ /* Begin XCLocalSwiftPackageReference section */
39450EFC302A266A0090DDD7 /* XCLocalSwiftPackageReference "../CalendarrKit" */ = { 39450EFC302A266A0090DDD7 /* XCLocalSwiftPackageReference "../CalendarrKit" */ = {
isa = XCLocalSwiftPackageReference; isa = XCLocalSwiftPackageReference;
@@ -740,6 +1318,30 @@
}; };
}; };
/* End XCRemoteSwiftPackageReference section */ /* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
AA9701000002000000000001 /* AppAuth */ = {
isa = XCSwiftPackageProductDependency;
package = AA9701000003000000000001 /* XCRemoteSwiftPackageReference "AppAuth-iOS" */;
productName = AppAuth;
};
CA1E4D0A0001000000000001 /* CalendarrCore */ = {
isa = XCSwiftPackageProductDependency;
productName = CalendarrCore;
};
CA1E4D0A0001000000000003 /* CalendarrCore */ = {
isa = XCSwiftPackageProductDependency;
productName = CalendarrCore;
};
CA1E4D0A0001000000000004 /* CalendarrCore */ = {
isa = XCSwiftPackageProductDependency;
productName = CalendarrCore;
};
CA1E4D0A0001000000000002 /* CalendarrCore */ = {
isa = XCSwiftPackageProductDependency;
productName = CalendarrCore;
};
/* End XCSwiftPackageProductDependency section */
}; };
rootObject = C0000301FB4E10100AB5001 /* Project object */; rootObject = C0000301FB4E10100AB5001 /* Project object */;
} }
@@ -0,0 +1,15 @@
{
"originHash" : "478d8419d86ca78c1539d3775396b811ce835c77379f2af98e26eefd35ee2311",
"pins" : [
{
"identity" : "appauth-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/openid/AppAuth-iOS.git",
"state" : {
"revision" : "2781038865a80e2c425a1da12cc1327bcd56501f",
"version" : "1.7.6"
}
}
],
"version" : 3
}
@@ -9,11 +9,31 @@
<key>orderHint</key> <key>orderHint</key>
<integer>0</integer> <integer>0</integer>
</dict> </dict>
<key>CalendarrWidgets.xcscheme_^#shared#^_</key> <key>CalendarrWatch Watch App.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
</dict>
<key>CalendarrWatch.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>2</integer> <integer>2</integer>
</dict> </dict>
<key>CalendarrWatchComplications.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
</dict>
<key>CalendarrWatchExtension.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>4</integer>
</dict>
<key>CalendarrWidgets.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>4</integer>
</dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key> <key>SuppressBuildableAutocreation</key>
<dict> <dict>
@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,13 @@
{
"images" : [
{
"idiom" : "universal",
"platform" : "watchos",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.scarriffleservices.calendarr</string>
</array>
</dict>
</plist>
+17
View File
@@ -0,0 +1,17 @@
//
// CalendarrWatchApp.swift
// CalendarrWatch Watch App
//
// Created by Guido Schmit on 11.09.2026.
//
import SwiftUI
@main
struct CalendarrWatch_Watch_AppApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
+24
View File
@@ -0,0 +1,24 @@
//
// ContentView.swift
// CalendarrWatch Watch App
//
// Created by Guido Schmit on 11.09.2026.
//
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
}
.padding()
}
}
#Preview {
ContentView()
}
@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,13 @@
{
"images" : [
{
"idiom" : "universal",
"platform" : "watchos",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,86 @@
//
// CalendarrWatch.swift
// CalendarrWatch
//
// Created by Guido Schmit on 11.09.2026.
//
import WidgetKit
import SwiftUI
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date(), emoji: "😀")
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
let entry = SimpleEntry(date: Date(), emoji: "😀")
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
var entries: [SimpleEntry] = []
// Generate a timeline consisting of five entries an hour apart, starting from the current date.
let currentDate = Date()
for hourOffset in 0 ..< 5 {
let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
let entry = SimpleEntry(date: entryDate, emoji: "😀")
entries.append(entry)
}
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
}
// func relevances() async -> WidgetRelevances<Void> {
// // Generate a list containing the contexts this widget is relevant in.
// }
}
struct SimpleEntry: TimelineEntry {
let date: Date
let emoji: String
}
struct CalendarrWatchEntryView : View {
var entry: Provider.Entry
var body: some View {
VStack {
HStack {
Text("Time:")
Text(entry.date, style: .time)
}
Text("Emoji:")
Text(entry.emoji)
}
}
}
struct CalendarrWatch: Widget {
let kind: String = "CalendarrWatch"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
if #available(watchOS 10.0, *) {
CalendarrWatchEntryView(entry: entry)
.containerBackground(.fill.tertiary, for: .widget)
} else {
CalendarrWatchEntryView(entry: entry)
.padding()
.background()
}
}
.configurationDisplayName("My Widget")
.description("This is an example widget.")
}
}
#Preview(as: .accessoryRectangular) {
CalendarrWatch()
} timeline: {
SimpleEntry(date: .now, emoji: "😀")
SimpleEntry(date: .now, emoji: "🤩")
}
@@ -0,0 +1,17 @@
//
// CalendarrWatchBundle.swift
// CalendarrWatch
//
// Created by Guido Schmit on 11.09.2026.
//
import WidgetKit
import SwiftUI
@main
struct CalendarrWatchBundle: WidgetBundle {
var body: some Widget {
CalendarrWatch()
CalendarrWatchControl()
}
}
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.scarriffleservices.calendarr</string>
</array>
</dict>
</plist>
@@ -0,0 +1,54 @@
//
// CalendarrWatchControl.swift
// CalendarrWatch
//
// Created by Guido Schmit on 11.09.2026.
//
import AppIntents
import SwiftUI
import WidgetKit
struct CalendarrWatchControl: ControlWidget {
var body: some ControlWidgetConfiguration {
StaticControlConfiguration(
kind: ".watchkitapp.CalendarrWatch",
provider: Provider()
) { value in
ControlWidgetToggle(
"Start Timer",
isOn: value,
action: StartTimerIntent()
) { isRunning in
Label(isRunning ? "On" : "Off", systemImage: "timer")
}
}
.displayName("Timer")
.description("A an example control that runs a timer.")
}
}
extension CalendarrWatchControl {
struct Provider: ControlValueProvider {
var previewValue: Bool {
false
}
func currentValue() async throws -> Bool {
let isRunning = true // Check if the timer is running
return isRunning
}
}
}
struct StartTimerIntent: SetValueIntent {
static let title: LocalizedStringResource = "Start a timer"
@Parameter(title: "Timer is running")
var value: Bool
func perform() async throws -> some IntentResult {
// Start / stop the timer based on `value`.
return .result()
}
}
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.widgetkit-extension</string>
</dict>
</dict>
</plist>
@@ -0,0 +1,19 @@
//
// CalendarrWatch_Watch_AppTests.swift
// CalendarrWatch Watch AppTests
//
// Created by Guido Schmit on 11.09.2026.
//
import Testing
@testable import CalendarrWatch_Watch_App
struct CalendarrWatch_Watch_AppTests {
@Test func example() async throws {
// Write your test here and use APIs like `#expect(...)` to check expected conditions.
// Swift Testing Documentation
// https://developer.apple.com/documentation/testing
}
}
@@ -0,0 +1,43 @@
//
// CalendarrWatch_Watch_AppUITests.swift
// CalendarrWatch Watch AppUITests
//
// Created by Guido Schmit on 11.09.2026.
//
import XCTest
final class CalendarrWatch_Watch_AppUITests: XCTestCase {
override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
// In UI tests it is usually best to stop immediately when a failure occurs.
continueAfterFailure = false
// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}
override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
@MainActor
func testExample() throws {
// UI tests must launch the application that they test.
let app = XCUIApplication()
app.launch()
// Use XCTAssert and related functions to verify your tests produce the correct results.
// XCUIAutomation Documentation
// https://developer.apple.com/documentation/xcuiautomation
}
@MainActor
func testLaunchPerformance() throws {
// This measures how long it takes to launch your application.
measure(metrics: [XCTApplicationLaunchMetric()]) {
XCUIApplication().launch()
}
}
}
@@ -26,6 +26,12 @@ Xcode 26.6 ships the watchOS 26.5 SDK. The target device runs watchOS 27 beta, s
## Working rules for this repo ## Working rules for this repo
- **Never pass `-sdk` to xcodebuild.** It overrides SDKROOT for every target in
the dependency graph, so the watch app gets built against the iOS SDK: the
build still succeeds, but `WKApplication` is missing from the result and
`DTSDKName` reads `iphonesimulator`. Select the platform with `-destination`
alone and let each target keep its own SDK.
- Never run or start the server, and never run the apps. Apps are **build-verified only**; behaviour, layout and complication refresh are verified by the user on the device. - Never run or start the server, and never run the apps. Apps are **build-verified only**; behaviour, layout and complication refresh are verified by the user on the device.
- Commit messages in English. Commit after every task. - Commit messages in English. Commit after every task.
- `CalendarrKit` is a **separate git repo** at `../CalendarrKit` with **no remote** — commit there, do not push. The iOS repo (`.`) pushes to `origin main`. - `CalendarrKit` is a **separate git repo** at `../CalendarrKit` with **no remote** — commit there, do not push. The iOS repo (`.`) pushes to `origin main`.
@@ -509,7 +515,7 @@ import CalendarrCore
- [ ] **Step 6: Build the iOS app to verify the adoption compiles** - [ ] **Step 6: Build the iOS app to verify the adoption compiles**
```bash ```bash
xcodebuild -project "Calendarr iOS.xcodeproj" -scheme "Calendarr iOS" -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build xcodebuild -project "Calendarr iOS.xcodeproj" -scheme "Calendarr iOS" -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build
``` ```
Expected: `** BUILD SUCCEEDED **`. Expected: `** BUILD SUCCEEDED **`.
@@ -1529,7 +1535,7 @@ In `Calendarr iOS/CalendarrApp.swift`, in `AppState.logout()`, after the existin
- [ ] **Step 5: Build the iOS app** - [ ] **Step 5: Build the iOS app**
```bash ```bash
xcodebuild -project "Calendarr iOS.xcodeproj" -scheme "Calendarr iOS" -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build xcodebuild -project "Calendarr iOS.xcodeproj" -scheme "Calendarr iOS" -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build
``` ```
Expected: `** BUILD SUCCEEDED **`. Expected: `** BUILD SUCCEEDED **`.
@@ -1615,7 +1621,7 @@ For both new bundle IDs, enable the **App Groups** capability and select `group.
- [ ] **Step 6: Verify both targets build** - [ ] **Step 6: Verify both targets build**
```bash ```bash
xcodebuild -project "Calendarr iOS.xcodeproj" -scheme CalendarrWatch -sdk watchsimulator -destination 'generic/platform=watchOS Simulator' CODE_SIGNING_ALLOWED=NO build xcodebuild -project "Calendarr iOS.xcodeproj" -scheme "Calendarr iOS" -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build
``` ```
Expected: `** BUILD SUCCEEDED **` (an empty app at this point). Expected: `** BUILD SUCCEEDED **` (an empty app at this point).
@@ -2349,7 +2355,7 @@ struct WatchCalendarFilterView: View {
- [ ] **Step 2: Build the watch app** - [ ] **Step 2: Build the watch app**
```bash ```bash
xcodebuild -project "Calendarr iOS.xcodeproj" -scheme CalendarrWatch -sdk watchsimulator -destination 'generic/platform=watchOS Simulator' CODE_SIGNING_ALLOWED=NO build xcodebuild -project "Calendarr iOS.xcodeproj" -scheme "Calendarr iOS" -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build
``` ```
Expected: `** BUILD SUCCEEDED **`. Expected: `** BUILD SUCCEEDED **`.
@@ -3012,7 +3018,7 @@ struct WatchDatePlusEventWidget: Widget {
- [ ] **Step 5: Build the complications target** - [ ] **Step 5: Build the complications target**
```bash ```bash
xcodebuild -project "Calendarr iOS.xcodeproj" -scheme CalendarrWatch -sdk watchsimulator -destination 'generic/platform=watchOS Simulator' CODE_SIGNING_ALLOWED=NO build xcodebuild -project "Calendarr iOS.xcodeproj" -scheme "Calendarr iOS" -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build
``` ```
Expected: `** BUILD SUCCEEDED **` — the scheme builds the embedded extension too. Expected: `** BUILD SUCCEEDED **` — the scheme builds the embedded extension too.
@@ -3046,8 +3052,8 @@ Expected: build succeeds against the native macOS SDK, every test passes.
```bash ```bash
cd "../Calendarr iOS" cd "../Calendarr iOS"
xcodebuild -project "Calendarr iOS.xcodeproj" -scheme "Calendarr iOS" -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build xcodebuild -project "Calendarr iOS.xcodeproj" -scheme "Calendarr iOS" -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build
xcodebuild -project "Calendarr iOS.xcodeproj" -scheme CalendarrWatch -sdk watchsimulator -destination 'generic/platform=watchOS Simulator' CODE_SIGNING_ALLOWED=NO build xcodebuild -project "Calendarr iOS.xcodeproj" -scheme "Calendarr iOS" -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build
``` ```
Expected: `** BUILD SUCCEEDED **` twice. Expected: `** BUILD SUCCEEDED **` twice.