Re-sign a build with a new profile, without building again
Pro and Team (by hand); Team also automatic inside Hands free
A new tester sends an iPhone UDID. You register it on Apple and remake the ad hoc profile, and then the slow part starts: open the project, archive, export and upload again, only so the build carries a profile that lists one more device.
With re-signing, that last step is one button. Pick the new profile, and AppForShare signs the build you already uploaded with it and saves the result as a new build of the same app, with the same release notes. The tester gets the install email when it is ready.
Example
Shop 2.4.0 (88), iOS
- Re-signed fromBuild 88, uploaded Nov 7
- ProfileShop Ad Hoc, 23 devices (3 new)
- Bundle ID, version, buildUnchanged
- SHA-256New file, new hash; the source build keeps its own
Made for
- Developers who add iPhone testers in the middle of a test round
- Agencies whose client testers join late and cannot wait for the next build
- Teams whose build machine or CI is busy, broken or owned by someone else
What it ends
- Rebuilding the same commit only to include one more device
- A tester waiting a day because the developer was away from the Mac
- Several versions of "the same" build with no record of which one testers got
How it works
Step 1
Add your signing certificate once
An Owner or Admin adds the workspace's Apple Distribution or Apple Development certificate as a .p12 with its password in Settings, iOS re-signing. It is encrypted with Google Cloud KMS and never shown again.
Step 2
Pick the new profile
On the build page, Re-sign with a new profile: choose an ad hoc, development or enterprise profile from your connected Apple account, or upload a .mobileprovision (one per app extension). With none picked, the best one for the bundle ID is used.
Step 3
Check, then confirm
AppForShare first checks the profile, the certificate and the devices, and tells you what would change. Confirm and the build goes to the queue.
Step 4
A new build is ready
The re-signed build gets its own link and goes through the usual upload checks. Enrolled testers whose device is now in the build get the install email.
What changes and what does not
Re-signing replaces the provisioning profile and the signature of the app and its extensions. The bundle ID, the version and the build number never change. Entitlements come from the new profile; you can choose to keep the app's own where the profile allows them.
The result is a new build ("Re-signed by AppForShare with profile <name> from build X") with the same release notes and password. The source build, its link, its SHA-256 and any client sign-off on it stay exactly as they were, so your records still match what was approved.
Your certificate stays sealed
The .p12 and its password are sealed with Google Cloud KMS, like store keys. The worker opens them for one signing run in a private temporary folder and removes them after. No API, CLI or MCP tool ever returns them, and they are never logged. The dashboard shows the name, team, kind, SHA-1 and expiry only. Adding and removing the certificate are lines in the activity feed.
Signing runs on our servers with rcodesign, the open source Apple code signing tool from the apple-codesign project.
Automatic on Team
With Hands free on, a new iPhone sent through the onboarding link is registered on Apple and the ad hoc profile is made again. When the project has no GitHub iOS build, Hands free then re-signs the newest iOS build of the project with that profile, and each enrolled tester gets the install email when it is ready. If it fails, the owner gets one email saying why.
From the CLI and your AI assistant
appforshare resign <id|slug> [--profile <file.mobileprovision|name>] [--merge-entitlements] --yes queues a re-sign; without --yes it only runs the check. The MCP tool resign_build does the same for a Developer, with confirm: true, and build_info shows the last re-sign.
Good to know
- iOS only. App Store profiles are refused: re-signing makes test builds, never builds for store upload.
- Builds downloaded from the App Store are encrypted and cannot be re-signed, and neither can builds from the old AppForShare site. Upload the .ipa you exported from Xcode or CI.
- The profile must match the app's bundle ID, and each app extension needs a profile of its own. The connected Apple account can fill in the extensions.
- Up to 30 re-signs a day per workspace. Each re-signed build counts toward your storage.
Questions
- Does it change my version or build number?
- No. Bundle ID, version and build number stay the same. Only the profile and the signature change, and the result is saved as a new build.
- What happens to the original build?
- Nothing. It keeps its link, its SHA-256 and any sign-off. The re-signed build is a separate build with its own link.
- Which certificate do I need?
- An Apple Distribution certificate for ad hoc and enterprise profiles, or an Apple Development certificate for development profiles, exported as a .p12 with its private key.
- Can I re-sign a build for TestFlight or the App Store?
- No. App Store profiles are refused. Send the App Store build you exported to TestFlight with store upload instead.
- Does it work for Android?
- No. On Android, AppForShare signs only the APK it makes from an .aab, with a test key or your own keystore. Uploaded APKs are never re-signed.
- Which plan do I need?
- Pro or Team to re-sign by hand. Automatic re-signing inside Hands free is on Team.
Read next
Try it on your own app
Free account in a minute. Pro starts with a 7 day free trial.
More features
- Builds on GitHub Actions
- Flutter builds on GitHub Actions
- Flutter facts and checks
- Security scan on every build
- Connect Expo (EAS builds)
- Connect Codemagic
- Send store builds to TestFlight and Google Play
- TestFlight groups and beta review on send
- TestFlight feedback in your inbox
- iOS device registration
- Hands free device setup
- Store listing editor
- App Store submission
- Google Play releases
- TestFlight tester sync
- Tester app with notifications
- Tester groups and status
- Join links for testers
- Beta and Live channels
- Build history page
- Tasks and activity feed
- Feedback to Linear and Jira
- Release checklist, approvals and blockers
- Release page per version
- Install link controls
- Several links per build
- Retire a test build
- TestFlight and APK in one link
- Install page in 13 languages
- In-app update check
- .aab uploads
- MCP server for AI tools
- Tester feedback with screenshots
- In-app feedback link
- AI test plan for each build
- Diawi compatible upload API
- Remember my iPhone
- Install help and why it failed
- Email the install link
- Custom channel address
- Verified publisher
- Daily install email
- Zipped .app upload
- Manage link for guest uploads
- Test accounts on the install page
- Telegram notifications
- Permissions in plain words
- Reply to testers and star ratings
- Follow a channel by email
- Download button for a README
- Store pages
- Check a build before upload
- Token scopes and CLI tools
- Upload from Claude or ChatGPT
- Passkeys and email code sign in
- Free build tools
- How reports work
- Malware check on every upload
- Single sign on (SAML and OpenID Connect)
- Require two step sign in
- Send to Microsoft Intune
- Choose where build files are stored
- Mac and Windows builds
- Workspace address
- Automatic clean up of old builds
- Tester email from your own mail server
- Webex notifications