Skip to content

download: fetch the ipa, inject metadata + sinfs#6

Closed
Evil0ctal wants to merge 1 commit into
feat/m2.5-version-metadatafrom
feat/m3-download
Closed

download: fetch the ipa, inject metadata + sinfs#6
Evil0ctal wants to merge 1 commit into
feat/m2.5-version-metadatafrom
feat/m3-download

Conversation

@Evil0ctal
Copy link
Copy Markdown
Owner

what

end-to-end download path. tap a version in the timeline -> Download button
enqueues a task -> service walks it through download/patch/done. tab two
(Downloads) shows the live queue with progress bars.

why

  • this is the headline payoff of the whole stealth + storefront stack —
    versions you have but the App Store will not give you any more
  • exercises the private storefront protocol with a real binary payload
    so M4's TrollStore install handoff has something to install

changes

  • AppStoreClient.download + Download.run plist roundtrip (returns
    signed ipa URL + sinfs + iTunesMetadata blob with apple-id patched in)
  • DownloadEngine: URLSessionDownloadTask + delegate -> AsyncStream
    (ios 14 baseline; URLSession.bytes is iOS 15+)
  • IPAPatcher: ZIPFoundation Archive(.update); manifest path for
    multi-binary apps, info-plist path for legacy single-binary
  • DownloadService @mainactor queue, sequential to respect rate limits
  • DownloadTask state machine + DownloadsView UI (progress, cancel, remove)
  • FileLayout pins downloads to /var/mobile/Media/EvilStore/Downloads/
  • AppDetailView: timeline rows gain a real Download button

new dep

ZIPFoundation 0.9.19. build_tipa.sh now ldid-fakesigns every Mach-O in
Frameworks/ + PlugIns/ so the embedded swift framework passes amfi.

test

  • xcodebuild Debug + Release archive both green
  • tipa carries every entitlement plus the ZIPFoundation framework
  • on real device with stealth Account: tap a row -> progress bar fills
    -> patching spinner -> "ready to install" with the local path
  • Files app shows EvilStore/Downloads/.ipa
  • unzip -l of the result has iTunesMetadata.plist + SC_Info/*.sinf

next

m4 = TrollStoreBridge: tap "install" on a done row, hand the .ipa to
TrollStore via apple-magnifier://install?url=file:///...

housekeeping

base branch is feat/m2.5-version-metadata (not main) so this PR ladders
on top of m2.5. when m2.5 merges, github will retarget the base to main
automatically.

end-to-end download path. tap a version in the timeline -> button enqueues
a DownloadTask -> service walks it through download/patch/done. tab two
shows the live queue with progress bars.

* Download.run hits volumeStoreDownloadProduct, returns DownloadArtifact
  (signed ipa URL + sinfs + metadata blob with apple-id/userName patched in)
* DownloadEngine: URLSessionDownloadTask + delegate streams to disk and
  emits AsyncStream<Event> (progress / finished / failed). ios 14
  baseline so URLSession.bytes is avoided.
* IPAPatcher: ZIPFoundation Archive(.update). reads SC_Info/Manifest.plist
  if present (multi-binary case) else reads Info.plist for the legacy
  single-binary path; replaces iTunesMetadata.plist on every run.
* DownloadService: @mainactor queue. one task at a time so storefront
  rate-limits stay happy. cancel + remove + restart on cancel.
* FileLayout pins downloads to /var/mobile/Media/EvilStore/Downloads/.
* DownloadsView: empty state, in-flight rows with progress, done rows
  with localPath; cancel/remove buttons per row.
* AppDetailView: timeline rows now have a real Download button that
  enqueues into DownloadService.

ZIPFoundation 0.9.19 added as the first SPM dep. build_tipa.sh now
walks Frameworks/ + PlugIns/ and ldid-fakesigns every Mach-O so the
embedded swift framework passes amfi at launch.
@Evil0ctal Evil0ctal deleted the branch feat/m2.5-version-metadata May 6, 2026 00:42
@Evil0ctal Evil0ctal closed this May 6, 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