期待されること:
- ステータス コード 200 のレスポンスと、認証トークンなどを含む JSON ボディ。
何が起こっていますか:
- デバイスは (ランダムに?) auth0 へのログイン呼び出しを成功させなくなります。
- HTTP ステータス コード、応答データはすべて nil 値になります。-同じアプリ ブランチ、同じ Wi-Fi ネットワークを実行している他のデバイスは、問題なく通話できます。その後、通常は 1 ~ 2 日で、問題の電話からの発信に問題がなくなり、問題が発生する前と同じように継続します。
- ログにエラー コード 303 (CFNetworkErrors.cfErrorHTTPParseFailure) をスローします。Apple のドキュメントによると、サーバーからの応答の解析に失敗したとのことです。応答データがnullだからだと思います。
アプリのバージョン:
- この問題は、これまでのところ、14.6 以降を実行している iOS デバイスで発生しています。
テスト:
- AlamoFire ベースと URLSession ベースの両方のネットワーク呼び出しを使用しましたが、どちらにも問題が発生する可能性があります。以下のコード例では、AlamoFire の代わりに URLSession を使用していますが、切り替えによってデバイスで問題が発生するのを防ぐ効果はないようです。
- WiFi からセルラー インターネットに変更しても効果はなく、別の WiFi ネットワークに変更しても効果はありません。
- アプリを削除して再インストールしても効果はありません。
- 何が問題を引き起こしているのかを理解していないため、問題が解決する前に問題のあるデバイスを数回しか入手できず、テストするものは何もありませんでした.
- いくつかのログを保存することができました (print ステートメントといくつかの Firebase Analytics コンソール メッセージ)。役に立つと思うセグメントを以下に貼り付けます。
ネットワーク通話コード:
func makeNetworkCall(url: String, method: HTTPMethod = .get, parameters: Parameters? = nil, headers: HTTPHeaders? = nil, timeout: Double, completion: @escaping (DefaultURLRequestReturnModel) -> Void ) {
logger.debug("makingCall with: url= _\(url)_ method= _\(method)_, param= _\(parameters)_, headers= _\(headers)_")
var urlRequest: URLRequest?
var hasReturned: Bool = false
DispatchQueue.main.asyncAfter(deadline: .now() + timeout, execute: {
if !hasReturned {
completion(DefaultURLRequestReturnModel(isSuccess: false, statusCode: ErrorCodes.timeoutError.rawValue, action: .failure, dataResponse: nil))
}
})
do {
urlRequest = try URLRequest(url: url, method: method, headers: headers)
if let parameters = parameters {
urlRequest?.httpBody = try JSONSerialization.data(withJSONObject: parameters)
}
} catch {
completion(DefaultURLRequestReturnModel(isSuccess: false, statusCode: ErrorCodes.encodeError.rawValue, action: .failure, dataResponse: nil))
return
}
// Unwrap the optional urlRequest to confirm its != nil
guard var safeURLRequest = urlRequest else {
completion(DefaultURLRequestReturnModel(isSuccess: false, statusCode: ErrorCodes.encodeError.rawValue, action: .failure, dataResponse: nil))
return
}
if safeURLRequest.httpBody != nil {
safeURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
}
let session = URLSession.shared
logger.debug("before session.dataTask for url \(safeURLRequest.url)")
let task = session.dataTask(with: safeURLRequest, completionHandler: { data, response, error in
logger.debug("url session completion for safeURLRequest.url _\(safeURLRequest.url)_, response= _\(response)_, error= _\(error.debugDescription)_, data= _\(data)_")
if let httpResponse = response as? HTTPURLResponse {
logger.debug("url session completion for URL \(safeURLRequest.url): status \(httpResponse.statusCode)")
switch httpResponse.statusCode {
case 200, 204:
let defaultDataResponse = DefaultDataResponse(request: safeURLRequest, response: httpResponse, data: data, error: error)
completion(DefaultURLRequestReturnModel(isSuccess: true, statusCode: httpResponse.statusCode, action: httpResponse.statusCode == 200 ? .success : .successEmpty, dataResponse: defaultDataResponse))
default:
logger.debug("ON ERROR")
completion(DefaultURLRequestReturnModel(isSuccess: false, statusCode: httpResponse.statusCode, action: httpResponse.statusCode == 401 ? .authError : .failure, dataResponse: nil))
}
} else {
// This is Trigged in the error logs
logger.debug("url session completion for URL \(safeURLRequest.url): response = \(response) __ can't be cast to HTTPURLResponse")
if NetworkManager.isConnectedToInternet() { logger.networkNilEvent() }
completion(DefaultURLRequestReturnModel(isSuccess: false, statusCode: ErrorCodes.noResponseError.rawValue, action: .failure, dataResponse: nil))
}
hasReturned = true
})
task.resume()
}
問題のあるデバイスからのコンソール ログ:
debug: safeURLRequest.url Optional( https://cpht.auth0.com/oauth/ro )の url セッション完了、応答 = nil、エラー = _Optional(Error Domain=kCFErrorDomainCFNetwork Code=303 "(null)" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey =LocalDataTask .<9>, _kCFStreamErrorDomainKey=4, NSErrorPeerAddressKey=<CFData 0x28375a080 [0x1f9151860]>{length = 16, capacity = 16, bytes = 0x100201bb6810b8f80000000000000000}, _kCFStreamErrorCodeKey=-2205, NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask .<9>" ) }) , data= nil debug: URL Optional の URL セッション完了 ( https://cpht.auth0.com/oauth/ro ): response = nil __ HTTPURLResponse にキャストできません
問題のあるデバイスからの Firebase Analytics ログ:
- 次のログで、IP アドレスを 100.0.0.0:443 などから IP:443 に置き換えました。
- アプリ名が MyAppName に変更されました
2021-08-12 16:59:51.615734-0500 MyAppName[4586:1910198] [] nw_protocol_instance_access_flow_state [C13.2.1:2] フロー 1090aae88 が見つかりませんでした 2021-08-12 16:59:51.615828-0500 My180:1919 ] [] nw_protocol_instance_access_flow_state [C13.2.1:2] フロー 1090aae88 2021-08-12 16:59:51.624933-0500 MyAppName[4586:1910198] が見つかりませんでした [] nw_protocol_instance_access_flow_state [C13.2.1:2] 20a 8ae 1 が見つかりませんでした-08-12 16:59:51.625051-0500 MyAppName[4586:1910198] [] nw_protocol_instance_access_flow_state [C13.2.1:2] フローが見つかりませんでした 1090aae88 2021-08-12 16:59:51.625570-0500 MyAppName[9186]:1 [] nw_protocol_instance_access_flow_state [C13.2.1:2] フローが見つかりませんでした 1090aae88 2021-08-12 16:59:51.625716-0500 MyAppName[4586:1910198] [接続] nw_endpoint_handler_set_adaptive_read_handler [C14 IP:443 レディ チャネル フロー (満足 (パスが満足)、実行可能、インターフェイス: en0、ipv4、dns)] read_timeout の登録解除通知が失敗しました 2021-08-12 16:59:51.625773-0500 MyAppName[4586:1910198] [接続] nw_endpoint_handler_set_adaptive_write_handler [C14 IP:443 レディ チャネル フロー (満足 (パスが満足)、実行可能、インターフェイス: en0、ipv4、dns)] write_timeout の登録解除通知が失敗しました 2021-08-12 16:59:51.625828-0500 MyAppName[4586: 1910198] [接続] nw_endpoint_handler_set_keepalive_handler [C14 IP:443 レディ チャネル フロー (満足 (パスが満足)、実行可能、インターフェイス: en0、ipv4、dns)] キープアライブの登録解除通知に失敗しました 2021-08-12 16:59:51.626028- 0500 MyAppName[4586:1910198] [] nw_protocol_instance_access_flow_state [C13.2.1:2] フローが見つかりませんでした 1090aae88 2021-08-12 16:59:51.626859-0500 MyAppName[4586:1910198] [] nw_protocol_instance_access_flow_state [C13.2.1:2] フローが見つかりませんでした 10909f7c8 2021-08-12 16:59:51.627061-0500 MyAppName[4586:1910198] [接続] nw_endpoint_handler_set_adaptive_read_handler.13.4-3 チャネル(満足 (パスが満足)、実行可能、インターフェイス: en0、ipv4、dns)] read_timeout の登録解除通知が失敗しました 2021-08-12 16:59:51.627118-0500 MyAppName[4586:1910198] [接続] nw_endpoint_handler_set_adaptive_write_handler [C13.2.1 IP:443 レディ チャネル フロー (満足 (パスが満足)、実行可能、インターフェイス: en0、ipv4、dns)]接続] nw_endpoint_handler_set_keepalive_handler [C13.2.1 IP:443 準備完了チャネル フロー (満足 (パスが満足)、実行可能、インターフェイス: en0、ipv4、dns)] キープアライブの登録解除通知に失敗しました 2021-08-12 16:59:51.641425-0500 MyAppName[4586:1909925] [] nw_protocol_instance_access_flow_state [C13.2.1:2] Failed to find flow 1090aae88 2021-08-12 16:59: 51.647736-0500 MyAppName[4586:1909925] タスク .<9> HTTP ロードに失敗しました、529/0 バイト (エラー コード: 303 [4:-2205]) 2021-08-12 16:59:51.648181-0500 MyAppName[4586: 1909923] タスク .<9> がエラー [303] で終了しました エラー Domain=kCFErrorDomainCFNetwork Code=303 "(null)" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask .<9>, _kCFStreamErrorDomainKey=4, NSErrorPeerAddressKey=<CFData 0x28375a080 [0x1f9151860]>{長さ = 16、容量 = 16、バイト = 0x100201bb6810b8f80000000000000000}、_kCFStreamErrorCodeKey=-2205、_NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask .<9>" )} 2021-08-12 16:59:51。648326-0500 MyAppName[4586:1909925] [connection] nw_endpoint_handler_unregister_context [C13.2.1 IP:443 failed channel-flow (satisfied (Path is met), viable, interface: en0, ipv4, dns)] フローテーブル解放後に登録解除できない2021-08-12 16:59:51.648393-0500 MyAppName[4586:1909925] [h3connection] 0x1099d1a18 13 はピア エラー 258 で閉じられました 2021-08-12 16:59:51.648500-0500 MyAppName[4point586:1909925] [C13.2.1 IP:443 失敗したチャネル フロー (満足 (パスが満足)、実行可能、インターフェイス: en0、ipv4、dns)] フロー テーブルが解放された後に送信できません 2021-08-12 16:59:51.648625-0500 MyAppName [4586:1909925] [接続] nw_write_request_report [C13] エラー「ソケットが接続されていません」で送信に失敗しました443 失敗したチャネル フロー (満足 (パスが満足)、実行可能、インターフェイス: en0、ipv4、dns)] フロー テーブルが解放された後、登録を解除できません 2021-08-12 16:59:51.648393-0500 MyAppName[4586:1909925] [ h3connection] 0x1099d1a18 13 はピア エラー 258 2021-08-12 16:59:51.648500-0500 MyAppName[4586:1909925] [接続] nw_endpoint_handler_add_write_request [C13.2.1 IP:443 失敗したチャネル フロー (満足 (パスが満たされている)、 viable, interface: en0, ipv4, dns)] フロー テーブルが解放された後、送信できません接続されていません"443 失敗したチャネル フロー (満足 (パスが満足)、実行可能、インターフェイス: en0、ipv4、dns)] フロー テーブルが解放された後、登録を解除できません 2021-08-12 16:59:51.648393-0500 MyAppName[4586:1909925] [ h3connection] 0x1099d1a18 13 はピア エラー 258 2021-08-12 16:59:51.648500-0500 MyAppName[4586:1909925] [接続] nw_endpoint_handler_add_write_request [C13.2.1 IP:443 失敗したチャネル フロー (満足 (パスが満たされている)、 viable, interface: en0, ipv4, dns)] フロー テーブルが解放された後、送信できません接続されていません"1909925] [h3connection] 0x1099d1a18 13 がピア エラー 258 で閉じられました 2021-08-12 16:59:51.648500-0500 MyAppName[4586:1909925] [接続] nw_endpoint_handler_add_write_request [C13.2.1 IP:443 失敗したチャネル フロー (satis満足)、実行可能、インターフェイス: en0、ipv4、dns)] フロー テーブルが解放された後に送信できません 2021-08-12 16:59:51.648625-0500 MyAppName[4586:1909925] [接続] nw_write_request_report [C13] 送信がエラーで失敗しました「ソケットが接続されていません」1909925] [h3connection] 0x1099d1a18 13 がピア エラー 258 で閉じられました 2021-08-12 16:59:51.648500-0500 MyAppName[4586:1909925] [接続] nw_endpoint_handler_add_write_request [C13.2.1 IP:443 失敗したチャネル フロー (satis満足)、実行可能、インターフェイス: en0、ipv4、dns)] フロー テーブルが解放された後に送信できません 2021-08-12 16:59:51.648625-0500 MyAppName[4586:1909925] [接続] nw_write_request_report [C13] 送信がエラーで失敗しました「ソケットが接続されていません」1909925] [connection] nw_write_request_report [C13] Send failed with error "Socket is not connected" (ソケットが接続されていません)1909925] [connection] nw_write_request_report [C13] Send failed with error "Socket is not connected" (ソケットが接続されていません)
この問題を解決するためのアイデアをお寄せいただきありがとうございます。