【Swift】WKWebViewでHTTP通信を可能にする方法!ATS(App Transport Security)
![【Swift】WKWebViewでHTTP通信を可能にする方法!ATS(App Transport Security)](image/swift.png)
この記事からわかること
- SwiftでWebサイトをiOSアプリから開く方法
- WKWebViewクラスの使い方
- HTTP通信を許可するには?
- ATS(App Transport Security)とは?
index
[open]
\ アプリをリリースしました /
環境
- Xcode:16.0
- iOS:18.0
- Swift:5.9
- macOS:Sonoma 14.6.1
公式リファレンス:App Transport Security設定の最適化
ATSの導入でiOSアプリではHTTP通信ができない
iOS9以降から「ATS(App Transport Security)」が導入されたことによりHTTP通信ができなくなりました。これはアプリとインターネット間のデータ通信をより安全にするための仕組みで、基本的にHTTPS通信しか許可しないようになっています。
そのためWKWebView
やURLSession
などインターネットに関わる部分に影響してくる変更です。
WKWebView
URLSession
HTTP通信を行おうとすると以下のようなエラーが発生し接続自体ができないようになっています。
Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={networkTaskMetricsPrivacyStance=Unknown, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <CE39C8F7-6611-499E-B40A-8DC87B87A157>.<2>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <CE39C8F7-6611-499E-B40A-8DC87B87A157>.<2>"
), NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection., _WKRecoveryAttempterErrorKey=<WKReloadFrameErrorRecoveryAttempter: 0x60000027ef60>, networkTaskDescription=LocalDataTask <CE39C8F7-6611-499E-B40A-8DC87B87A157>.<2>, NSErrorFailingURLStringKey=http://appdev-room.com/, NSUnderlyingError=0x600000c7fc90 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}, NSErrorFailingURLKey=http://appdev-room.com/}
HTTP通信を許可するには?
iOSアプリでHTTP通信が完全に禁止されたわけではなく逃げ道が用意されていました。方法は「info.plist」の中に該当のキーを追加するだけです。その中でもざっくり分けて2つ方法があります。
全てのHTTP通信を許可する
1つ目の方法は全てのHTTP通信を許可する方法です。「info.plist」にNSAppTransportSecurity
を追加しその中のNSAllowsArbitraryLoads
にYES
を渡します。
NSAppTransportSecurity
はHTTP接続関連のセキュリティ設定を行うルートのキーでNSAllowsArbitraryLoads
は全ての通信に対してATSが無効になっているかどうかを示すフラグです。
![【Swift】WKWebViewでHTTP通信を可能にする方法!ATS(App Transport Security)](image/swift-uikit-wkwebview-http1.png)
<dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
</dict>
NSAllowsArbitraryLoads
をYES
にしてアプリを申請する場合は正当な理由が必要になるようです。
この実装の場合は全ての通信でHTTP通信が可能になってしまうので安全面が少し心配になってしまいます。それを解決するのが2つ目の方法です。
ドメイン指定でHTTP通信を許可する
HTTP通信を許可するドメインを指定して設定することも可能になっています。同じくNSAppTransportSecurity
の中にNSExceptionDomains
を指定します。NSExceptionDomains
は辞書型になっておりキーに対象のドメインを指定します。さらにその配下も辞書型になっておりNSExceptionAllowsInsecureHTTPLoads
にYES
を指定することでATSが無効になります。
![【Swift】WKWebViewでHTTP通信を可能にする方法!ATS(App Transport Security)](image/swift-uikit-wkwebview-http2.png)
<dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>appdev-room.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
</dict>
NSAppTransportSecurityの設定値
NSAppTransportSecurity
の配下には他にもいくつか設定できるキーがあります。
NSAllowsArbitraryLoads
・すべてのネットワーク接続に対してATS制限が無効になっているかどうかを示すブール値
・申請時に正当な理由が必要
NSAllowsArbitraryLoadsForMedia
・AV Foundation フレームワークを使用して行われたリクエストに対してATS制限が無効になっているかどうかを示すブール値
・申請時に正当な理由が必要
NSAllowsArbitraryLoadsInWebContent
・WebViewから行われたリクエストに対してATS制限が無効になっているかどうかを示すブール値
・申請時に正当な理由が必要
NSAllowsLocalNetworking
・ローカル リソースの読み込みを許可するかどうかを示すブール値
NSExceptionDomains
・名前付きドメインのカスタムATS構成
NSExceptionDomainsの設定値
NSExceptionDomains
の配下には他にもいくつか設定できるキーがあります。
NSIncludesSubdomains
・指定されたドメインのサブドメインに構成を拡張するかどうかを示すブール値
NSExceptionAllowsInsecureHTTPLoads
・安全でない HTTP ロードを許可するかどうかを示すブール値
・申請時に正当な理由が必要
NSExceptionMinimumTLSVersion
・ネットワーク接続の最小トランスポート層セキュリティ (TLS) バージョン
・申請時に正当な理由が必要
NSExceptionRequiresForwardSecrecy
・完全な前方秘匿性の要件を上書きするかどうかを示すブール値
NSRequiresCertificateTransparency
・証明書の透明性が必要かどうかを示す古いブール値
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。