App Transport Security (ATS) is Apple's network security framework — disabling it with NSAllowsArbitraryLoads: true in Info.plist allows all HTTP traffic, exposing users to man-in-the-middle attacks (CWE-319, OWASP A02 Cryptographic Failures). Apple requires a written justification for any ATS exception, and blanket disabling is frequently rejected without a compelling reason. HTTP API calls transmit auth tokens, personal data, and session information in cleartext — on public Wi-Fi, any observer on the network can read them. On Android, android:usesCleartextTraffic="true" in AndroidManifest.xml has the same effect.
Critical because `NSAllowsArbitraryLoads: true` exposes all network traffic to interception and triggers rejection unless Apple accepts a written justification — which they rarely do.
Remove NSAllowsArbitraryLoads from Info.plist and migrate all API URLs to HTTPS.
// app.json — disable ATS exceptions
"ios": {
"infoPlist": {
"NSAppTransportSecurity": {
"NSAllowsArbitraryLoads": false
}
}
}
For Android, add res/xml/network_security_config.xml:
<network-security-config>
<base-config cleartextTrafficPermitted="false" />
</network-security-config>
If a specific third-party domain still requires HTTP (e.g., a local dev proxy), scope the exception to that domain only using NSExceptionDomains — never disable ATS globally. Update your backend's load balancer or CDN to enforce HTTPS if any production endpoint still accepts HTTP.
app-store-review-blockers.technical-requirements.ats-https-enforcedcriticalios/[AppName]/Info.plist and app.json's ios.infoPlist section for NSAppTransportSecurity. The presence of NSAllowsArbitraryLoads: true means ALL HTTP traffic is allowed — this is a major red flag and requires a written justification for App Store approval. Also look for NSExceptionDomains entries with NSAllowsInsecureHTTPLoads: true. Search all source files for http:// URLs in API calls, fetch requests, and Axios base URLs (excluding localhost/development URLs). In android/app/src/main/AndroidManifest.xml, check for android:usesCleartextTraffic="true" on the <application> tag, or network_security_config allowing cleartext traffic to specific domains.NSAllowsArbitraryLoads: true in Info. At least 1 implementation must be verified.plist; no android:usesCleartextTraffic="true" in AndroidManifest.xml without a <domain-config> restriction; all production API base URLs use https://.NSAllowsArbitraryLoads: true in Info.plist; android:usesCleartextTraffic="true" in AndroidManifest with no domain restriction; http:// URLs in production API configuration."Info.plist has NSAllowsArbitraryLoads=true — ATS is completely disabled" or "API base URL uses http:// in src/config/api.ts: 'http://api.example.com'" or "AndroidManifest.xml has android:usesCleartextTraffic='true' with no domain restriction"NSAllowsArbitraryLoads from Info.plist entirely or set to falsehttps:// — update your backend if necessaryNSExceptionDomains scoped to that domain — never disable globallyandroid:usesCleartextTraffic="true" or restrict via network_security_config.xml:
<network-security-config>
<base-config cleartextTrafficPermitted="false" />
</network-security-config>
app.json:
"ios": { "infoPlist": { "NSAppTransportSecurity": { "NSAllowsArbitraryLoads": false } } }