LoginSignup
20
9

More than 5 years have passed since last update.

iOS12の実機でwillEnterForegroundのタイミングで通信すると失敗する

Last updated at Posted at 2018-09-22

Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort"

というエラーが発生します。
iOS11の時には発生していなかったと思うのですが、手元にiOS11の実機端末が無いためちゃんと確認できていません。(なのでタイトルの"iOS12の"は余計かも...?)
「必ず失敗する」というわけではないですが、「頻繁に失敗する」ようです。
シミュレータでは発生せず、実機のみ発生しました。

再現手順

以下のコードで、バックグラウンドに行ったあと数秒待ってアプリ画面に戻ると再現します。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(connection),
                                               name: UIApplication.willEnterForegroundNotification,
                                               object: nil)
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    @objc func connection() {
        let url = URL(string: "https://qiita.com/ichimots")!
        URLSession.shared.dataTask(with: url) { _, response, error in
            if let _ = response {
                print("---success---")
            }
            if let error = error {
                print("---fail---")
                print(error) // Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={_kCFStreamErrorCodeKey=53, _kCFStreamErrorDomainKey=1}
            }
        }.resume()
    }
}

対応方法

willEnterForegroundNotification

didBecomeActiveNotification
に置き換えてあげることで、発生しなくなりました。

発生原因

詳しく調べきれていません。
アプリがアクティブ状態になる直前に通信処理を発行していたことが原因だと考えてはいますが、コレという確証が掴めておらず...
詳細わかる方がいらっしゃるようでしたら、コメントお待ちしております。

参考

アプリケーションの実行状態

20
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
9