1.以前偷懶一直是這樣設置
<key>NSAppTransportSecurity</key>
<dict><key>NSAllowsArbitraryLoads</key><true/><key>NSAllowsArbitraryLoadsInWebContent</key><true/>
</dict>
現在我在Xcode16.3上,這種設置方式在真機上能請求http(應該是設備開啟了開發者模式),但在模擬器上請求http是被拒絕的。報錯如下:
Cannot start load of Task <AAC1C590-5604-43A7-984F-3D486C5996DF>.<1> since it does not conform to ATS policy
Task <AAC1C590-5604-43A7-984F-3D486C5996DF>.<1> finished with error [-1022] 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={NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection., NSErrorFailingURLStringKey=http://114.55.151.190:9527/api/onlineGoods/getGoodsList?page=1&pageSize=20, NSErrorFailingURLKey=http://114.55.151.190:9527/api/onlineGoods/getGoodsList?page=1&pageSize=20, _NSURLErrorRelatedURLSessionTaskErrorKey=(
??? "LocalDataTask <AAC1C590-5604-43A7-984F-3D486C5996DF>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <AAC1C590-5604-43A7-984F-3D486C5996DF>.<1>, NSUnderlyingError=0x60000129bde0 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}}
問題就是由于 App Transport Security (ATS) 默認限制了非 HTTPS 請求。
2.現在需要這樣設置
<key>NSAppTransportSecurity</key>
<dict><key>NSAllowsArbitraryLoads</key> <false/><key>NSExceptionDomains</key><dict><key>example.com</key> <!--Include your domain at this line --><dict><key>NSIncludesSubdomains</key><true/><key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key><true/><key>NSTemporaryExceptionMinimumTLSVersion</key><string>TLSv1.1</string></dict></dict>
</dict>
這里NSAllowsArbitraryLoads
必須是false
,因為它不允許所有不安全的連接,但例外列表允許連接到一些沒有 HTTPS 的域。
這樣模擬器上就能正常請求http接口了。