カテゴリ: Swift 更新日: 2025/12/28

SwiftのURLSessionでのネットワークエラー対策!再試行とタイムアウトを初心者向けに解説

Swift URLSessionのネットワークエラー対策|再試行・タイムアウト
Swift URLSessionのネットワークエラー対策|再試行・タイムアウト

先生と生徒の会話形式で理解しよう

生徒

「Swiftでサーバーからデータを取るときにURLSessionを使うんですけど、エラーが出ることがあるんです。どうすれば安全に使えますか?」

先生

「ネットワークは必ず安定しているとは限らないので、エラーが発生するのは普通のことです。そこで必要なのがエラーハンドリングです。特に、再試行(リトライ)とタイムアウトの設定が重要ですよ。」

生徒

「再試行って、もう一度やり直すことですか?タイムアウトは待ち時間のことですよね?」

先生

「その通りです。今日はURLSessionのエラー処理を、初心者向けに例えを使いながら学んでいきましょう!」

1. URLSessionとは?

1. URLSessionとは?
1. URLSessionとは?

URLSessionは、Swiftでネットワーク通信を行うための基本的な仕組みです。例えば「天気予報アプリ」がインターネットから最新の天気情報を取得するときに使います。

ただし、ネットワークには「電波が弱い」「サーバーが混雑している」といった不安定な要素があるため、データ取得に失敗することがあります。そこで必要なのがエラーハンドリングです。

2. ネットワークエラーの種類

2. ネットワークエラーの種類
2. ネットワークエラーの種類

ネットワークエラーにはいくつかの種類があります。

  • インターネットに接続できない
  • サーバーからの応答が遅い
  • データ形式が正しくない
  • 接続が途中で切れた

これらのエラーをすべて一律に「失敗」と扱うのではなく、原因ごとに処理を工夫することでアプリの信頼性が向上します。

3. 再試行(リトライ)の考え方

3. 再試行(リトライ)の考え方
3. 再試行(リトライ)の考え方

再試行とは、エラーが出たときに一定回数やり直す仕組みです。例えば自動販売機でお金を入れて飲み物が出てこなかったら、もう一度ボタンを押すようなものです。

ただし無限に繰り返すと逆効果なので、「最大3回まで」などのルールを決めるのが基本です。


func fetchDataWithRetry(url: URL, retryCount: Int = 3) async throws -> Data {
    var attempts = 0
    while attempts < retryCount {
        do {
            let (data, _) = try await URLSession.shared.data(from: url)
            return data
        } catch {
            attempts += 1
            if attempts == retryCount {
                throw error
            }
        }
    }
    throw URLError(.badServerResponse)
}

この例では、最大3回までやり直しをして、それでも失敗した場合にエラーを返します。

4. タイムアウトの設定

4. タイムアウトの設定
4. タイムアウトの設定

タイムアウトとは、「いつまで待つか」を決める仕組みです。例えば友達にメッセージを送って、1分経っても返事が来なかったら諦める、というイメージです。

URLSessionでは、URLSessionConfigurationを使ってタイムアウトを設定できます。


let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 5 // リクエストの待機時間
config.timeoutIntervalForResource = 10 // 全体の待機時間
let session = URLSession(configuration: config)

let (data, _) = try await session.data(from: url)

これにより、ネットワークが応答しない場合でも無限に待つことなく、一定時間で処理を打ち切れます。

5. 再試行とタイムアウトを組み合わせる

5. 再試行とタイムアウトを組み合わせる
5. 再試行とタイムアウトを組み合わせる

実際のアプリでは、再試行とタイムアウトを組み合わせるのが一般的です。例えば、5秒でタイムアウトし、失敗したら3回まで再試行するといった設計です。


func fetchData(url: URL) async throws -> Data {
    let config = URLSessionConfiguration.default
    config.timeoutIntervalForRequest = 5
    let session = URLSession(configuration: config)
    
    var attempts = 0
    while attempts < 3 {
        do {
            let (data, _) = try await session.data(from: url)
            return data
        } catch {
            attempts += 1
            if attempts == 3 {
                throw error
            }
        }
    }
    throw URLError(.cannotLoadFromNetwork)
}

こうすることで「遅い通信に無限に待たされる」や「一度の失敗ですぐにアプリが止まる」といった問題を防げます。

6. エラー処理の設計ポイント

6. エラー処理の設計ポイント
6. エラー処理の設計ポイント

初心者の方が理解しておくべきポイントは次の通りです。

  • エラーは必ず起きるものと考えて設計する
  • 再試行回数を決めておくことで無限ループを防ぐ
  • タイムアウトを設定して無駄な待ち時間を避ける
  • ユーザーに「失敗しました」とわかりやすく伝える

これらを守るだけで、アプリの安定性とユーザー体験が大きく向上します。

7. 実際のアプリでの利用例

7. 実際のアプリでの利用例
7. 実際のアプリでの利用例

例えば「天気アプリ」でデータ取得を考えてみましょう。サーバーが混雑していて最初のリクエストが失敗しても、再試行をすれば次は成功するかもしれません。また、通信が遅くて10秒以上待たされたら「タイムアウト」としてユーザーにエラーメッセージを表示することが必要です。

こうした工夫を組み合わせることで、SwiftのURLSessionを使ったネットワーク処理はより信頼性の高いものになります。

まとめ

まとめ
まとめ

Swiftでのネットワーク通信は、日常的に使われる天気アプリやニュースアプリなど、多くのアプリで当たり前のように実行されています。しかし、その裏ではネットワーク特有の不安定さや遅延、予期せぬエラーなど、さまざまなトラブルに対処しながらデータ取得を行っています。今回学んだように、URLSessionはシンプルで扱いやすい反面、通信失敗に備えておくことが重要であり、再試行やタイムアウトといった仕組みを理解することで、より安定した Swift アプリを構築できるようになります。 ネットワーク環境は常に完璧ではなく、電波が弱くなることも、サーバーの応答が遅くなることもあります。そのため、「エラーが起きてもアプリが落ちない」設計は必須です。再試行を適切に設定すれば、瞬間的な接続不良や一時的な失敗を吸収でき、ユーザーが気付かないほど自然な動作につながります。また、タイムアウトを設けることで、いつまでも無限に待たされるような状況を防ぎ、アプリ全体の操作感が向上します。

さらに、Swiftの非同期処理と組み合わせることで、UIを止めずにバックグラウンドで通信を安全に進めることができ、ユーザーにとってストレスのないアプリ体験を提供できます。今回の記事で紹介したコードは、実際のアプリ開発でそのまま応用できる構造であり、必要に応じて再試行回数を増やしたり、タイムアウトの秒数を調整したりと、状況に合わせたチューニングも可能です。 毎回必ず成功するとは限らないネットワーク通信だからこそ、事前に「起こりうるエラー」を見越した設計は非常に大切です。SwiftのURLSessionは、その基盤として十分な柔軟性を持ち、開発者が細かく挙動を制御できる仕組みが備わっています。データ取得に失敗しても適切にリトライし、応答が遅すぎる場合には明確にタイムアウトさせる。これらの組み合わせは、小規模なアプリから大規模サービスまで幅広く活用される基本です。

再試行とタイムアウトを組み合わせたサンプルコード


struct NetworkService {
    static func load(url: URL, retry: Int = 3, timeout: TimeInterval = 5) async throws -> Data {
        let config = URLSessionConfiguration.default
        config.timeoutIntervalForRequest = timeout
        let session = URLSession(configuration: config)

        var attempts = 0
        while attempts < retry {
            do {
                let (data, _) = try await session.data(from: url)
                return data
            } catch {
                attempts += 1
                print("試行中: \(attempts) 回目のリクエスト失敗")

                if attempts == retry {
                    print("すべての試行が失敗しました")
                    throw error
                }
            }
        }
        throw URLError(.cannotLoadFromNetwork)
    }
}

// 実行例
Task {
    do {
        let url = URL(string: "https://example.com/data.json")!
        let data = try await NetworkService.load(url: url)
        print("データ取得成功: \(data.count) bytes")
    } catch {
        print("最終的にデータ取得に失敗: \(error.localizedDescription)")
    }
}

このコードは、タイムアウトと再試行が組み合わさった実践的な例で、ネットワーク環境が不安定な場合にも柔軟に対応できます。アプリ開発では、ユーザーがどの状況で使うかは予測できません。そのため、どんな環境でも安定して動作するような仕組みを備えておくことが大切です。Swift の URLSession はその基礎を支える頼れる存在であり、適切な設定をすることで大きな効果を発揮します。

先生と生徒の振り返り会話

生徒

「ネットワーク通信が失敗するのは珍しいことじゃないって、今日初めて実感しました。でも再試行やタイムアウトがあれば、安心して処理できるんですね。」

先生

「その通りです。通信は思った以上に不安定だからこそ、失敗しても大丈夫なように準備しておくことが大事なんです。SwiftのURLSessionは細かい仕様を調整できるから、とても頼りになりますよ。」

生徒

「再試行回数やタイムアウトの設定って、アプリによって調整できるのが便利ですね。ユーザーにとって自然な動きになるように工夫してみたいです。」

先生

「その考え方はとても良いですよ。状況に合わせて適切な値を選ぶことが、使いやすいアプリにつながります。ネットワークエラーを恐れず、仕組みを理解して賢く扱えるようになってくださいね。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

SwiftのURLSessionとは何をするための仕組みですか?

SwiftのURLSessionは、サーバーからデータを取得したり送信したりするためのネットワーク通信機能で、天気アプリやニュースアプリなど多くのアプリで利用されます。
カテゴリの一覧へ
新着記事
New1
Go言語
Go言語のオブジェクト指向の特徴を完全ガイド!初心者でも理解できる他言語との違い
New2
Go言語
Go言語の条件分岐の見やすい書き方を徹底解説!初心者でもわかるif文の使い方
New3
Kotlin
Kotlinのクラス設計に役立つベストプラクティスまとめ|初心者でもわかるクラス設計の考え方
New4
Kotlin
Kotlinでアーキテクチャ設計の基本!MVC・MVP・MVVMの違いを解説
人気記事
No.1
Java&Spring記事人気No1
Go言語
Go言語の関数パラメータ!値渡しと参照渡しの違いを理解しよう
No.2
Java&Spring記事人気No2
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.3
Java&Spring記事人気No3
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.4
Java&Spring記事人気No4
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.5
Java&Spring記事人気No5
Kotlin
Kotlinのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.6
Java&Spring記事人気No6
Go言語
Go言語のWebアプリにおけるセキュリティベストプラクティス集
No.7
Java&Spring記事人気No7
Kotlin
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説
No.8
Java&Spring記事人気No8
Swift
Swiftのオプショナル型とは?初心者でもわかる使い方とアンラップの基礎