【iOS開發】canOpenURL:failedforURL

KyXu發表於2015-09-18
控制檯輸出

如圖是在我啟動一個 Xcode 7 + iOS 9 的 App 之後,控制檯的輸出。

這在 Xcode 6.4 + iOS 8 時,是不會有的情況,原因是【為了強制增強資料訪問安全, iOS9 預設會把所有從NSURLConnectionCFURLNSURLSession發出的 HTTP 請求,都改為 HTTPS 請求:iOS9.x-SDK編譯時,預設會讓所有從NSURLConnectionCFURLNSURLSession發出的 HTTP 請求統一採用 TLS 1.2(SSL 3.1) 協議。】

下面說解決方案:

①如果你的輸出資訊是-canOpenURL: failed for URL: “kindle://home” – error: “This app is not allowed to query for scheme kindle”

set Bitcode to NO

去你的 target 裡面的 Build Settings 下的 Enable Bitcode,把它設定成 NO,這不一定會阻擋你的控制檯繼續輸出這條資訊,但是可以保證你的 App 正常執行。

②如果你的輸出資訊是 xxxx – error: “This app is not allowed to query for scheme xxxx”
(在這裡因為我的 App 整合了分享到QQ、微信、微博的功能,xxxx部分我看到了 mqq、wechat、sinaweibosso 等多條資訊)

Info.plist

去 Info.plist 裡面建立一個叫 LSApplicationQueriesSchemes 的 Array,把你在xxxx部分看到的詞彙一個一個填進去,直至控制檯沒有任何相關輸出即可。

③關於其他通過 WebView 訪問 http 網址引發的控制檯報錯資訊

Info.plist 中設定 ATS
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

如之前所說,Apple 希望我們訪問相對安全的 HTTPS,所以在你需要訪問 HTTP 時,
雖 Apple 不建議,但可通過在 Info.plist 中宣告如上圖所示的內容,倒退回不安全的網路請求,這樣依然能讓 App 訪問指定 HTTP,甚至任意的 HTTP。


相關文章