Skip to content

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

Merged
Evil0ctal merged 1 commit into
mainfrom
feat/m3-download
May 6, 2026
Merged

download: fetch the ipa, inject metadata + sinfs#7
Evil0ctal merged 1 commit into
mainfrom
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.

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
  • 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
  • unzip -l of the result has iTunesMetadata.plist + SC_Info/*.sinf

housekeeping

replaces #6 which got auto-closed when its base branch
(feat/m2.5-version-metadata) was deleted on merge of #5.

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 merged commit ed0abd8 into main May 6, 2026
3 checks passed
@Evil0ctal Evil0ctal deleted the feat/m3-download branch May 6, 2026 00:46
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