2017-02-10 17 views
2

私たちは、断続的な(一部のデバイスでは、時々起こります)クラッシュして、苦労してオンデマンドを再現することができません。これはSwift 3とWKWebViewコンポーネントに関連しています。具体的には、switchステートメントでエラーコードを取得しようとすると、そのコールバックプロトコルがクラッシュします。以下を参照:Swift WKWebViewクラッシュon didFailProvisionalNavigation

func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { 

    if let err = error as? URLError { 

    switch(err.code) { // Exception occurs on this line 
    case .cancelled: 
     Hint(hide: true) 

    case .cannotFindHost: 
     Hint(hide: false, hint:.CannotFindHost) 

    case .notConnectedToInternet: 
     Hint(hide: false, hint: .NoInternet) 

    case .resourceUnavailable: 
     Hint(hide: false) 

    case .timedOut: 
     Hint(hide: false) 

    default: 
     Hint(hide: false) 
     print("error code: " + String(describing: err.code) + " does not fall under known failures") 
    } 
    } 
} 

func Hint(hide: Bool, hint:SomeCustomEnum = SomeCustomEnum.Default) { 
    //Dosomething with ui to let user know something bad happened 
} 

エラー・スタックが示す:

0 _BridgedStoredNSError.code.getter

1 _BridgedStoredNSError.code.getter

2特殊WebKitController.webView(WKWebView、didFailProvisionalNavigation:WKNavigationを!、withError:Error) - >()

3 @obj WebKitController.webView(WKWebView、didFailProvisionalNavigatイオン:WKNavigation!withError:エラー) - >()

...

変数errが成功し、必要に応じて、開封されたようでなければなりませんので、それは問題から効果的に自由であるべきかのように思えるのコードの確認switch文が呼び出されるまでに有効なURLErrorオブジェクトURLErrorでは.codeはオプションではないので、その時点でのswitchステートメントはerr.codeの値を保証する必要があります。

人為的に問題を説明する可能性のあるエラーを引き起こそうとする試みは、これまで多くの洞察を提供していません。すなわち、コードプロパティなしで独自のカスタムエラーを作成し、それをURLErrorとしてキャストしようとすると、オプションの割り当てがうまく機能しなくなります。

回転する、またはさらにトラブルシューティングするための助力や提案は高く評価されますが、その間に一貫して再現しようとしています。

+0

よく書かれた質問:バグが解決されるまで、我々は一時的な回避策とそれを軽減している

(下にはNSURLErrorAppTransportSecurityRequiresSecureConnection(int型-1022)タイプの障害に対処し)。あなたが所有しているサーバー上のURLにアクセスしていますか?もしそうなら、あなたのアプリでクラッシュの原因となっている可能性のあるエラーについて、サーバーログから何か洞察が得られますか? –

+0

それは素晴らしい提案でしたが、私の大学は私がそれに到達する前に再現することができました。再現は、デフォルトで(任意の負荷を許可する)モードのアプリ転送セキュリティを持つ「http」URLで簡単にナビゲートすることです。これにより問題を回避することはできますが、URLErrorへのキャストに基づいて、.codeプロパティを含まないバグを送信します。 – Glorifundel

答えて

2

スウィフトバグ(https://bugs.swift.org)提出サイトを調べると、問題の説明が見つかりました。これは

https://bugs.swift.org/browse/SR-3881

(まだプロセスで)解決策になると思わ次の参照へのリンクを持っている

https://bugs.swift.org/browse/SR-3879?jql=text%20~%20%22URLError%22

:URLErrorにエラーキャストは、プロパティ.CODEが行方不明であることになります

効果的にURLErrorに2つのコード定義がありません:

NSURLErrorAppTransportSecurityRequiresSecureConnection NSURLErrorDataLengthExcee dsMaximum

URLErrorの.codeプロパティを参照する際にクラッシュした場合は、NSErrorにキャストし、NSError .codeプロパティをチェックして確認できます。

func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { 

    let nserr = error as NSError 
    if nserr.code == -1022 { 
    Hint(hide: false, hint: .NSURLErrorAppTransportSecurityRequiresSecureConnection) 

    } else if let err = error as? URLError { 

    switch(err.code) { // Exception no longer occurs 
    case .cancelled: 
     Hint(hide: true) 

    case .cannotFindHost: 
     Hint(hide: false, hint:.CannotFindHost) 

    case .notConnectedToInternet: 
     Hint(hide: false, hint: .NoInternet) 

    case .resourceUnavailable: 
     Hint(hide: false) 

    case .timedOut: 
     Hint(hide: false) 

    default: 
     Hint(hide: false) 
     print("error code: " + String(describing: err.code) + " does not fall under known failures") 
    } 
    } 
} 

func Hint(hide: Bool, hint:SomeCustomEnum = SomeCustomEnum.Default) { 
    //Dosomething with ui to let user know something bad happened 
} 
+0

これは、もし 'nserr.code == -1022 {'の代わりに '' nserr.code == -1022 {'? –

+0

ええ、タイプミスをしてください。今解決する。 – Glorifundel

関連する問題