2015年10月3日 星期六

iOS 開發筆記 - iOS9 存取外部資源失敗與解決方式 (App Transport Security & Info.plist & URL Scheme)

iOS 9 引入了外部資源存取的限制(App Transport Security),例如 App 操作過程中,對網路上的資料發送 requests 要求資料時,會被擋下來。這個影響的範圍滿廣的,例如做 QRCode app 時,掃描到 URL 時,開啟 UIWebView 卻無法瀏覽,或是在 UIWebView 呈現網頁時,塞一個 <img> tag 進去卻顯示不出來。

類似錯誤訊息:
  • 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.
  • NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
若有用 FB SDK ,也會出現:
  • FBSDKLog: WARNING: FBSDK secure network request failed. Please verify you have configured your app for Application Transport Security compatibility described at https://developers.facebook.com/docs/ios/ios9
解法就是設定 Info.plist,在 iOS9 多了個 NSAppTransportSecurity 項目可以設定,可以參考 FB SDK 文件( https://developers.facebook.com/docs/ios/ios9 ),若 App 無法限制存取的來源(像QRCode App),那只好設定 NSAllowsArbitraryLoads = YES 啦

此外,對於判斷 URL Scheme 也是個問題,例如常見判斷 JB 的方式:

[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]

也有類似的資源限制問題:

-canOpenURL: failed for URL: "cydia://package/com.example.package" - error: "This app is not allowed to query for scheme cydia"

這時也得設定 LSApplicationQueriesSchemes 參數來處理,設定完會變成:

-canOpenURL: failed for URL: "cydia://package/com.example.package" - error: "(null)"

3 則留言:

  1. 請問一下要怎麼解決這個問題呢

    回覆刪除
  2. 在 Info.plist 中,添加一個 NSAppTransportSecurity (Dictionary) ,裡頭在添加一個 NSAllowsArbitraryLoads (Boolean) 為 YES 即可。

    回覆刪除
  3. http://stackoverflow.com/questions/31254725/transport-security-has-blocked-a-cleartext-http

    請看圖片。

    回覆刪除