A Comprehensive Guide to Configuring NSAppTransportSecurity in iOS 9

Nov 25, 2025 · Programming · 8 views · 7.8

Keywords: NSAppTransportSecurity | iOS 9 | ATS Configuration | Info.plist | HTTP Exceptions

Abstract: This article provides a detailed guide on how to properly configure NSAppTransportSecurity in iOS 9 and later to resolve HTTP resource load blocking issues. Drawing from high-scoring Q&A data and reference articles, it covers two main configuration methods: security exceptions for specific domains and fully disabling ATS (not recommended). Content includes steps to locate and edit the Info.plist file in Xcode, explanations of configuration options, code examples, and security best practices. Aimed at helping developers understand ATS mechanisms and achieve secure network communication.

Introduction

With the release of iOS 9, Apple introduced App Transport Security (ATS), a mechanism designed to enforce secure HTTPS connections and protect user data privacy. However, during development, developers may encounter errors where ATS blocks HTTP resource loads, such as: "App Transport Security has blocked a cleartext HTTP resource load since it is insecure." Based on high-scoring Q&A from Stack Overflow and supplementary reference articles, this article delves into how to resolve this issue by configuring the NSAppTransportSecurity key in the Info.plist file.

Overview of NSAppTransportSecurity

NSAppTransportSecurity is a key introduced in iOS 9 for configuring ATS policies. By default, ATS requires all network connections to use HTTPS and enforces strict transport security standards. If an app needs to access insecure HTTP resources, developers must explicitly configure exceptions in the Info.plist. Common configuration methods include adding exceptions for specific domains or fully disabling ATS (the latter is not recommended due to potential security risks).

Detailed Configuration Methods

Method 1: Adding Security Exceptions for Specific Domains

This is the recommended approach as it allows relaxing ATS requirements for specific domains without compromising overall security. Below is a complete configuration example based on the high-scoring answer from the Q&A:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>yourdomain.com</key>
        <dict>
            <!--Include to allow subdomains-->
            <key>NSIncludesSubdomains</key>
            <true/>
            <!--Include to allow HTTP requests-->
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <!--Include to specify minimum TLS version-->
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
        </dict>
    </dict>
</dict>

In this example:

The advantage of this method is its specificity; it only relaxes security for designated domains, reducing potential vulnerabilities. Developers should replace "yourdomain.com" with the actual domain as needed.

Method 2: Fully Disabling ATS (Not Recommended)

If an app needs to access multiple insecure HTTP resources, developers might consider fully disabling ATS. The Q&A provides the following configuration:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

This configuration sets NSAllowsArbitraryLoads to <true/>, allowing the app to load any HTTP resources regardless of the domain. However, as emphasized in the Q&A, this method is not recommended because it completely bypasses ATS security mechanisms, potentially leading to data leaks. Apple may also subject apps using this configuration to stricter review in the App Store. It should only be used temporarily during development or for legacy systems, with a plan to migrate to HTTPS as soon as possible.

Steps to Edit Info.plist in Xcode

As mentioned in the reference article, in newer versions of Xcode (e.g., Xcode 15), the Info.plist may not be created automatically, or editing it can be problematic. Here are general steps:

  1. Locate Info.plist: In the Xcode project, navigate to the App target and select the "Info" tab. There is typically a "Custom iOS Target Properties" section where key-value pairs can be added directly. If the Info.plist file does not exist, Xcode may create it automatically when custom properties are first added.
  2. Add NSAppTransportSecurity Configuration: Right-click on "Custom iOS Target Properties" and select "Add Row". Enter the key as "NSAppTransportSecurity" with the type "Dictionary". Then, add sub-keys such as NSExceptionDomains or NSAllowsArbitraryLoads as needed.
  3. Handle Common Issues: If encountering errors like "Multiple commands creating Info.plist", check for duplicate Info.plist file references in project settings. In Xcode 15, ensure to use the graphical interface for editing rather than manually adding files to avoid conflicts.

These steps are based on discussions in the reference article, assisting developers in configuring ATS smoothly across different Xcode versions.

Security Best Practices

When configuring NSAppTransportSecurity, adhere to the following security principles:

According to the Q&A data, many developers initially attempt to fully disable ATS, but best practice is to gradually migrate to secure connections. For instance, if a server does not support HTTPS, consider using reverse proxies or CDN services to add an SSL layer.

In-Depth Analysis of Code Examples

To better understand the configurations, let's rewrite the code examples from the Q&A and add comments:

// Example: Configuring ATS exception for example.com, allowing HTTP loads and including subdomains
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>  // Enable exception for subdomains
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>  // Allow HTTP connections
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>  // Recommended to use TLSv1.2 or higher
        </dict>
    </dict>
</dict>

This example demonstrates how to configure an exception for "example.com". Note that in practice, replace "example.com" with the actual domain. The comments explain the purpose of each key, helping developers grasp their semantics. For instance, NSIncludesSubdomains ensures that all subdomains (e.g., api.example.com) are also covered by the exception, while NSTemporaryExceptionMinimumTLSVersion specifies the minimum security protocol version.

Common Issues and Solutions

Based on the Q&A and reference article, developers often face the following issues:

The reference article notes that in Xcode 15.1, some developers experienced issues with the graphical interface not accepting YES/NO selections. This could be a UI bug; try manually editing the Info.plist file or restarting Xcode.

Conclusion

NSAppTransportSecurity is a critical security feature in iOS development, and proper configuration can balance functional needs with security requirements. This article, based on high-scoring Q&A and supplementary references, details two configuration methods: adding exceptions for specific domains and fully disabling ATS (the latter not recommended). It emphasizes steps for editing Info.plist in Xcode, security best practices, and solutions to common problems. Developers should prioritize HTTPS, configure exceptions only when necessary, and follow the principle of least privilege. Through practical code examples and in-depth analysis, this guide aims to help readers efficiently resolve ATS-related issues, enhancing app security and reliability.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.