Skip to content

Apps: list and refresh an app whose profile iOS removed - #103

Merged
SirReaDy merged 1 commit into
mainfrom
fix/expired-app-refresh
Oct 30, 2026
Merged

SirReaDy merged 1 commit into
mainfrom
fix/expired-app-refresh

Conversation

@SirReaDy

Copy link
Copy Markdown
Collaborator

iOS deletes a provisioning profile once it expires. The Apps page found apps through their profiles, so an expired sideloaded app vanished from the list, and refreshing it failed with "This app can't be refreshed here" (installer.kept_ipa_missing).

Changes

  • Listing: apps are read from the device's user apps. An app with no profile left is still listed when its bundle id ends with one of the account's team ids (com.example.app.TEAMID), marked profileGone, shown as "Expired · won't open", and counted as expired, so Refresh and automatic refresh pick it up.
  • Profile-only refresh: when the device has no profile for the app, the team's App IDs for the app and its extensions say what needs a new profile.
  • App ID gone: when Apple has removed the app's App ID (a free team's are removed after 7 days), the refresh plan installs the same version again from where it came from (new reason app-id, "Installed again: Apple removed its App ID once it expired").
  • Text in all six languages; docs/ui.md updated; both roadmaps.

Tests

  • Installer: an app without a profile is listed (and an App Store app without a team suffix isn't); a profile refresh without profiles on the device; a plan that reinstalls when the App ID is gone.
  • UI: an app whose profile iOS removed shows as expired and refreshes on request (fake scenario apps-profile-gone).
  • pnpm verify passes; the tests also pass twice under full CPU load.
  • Checked against a real iPhone (iOS 26.6.1): the expired app's profile was gone from the device and its App ID from the team, which is what these cases cover.

iOS deletes a provisioning profile once it expires. The Apps page found apps
through their profiles, so an expired app disappeared from the list, and a
profile-only refresh found no App IDs to renew.

- An app left without a profile is still listed, by the team at the end of
  its bundle id, as "Expired · won't open", and Refresh offers it.
- A profile-only refresh takes the team's App IDs for the app and its
  extensions when the device has no profile for them.
- When Apple has removed the app's App ID (a free team's go after 7 days),
  the refresh installs the same version again from where it came from.
@SirReaDy
SirReaDy merged commit 5d20393 into main Oct 30, 2026
8 checks passed
@SirReaDy
SirReaDy deleted the fix/expired-app-refresh branch October 30, 2026 18:57
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