iOS 9發布后,原來開發的ipad應用在iOS9下面測試時,協議使用的是HTTP,發送網絡請求時,Console窗口輸出:
App Transport Security has blocked a cleartext HTTP(http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
由上面的提示可以知道,ATS阻止了不安全的網絡請求,為了使得我們的網絡請求繼續使用以前的HTTP協議(蘋果現在建議使用HTTPS,所以建議盡快使用HTTPS來發送網絡請求),按照上面的建議在Info.plist中添加了NSAPPTransportSecurity為鍵的字典,其中包含一個鍵為NSAllowsArbitraryLoads值為Bool類型(設置為YES)的item,如圖所示:
或者按照源碼方式打開Info.plist文件并如下添加:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
</true>
</dict>
重新編譯,啟動應用,發送網絡請求,奇怪的是結果和之前完全一樣,Console依然輸出同樣的警告信息,程序彈出窗口如下所示(與之前也完全相同):
到底原因在哪里啊?嘗試了在iPhone上的應用,添加NSAppTransportSecurity字典到Info.plist之后是可以工作的,但是在iPad模擬器上還真機上卻不能工作,到底為什么?
于是重新新建一個iPad應用工程,在iOS9下面通過HTTP協議請求百度主頁“http://www.baidu.com”內容,在沒有添加NSAppTransportSecurity字典時(也就是說沒有禁止掉iOS9默認的ATS特性時)程序輸出和上面一樣的警告信息。此時在Info.plist上添加NSAppTransportSecurity字典禁用掉ATS特性,再次請求百度主頁內容發現請求成功完成,那么很顯然問題不在于iOS9模擬器,究竟是什么原因呢?
想到之前經常遇到一些資源類的內容改變之后不能在編譯時及時得到反映的情況,決定把Info.plist文件先備份一份,之后刪除掉Info.plist文件,重新編譯程序后發現XCode報錯,說缺少Info.plist文件,此時把備份的Info.plist文件恢復到原來的位置并再次添加到工程中,重新編譯并啟動應用再次通過HTTP協議發起網絡請求,網絡請求居然成功完成,看來問題在于原來的Info.plist文件內容的改變沒有即時在編譯的時候得到應用,或許XCode只是使用了之前的Info.plist文件(緩存的?)內容。
因此,當遇到修改了Info.plist文件內容后程序并沒有表現出預想的行為的情況時,可以嘗試備份Info.plist文件,然后刪除原來的Info.plist編譯程序,當出錯之后,再次從備份的Info.plist文件恢復到原來的位置并添加到XCode中,重新編譯,問題可能就會得到解決。
新聞熱點
疑難解答