Fix App Store CloudVPN extension signing
Summary
The App Store official TestFlight lane exported CloudVPN.appex with its packet-tunnel provisioning profile but without the com.apple.developer.networking.networkextension entitlement. The local CI gate correctly rejected the IPA before upload.
This change re-signs CloudVPN.appex from its embedded profile and the checked-in CloudVPN entitlement contract before the host app is sealed. It validates the exact bundle identifier, packet-tunnel capability, and host keychain group.
Validation
- Red regression:
python3 -m unittest ios/tests/test_appstore_entitlements.pyfails on the test-only commit becauseresign_cloud_vpn_extensionis absent. - Green regression:
python3 -m unittest ios/tests/test_appstore_entitlements.pypasses after the fix (3 tests). bash -n ios/scripts/upload-testflight.shgit diff --check
Changelog
Fixed: preserve the CloudVPN packet-tunnel entitlement in App Store/TestFlight exports.
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.
Summary by cubic
Fixes App Store exports dropping the CloudVPN packet-tunnel entitlement during manual re-signing, which previously made the IPA fail the local CI gate.
Bug Fixes
- Re-signs
CloudVPN.appexfrom its embedded provisioning profile plus the checked-in entitlement contract, before the host app is sealed. Applies to App Store exports only; beta exports keep their existing signing path. - Validates the exact bundle ID,
packet-tunnel-providercapability, and host keychain group. - Adds a regression test for the new resigning step.
Summary by CodeRabbit
- Bug Fixes
- Improved reliability of manual TestFlight exports by validating the VPN extension’s provisioning profile and signing it with authorized permissions.
- Exports now stop with an error when the VPN extension’s profile or permissions are invalid, rather than continuing with an incorrectly signed app.
- Preserved valid provisioning-profile list permissions when requested values are not authorized, preventing those permissions from being unintentionally cleared.