feat(release): production Apple builds — notarized macOS dmg + iOS TestFlight

release.yml (v* tags / dispatch, macos-arm64 runner): universal mac +
iOS xcframework -> xcodebuild archive -> Developer ID export ->
notarytool + staple -> dmg on the Gitea release; iOS archive uploads
to TestFlight (app-store-connect/upload). Per-run throwaway keychain;
ASC API key authenticates notarization, upload, and automatic-signing
profile fetch. macOS App Store lane deferred (needs App Sandbox);
tvOS deferred (tier-3 Rust targets).

All app targets now share bundle ID io.unom.punktfunk — ONE App Store
listing with universal purchase (decided pre-submission; effectively
unchangeable after). ITSAppUsesNonExemptEncryption=false declared
(standard-algorithm AES-GCM, exempt).

build-xcframework.sh resolves Apple toolchains itself: cargo's HOST
artifacts (proc-macros, build scripts) are loaded by the running OS,
and a newer-than-OS beta Xcode ld emits LINKEDIT layouts dyld rejects
("mis-aligned LINKEDIT string pool" -> misleading E0463) — so prefer
a non-beta Xcode for everything, fall back to CLT for mac-only slices
(env untouched: an explicit DEVELOPER_DIR=<CLT> trips xcrun's license
check), refuse iOS/tvOS without a real Xcode (CLT has no iOS SDK).
The runner plist no longer injects DEVELOPER_DIR for the same reason.

punktfunk_Logo.icon: dropped the Xcode-27-beta-only Icon Composer
features (refractivity, specular-location) — 26.5's actool crashes on
them, and store builds must use release Xcode. Visual delta is the
refraction/specular nuance only; re-author when 27 ships.

Validated on home-mac-mini-1 with Xcode 26.5: mac+iOS xcframework
slices, unified bundle IDs, signing-free app build.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 14:34:45 +00:00
parent c8099c0125
commit 57e7f9fe25
7 changed files with 363 additions and 98 deletions
+52 -73
View File
@@ -1,108 +1,87 @@
{
"features" : [
"refractivity",
"specular-location"
],
"fill" : {
"automatic-gradient" : "display-p3:0.39502,0.30640,0.96338,1.00000"
"fill": {
"automatic-gradient": "display-p3:0.39502,0.30640,0.96338,1.00000"
},
"groups" : [
"groups": [
{
"layers" : [
"layers": [
{
"image-name" : "punktfunk_Minimal_Icon-Composer_Layer-3.svg",
"name" : "punktfunk_Minimal_Icon-Composer_Layer-3"
"image-name": "punktfunk_Minimal_Icon-Composer_Layer-3.svg",
"name": "punktfunk_Minimal_Icon-Composer_Layer-3"
}
],
"name" : "Group",
"refractivity" : {
"depth" : 0.0419921875,
"enabled" : true,
"strength" : 0.5463671875
"name": "Group",
"shadow": {
"kind": "neutral",
"opacity": 0.6
},
"shadow" : {
"kind" : "neutral",
"opacity" : 0.6
},
"translucency" : {
"enabled" : true,
"value" : 0.6
"translucency": {
"enabled": true,
"value": 0.6
}
},
{
"blur-material" : null,
"layers" : [
"blur-material": null,
"layers": [
{
"image-name" : "punktfunk_Minimal_Icon-Composer_Layer-2 2.svg",
"name" : "punktfunk_Minimal_Icon-Composer_Layer-2"
"image-name": "punktfunk_Minimal_Icon-Composer_Layer-2 2.svg",
"name": "punktfunk_Minimal_Icon-Composer_Layer-2"
}
],
"lighting" : "individual",
"name" : "Group",
"refractivity" : {
"depth" : 0.1,
"enabled" : false,
"strength" : 0.57
"lighting": "individual",
"name": "Group",
"shadow": {
"kind": "layer-color",
"opacity": 0.56
},
"shadow" : {
"kind" : "layer-color",
"opacity" : 0.56
},
"specular" : true,
"translucency" : {
"enabled" : true,
"value" : 1
"specular": true,
"translucency": {
"enabled": true,
"value": 1
}
},
{
"blur-material" : 0,
"layers" : [
"blur-material": 0,
"layers": [
{
"fill-specializations" : [
"fill-specializations": [
{
"appearance" : "dark",
"value" : {
"automatic-gradient" : "display-p3:0.44238,0.34595,0.99951,1.00000"
"appearance": "dark",
"value": {
"automatic-gradient": "display-p3:0.44238,0.34595,0.99951,1.00000"
}
}
],
"image-name" : "punktfunk_Minimal_Icon-Composer_Layer-1 2.svg",
"name" : "punktfunk_Minimal_Icon-Composer_Layer-1"
"image-name": "punktfunk_Minimal_Icon-Composer_Layer-1 2.svg",
"name": "punktfunk_Minimal_Icon-Composer_Layer-1"
}
],
"refractivity" : {
"depth" : 0.5808984375,
"enabled" : true,
"strength" : 0.2508984375
"shadow": {
"kind": "neutral",
"opacity": 0.6
},
"shadow" : {
"kind" : "neutral",
"opacity" : 0.6
},
"specular" : "outside",
"translucency" : {
"enabled" : true,
"value" : 0.53
"specular": true,
"translucency": {
"enabled": true,
"value": 0.53
}
},
{
"layers" : [
],
"shadow" : {
"kind" : "neutral",
"opacity" : 0.6
"layers": [],
"shadow": {
"kind": "neutral",
"opacity": 0.6
},
"translucency" : {
"enabled" : true,
"value" : 0.2
"translucency": {
"enabled": true,
"value": 0.2
}
}
],
"supported-platforms" : {
"circles" : [
"supported-platforms": {
"circles": [
"watchOS"
],
"squares" : "shared"
"squares": "shared"
}
}
}