Skip to content

fix(ios): resolve the widget App Group under Sideloadly - #2798

Closed
haavardvirik02-ux wants to merge 1 commit into
ryanbr:mainfrom
haavardvirik02-ux:fix/sideloadly-widget-app-group
Closed

haavardvirik02-ux wants to merge 1 commit into
ryanbr:mainfrom
haavardvirik02-ux:fix/sideloadly-widget-app-group

Conversation

@haavardvirik02-ux

Copy link
Copy Markdown

Problem

Widgets stay empty when NOOP is installed with Sideloadly using a free Apple ID.

Sideloadly re-signs with a free team the same way AltStore and SideStore do: it remaps the requested App Group (group.com.noopapp.noop.staging) to a team-unique identifier. Unlike AltStore and SideStore, it writes no ALTAppGroups key into Info.plist. WidgetSnapshot.suiteName therefore falls back to the build-time AppGroupIdentifier, which the signature does not grant. The app and the widget extension each end up writing to a private suite, so the widget never sees a snapshot.

Observed install: Sideloadly 7-day free signing, final bundle id com.noopapp.noop.<TEAMID>, extensions kept.

Change

  • WidgetSnapshot.resolveSuiteName takes an extra provisionedGroups list. These are the groups the signature actually grants, read from the bundle's own embedded.mobileprovision. The list is merged with ALTAppGroups and resolved by the existing rules, so the matching logic doesn't change.
  • Each process reads its own bundle, so the app and the appex each resolve from their own profile and land on the same remapped group.
  • Xcode builds are unchanged, because their profile grants the configured group itself. Simulator and App Store builds have no embedded profile, so the list is empty and behaviour is as before.

Verification

  • New StrandTests cases: a Sideloadly-style remapped group wins without ALTAppGroups; a profile granting the configured group keeps it; app groups are extracted from a CMS-wrapped plist, and a garbage profile gives an empty list.
  • The resolver and profile parser were compiled standalone with swiftc and run against those cases.
  • Fork testing build (fork-testing-build.yml) succeeded on all legs, including iOS.
  • Tools/doc_comment_lint.py: no new detached doc comments.
  • Not yet confirmed on device with a Sideloadly install of this build. StrandTests will run on the macOS leg of app-build.yml.

No Android twin: the change only affects iOS App Group resolution under re-signing.

🤖 Generated with Claude Code

Sideloadly re-signs with a free team the same way AltStore does, remapping
the requested App Group to a team-unique identifier, but it writes no
ALTAppGroups key. WidgetSnapshot.suiteName then fell back to the build-time
AppGroupIdentifier, which the signature does not grant, so the app and the
widget extension each wrote to a private suite and the widgets stayed empty.

Read the groups the signature actually grants from the bundle's
embedded.mobileprovision and treat them like ALTAppGroups. Xcode builds are
unchanged: their profile grants the configured group itself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@haavardvirik02-ux

Copy link
Copy Markdown
Author

Closing this: the premise was wrong. Device logs show Sideloadly with a free Apple ID doesn't provision App Groups at all. The installed app's entitlements have no com.apple.security.application-groups, and the widget extension is killed at launch with a CODESIGNING "Invalid Page" termination, so there's no remapped group for this change to find. Sorry for the noise.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant