Apple closed the door.
Twice.

Installing AltStore from AltServer on macOS 27 failed at the very first sign-in request, before Apple ever looked at the password. Sideloadly, iloader, SideStore and xtool failed the same way, so the tool is not the problem.


AltServer signs in on macOS 27 with anisette data generated locally by AnisetteKit, which emulates Android's CoreADI.
The anisette describes an Android device but the X-MMe-Client-Info header says Mac. Apple starts rejecting the mismatch. Declaring a Pixel client fixes it for a few hours.
From about 20:50 UTC, any Android client info gets a 503 Service Temporarily Unavailable HTML page, which AltServer tries to read as a property list.
The anisette and the client info must describe the same device.
Credential-less requests to GsService2 with only the client info changed and an empty plist body.
They show how the edge routes a request, not whether a login would succeed.
| X-MMe-Client-Info | Response | Reading |
|---|---|---|
| <Pixel 7> <Android;14;…> | 503 HTML, 6 of 6 | blocked at the edge |
| <Pixel 5> and <Pixel 8> variants | 503 HTML, 6 of 6 | same |
| <MacBookPro…> <macOS;27.2;…> akd | 404 / 429 | reaches the service (my IP was rate-limited by then) |
| <PC> <Windows;6.2(0,0);9200> iTunes | 404 | reaches the service |
The only recipe confirmed working after the 503 was the one iloader 2.3.8 and isideload 0.4.6 shipped: anisette from Windows' ADI on an anisette v3 server, with the client info and user agent that server reports.
Porting the fix meant building AltServer with Xcode 27, and the first build that reached Apple crashed on its own. The faulting call was alt_ccsrp_gp_rfc5054_2048, a symbol AltSign binds through the flat namespace. It was undefined in every framework.
$ nm -arch arm64 AltSign.framework/Versions/A/AltSign | grep rfc5054
U _alt_ccsrp_gp_rfc5054_2048
$ clang -dynamiclib -arch arm64 -Wl,-force_load,libcorecrypto_static.a \
-undefined dynamic_lookup -o AltSign-Dynamic.framework/Versions/A/AltSign-Dynamic
Rebuilding that one dylib from the static library removed the crash. It is a build issue and is deliberately not part of the pull request.
AltServer asks.
The server provisions.
Apple checks the match.
Your password and your 2FA code go straight to Apple. The anisette server only sees a device identity.
| Before | After | |
|---|---|---|
| Anisette | Android CoreADI, local (AnisetteKit) | Windows ADI, anisette v3 server |
| User-Agent | AuthKit/1 (Macintosh…) (com.apple.dt.Xcode/26.0) | the server's user_agent |
| Extra headers | none | Accept, X-Xcode-Version, X-Apple-App-Info, Connection: close |
| cpd | 14 fields, booleans | 9 fields, strings |
| HTTP errors | plist parse error 3840 | readable HTTP status |
Six commits in total, three in AltStore and three in AltSign. They build on the 2FA fix from AltSign#59 and reuse the fetcher from #1806.
Installing AltStore from the downloaded build worked on an iPad Pro and on an iPhone 15 Pro Max, and refreshing AltStore from the app worked too. The 2FA code was generated on a trusted device, because the SMS option currently fails.


Not universal. Some accounts still get -80045 with the Windows identity, apparently depending on the account or the network.
It depends on a community anisette server. SMS 2FA also fails on Apple's side, so use a code from a trusted device.
Refreshing other sideloaded apps was not tested. And Apple can change the rules again: the first fix lasted less than a day.