Skip to content

Load ExtensionKit extensions from Extensions/ as well as PlugIns/ - #6

Closed
dddd-zdf wants to merge 1 commit into
SideStore:mainfrom
dddd-zdf:scan-extensionkit-extensions
Closed

dddd-zdf wants to merge 1 commit into
SideStore:mainfrom
dddd-zdf:scan-extensionkit-extensions

Conversation

@dddd-zdf

Copy link
Copy Markdown

Problem

AppBundle.loadExtensions() only looks in PlugIns/. ExtensionKit extensions (EXAppExtensionAttributes, product type com.apple.product-type.extensionkit-extension) are embedded in Extensions/ instead. One example is the iOS 26.1/27 PhotoKit background upload extension (com.apple.photos.background-upload).

Because SideStore builds everything from appExtensions (App IDs, profiles, bundle ID rewriting, entitlements, signing), such an extension is skipped. It keeps its original bundle ID, gets no profile, and is signed with the main app's entitlements, so the install fails.

Moving the extension to PlugIns/ is not a workaround. iOS then rejects it with IXErrorDomain Code=17 "extensionDictionary must be set in placeholder attributes for an app extension placeholder", because it expects an NSExtension dictionary there.

Fix

Scan both PlugIns/ and Extensions/ for .appex bundles. Apps without an Extensions/ folder behave exactly as before.

Testing

  • New unit test appExtensionsIncludeExtensionKitExtensions (a fake app with one extension in each folder). swift test passes on macOS 26 / Xcode 26.4, all 6 tests. Added import Foundation to the test file, which the new test needs.
  • On a device: SideStore develop (12ff39c) with this change, a free developer account, and iOS 27. An app with a PhotoKit background upload extension installs, the extension gets its own App ID, profile and app group, and iOS runs it to upload photos in the background.

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@dddd-zdf dddd-zdf closed this Oct 15, 2026
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