From e55e9587c769f38eb73ddd59cf4f38fa268bc69a Mon Sep 17 00:00:00 2001 From: tashda Date: Mon, 4 May 2026 10:51:35 +0200 Subject: [PATCH 1/3] Fix Xcode Cloud release signing configuration --- Shellbee.xcodeproj/project.pbxproj | 18 ++++-------------- ci_scripts/ci_post_clone.sh | 2 +- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/Shellbee.xcodeproj/project.pbxproj b/Shellbee.xcodeproj/project.pbxproj index 4be5a94..a9f4ced 100644 --- a/Shellbee.xcodeproj/project.pbxproj +++ b/Shellbee.xcodeproj/project.pbxproj @@ -871,12 +871,9 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGN_ENTITLEMENTS = Shellbee.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = JQU2HR44D8; + DEVELOPMENT_TEAM = "$(APP_DEVELOPMENT_TEAM)"; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = Config/Info.plist; @@ -890,8 +887,6 @@ MARKETING_VERSION = 1.6.1; PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_ID)"; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Shellbee App Store"; STRING_CATALOG_GENERATE_SYMBOLS = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -952,12 +947,9 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = ShellbeeWidgets.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = JQU2HR44D8; + DEVELOPMENT_TEAM = "$(APP_DEVELOPMENT_TEAM)"; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ShellbeeWidgets/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Shellbee Widgets"; @@ -972,8 +964,6 @@ MARKETING_VERSION = 1.6.1; PRODUCT_BUNDLE_IDENTIFIER = "$(APP_WIDGET_BUNDLE_ID)"; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Shellbee Widgets App Store"; SKIP_INSTALL = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; diff --git a/ci_scripts/ci_post_clone.sh b/ci_scripts/ci_post_clone.sh index 95fc078..59e173a 100755 --- a/ci_scripts/ci_post_clone.sh +++ b/ci_scripts/ci_post_clone.sh @@ -6,7 +6,7 @@ # # Required env vars (set in Xcode Cloud workflow → Environment Variables): # SHELLBEE_BUNDLE_ID e.g. com.tashda.shellbee -# SHELLBEE_TEAM_ID e.g. JQU2HR44D8 (mark as secret) +# SHELLBEE_TEAM_ID e.g. JQU2HR44D8 (plain text; do not mark secret) # SHELLBEE_WIDGET_SUFFIX e.g. widgets # # These are intentionally renamed (vs. APP_BUNDLE_ID / APP_DEVELOPMENT_TEAM) to From b8b7dffa5d5a6dba6b0138f0588cbd6d1ff7500d Mon Sep 17 00:00:00 2001 From: tashda Date: Mon, 4 May 2026 11:02:15 +0200 Subject: [PATCH 2/3] Force Apple Distribution for Release device signing --- Shellbee.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Shellbee.xcodeproj/project.pbxproj b/Shellbee.xcodeproj/project.pbxproj index a9f4ced..100dc28 100644 --- a/Shellbee.xcodeproj/project.pbxproj +++ b/Shellbee.xcodeproj/project.pbxproj @@ -833,6 +833,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGN_ENTITLEMENTS = Shellbee.entitlements; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = "$(APP_DEVELOPMENT_TEAM)"; @@ -908,6 +909,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = ShellbeeWidgets.entitlements; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = "$(APP_DEVELOPMENT_TEAM)"; From 7c3f9f360e275263c67a8f5381c9471ad3ddae50 Mon Sep 17 00:00:00 2001 From: tashda Date: Mon, 4 May 2026 11:03:33 +0200 Subject: [PATCH 3/3] Settings: register Device/Group destinations on the outer stack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LogsView wraps itself in its own NavigationStack and is pushed inside the Settings tab's stack. SwiftUI's behaviour with nested NavigationStacks is inconsistent: NavigationLink(value:) pushes from inside the nested stack can silently route to the *outer* stack, which in this case had no DeviceRoute / GroupRoute handler. Result: tapping the device/group hero card on a log opened via Settings → Logs did nothing — the user perceived it as being dropped back to the tab root. Register the same handlers on SettingsView and BridgeSettingsView NavigationStacks as a safety net so the push lands correctly no matter which enclosing stack SwiftUI picks. The handlers inside LogsView's own stack are kept too, so the in-tab Logs path also still works. Co-Authored-By: Claude Opus 4.7 (1M context) --- Shellbee/Features/Settings/BridgeSettingsView.swift | 10 ++++++++++ Shellbee/Features/Settings/SettingsView.swift | 13 +++++++++++++ 2 files changed, 23 insertions(+) diff --git a/Shellbee/Features/Settings/BridgeSettingsView.swift b/Shellbee/Features/Settings/BridgeSettingsView.swift index 9b35fb7..5c73b60 100644 --- a/Shellbee/Features/Settings/BridgeSettingsView.swift +++ b/Shellbee/Features/Settings/BridgeSettingsView.swift @@ -39,6 +39,16 @@ struct BridgeSettingsView: View { } .navigationTitle(displayName) .navigationBarTitleDisplayMode(.inline) + // Match SettingsView — Logs is reachable from per-bridge settings via + // the Tools section and the device/group hero card inside log detail + // pushes a DeviceRoute / GroupRoute that needs a handler on the + // enclosing stack. + .navigationDestination(for: DeviceRoute.self) { route in + DeviceDetailView(bridgeID: route.bridgeID, device: route.device) + } + .navigationDestination(for: GroupRoute.self) { route in + GroupDetailView(bridgeID: route.bridgeID, group: route.group) + } .sheet(item: editorBinding) { vm in NavigationStack { ConnectionEditorView(viewModel: vm, mode: .save) diff --git a/Shellbee/Features/Settings/SettingsView.swift b/Shellbee/Features/Settings/SettingsView.swift index 6863cb0..82ad526 100644 --- a/Shellbee/Features/Settings/SettingsView.swift +++ b/Shellbee/Features/Settings/SettingsView.swift @@ -55,6 +55,19 @@ struct SettingsView: View { } } .navigationTitle("Settings") + // Settings → Logs pushes LogsView (which has its own + // NavigationStack). Inside LogsView's log-detail screen, the + // device/group hero card uses NavigationLink(value:) to push a + // DeviceRoute / GroupRoute. With nested NavigationStacks SwiftUI + // can route the push to whichever stack first matches a + // destination — register handlers on the outer Settings stack as + // a safety net so the tap always lands on the right screen. + .navigationDestination(for: DeviceRoute.self) { route in + DeviceDetailView(bridgeID: route.bridgeID, device: route.device) + } + .navigationDestination(for: GroupRoute.self) { route in + GroupDetailView(bridgeID: route.bridgeID, group: route.group) + } .toolbar { ToolbarItem(placement: .topBarTrailing) { Menu {