-
-
Notifications
You must be signed in to change notification settings - Fork 574
Add version history and old app version download support #370
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
… - Move empty storefront check before error return - Prevents unnecessary error when storefront is empty - Improves error handling flow in storefront processing
…command to retrieve app version history - Support both app ID and bundle identifier lookup - Implement concurrent version detail fetching with progress tracking - Add formatted output with version and version ID table - Support oldest-first and newest-first ordering - Include comprehensive error handling and retry logic - Add logging for successful operations and debugging
…om go.sum - Restore go.sum to proper state without redundant module dependencies
…on-id flag to download command for specifying app version - Integrate version ID parameter in download request payload - Update destination path resolution to include version info - Add comprehensive README documentation for version history and old version download workflow - Remove accidentally committed ipatool binary - Add ipatool binary to .gitignore to prevent future commits
…g issues in version history files - Add required blank lines before return statements (nlreturn) - Fix whitespace linter issues (wsl) for proper code spacing - Ensure all unit tests pass and code meets project standards
…versions flag to fetch complete app version history - Override --max-versions when --all-versions is used - Support proper ordering (oldest-first/newest-first) for all versions - Enhance user feedback with 'Fetching ALL version details' message - Add allVersions boolean to logging for debugging - Maintain backward compatibility with existing --max-versions behavior - Update flag descriptions to clarify interactions between flags
I'm glad to see this. Can you compile a binary in your repository? I want to test it immediately. |
…go version from 1.23.0 to 1.19 to match GitHub workflow - Remove toolchain directive (not supported in Go 1.19) - Fixes build errors in GitHub Actions workflow
Thanks, this seems to work well. I do have some concerns:
Let's get this merged first as I would like to do some small adjustments afterwards. |
It's there now https://github.com/koraytutuncu/ipatool/releases/tag/v0.1.2-beta-test |
Thank you for building such a great tool! I had those concerns in mind too, but as someone new to this, I just tried to make it work with some help from AI. I really appreciate the feedback, and I’ll be more mindful next time for sure. |
@koraytutuncu No worries. Thank you for the valuable contribution. Out of curiosity, what AI tools/models did you use for this? |
@majd Cursor -- I've started using AI code editors from the beginning and Cursor is the best among all. Edit: |
Hello how too install linux instruction plus IPATool |
Summary
This PR adds support for viewing app version history and downloading specific (old) versions of iOS apps from the App Store. Users can now access historical versions of apps that are no longer available in the current App Store listing.
New Features
Version History Command
version-history
command to list all available versions of an appOld Version Download Support
--version-id
flag for thedownload
commandUsage Examples
Implementation Details
Technical Changes
VersionHistory
interface method to AppStoreappstore_version_history.go
with core logicTesting & Quality
go test ./...
)golangci-lint run
)gofmt
Additional Improvements
countryCodeFromStoreFront
ipatool
binary to.gitignore
to prevent future commitsDocumentation
This feature enables users to access the full history of iOS app versions, addressing a common need for developers, researchers, and users who need access to specific app versions for compatibility or analysis purposes.
EDIT 1:
Technical Mechanism - Direct Apple API Integration
How Version History Retrieval Works (No Third-Party APIs)
This implementation leverages Apple's private App Store APIs directly, the same APIs used by iTunes and the App Store applications themselves. Here's the technical breakdown:
Discovery Process
Initial Metadata Request: Make a request to Apple's private download API endpoint without specifying a version ID
Version Enumeration: The response contains a crucial field
softwareVersionExternalIdentifiers
- an array of ALL available version IDs for the app:Concurrent Version Detail Fetching: For each version ID, make parallel authenticated requests to retrieve specific version metadata:
Authentication & Request Structure
Key Technical Advantages
Version-Specific Downloads
When downloading old versions, the same download API is used but with the
externalVersionId
parameter:This tells Apple's servers to serve the exact historical IPA file for that version, not the current one.
Why This Approach Works
This implementation essentially reverse-engineers the iTunes protocol to expose version history functionality that was always available but never exposed in consumer interfaces.