Help us understand the problem. What is going on with this article?

【Swift 2】デバイスがオンラインなのかオフラインなのかを判定

More than 3 years have passed since last update.

私のポートフォリオ的な Web サイトから、コードのサンプルなど、重要なものを抜き出したものになります。
Xcode の使い方などがわからない方はこちらを閲覧することをお勧めします。

環境について

今回のサンプルコードは以下の環境を想定しています。

  • Swift version 2.0 (swiftlang-700.0.52.2 clang-700.0.65)
  • Xcode Version 7.0 beta 5 (7A176x)

※2015年8月25日(JST) 追記
以下の環境での動作も確認しました。

  • Swift version 2.0 (swiftlang-700.0.57.3 clang-700.0.72)
  • Xcode Version 7.0 beta 6 (7A192o)

Swift 2.0 移行を想定しています。1.x では記法が異なるため使用できません。

SystemConfiguration.framework の追加

5caf59d3ba1e40558018eaf03334b550.png
プロジェクトに SystemConfiguration.framework を追加します。

ネットワーク状態をチェックする関数を作成

今回は様々な場面でネットワーク状態をチェックすると想定し、関数を作ることにします。
コードはこちらです。

CheckReachability.swift
import SystemConfiguration

func CheckReachability(host_name:String)->Bool{

    let reachability = SCNetworkReachabilityCreateWithName(nil, host_name)!
    var flags = SCNetworkReachabilityFlags.ConnectionAutomatic
    if !SCNetworkReachabilityGetFlags(reachability, &flags) {
        return false
    }
    let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
    let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
    return (isReachable && !needsConnection)
}

SystemConfiguration.framework を import し、続いて関数の作成となっています。

関数を使用する

先ほど作成した関数を使う場合はこのようにします。

例えばデバッグエリアに表示する場合

print(CheckReachability("google.com"))

というような感じですね。
Swift 1.x では println でしたが、2.0 では print となりました。

上記に挙げたコードは、google.com というホストに接続成功した場合 true、接続できなかった場合 false を返します。

最後に

応用編です。
AppDelegate.swift を以下のように記述します。

AppDelegate.swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        return true
    }
    func applicationWillResignActive(application: UIApplication) {
    }
    func applicationDidEnterBackground(application: UIApplication) {
    }
    func applicationWillEnterForeground(application: UIApplication) {
    }

    func applicationDidBecomeActive(application: UIApplication) {
// ここから
        if CheckReachability("google.com") {
            print("インターネットへの接続が確認されました")
        } else {
            print("インターネットに接続してください")

            let alertController = UIAlertController(title: "インターネット未接続", message: "本アプリはインターネットに\n接続されていない状態で\n使用することは出来ません。", preferredStyle: .Alert)

            let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
            alertController.addAction(defaultAction)

            self.window?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)

        }
// ここまで
    }

    func applicationWillTerminate(application: UIApplication) {
    }
}

このように記述すると、
毎アプリ起動時にインターネットに接続されているかどうかを判断し、
インターネットに接続されていれば通常通り起動。
未接続の場合は

本アプリはインターネットに
接続されていない状態で
使用することは出来ません。

というようなアラートが出現します。
インターネットの接続が必須なアプリを制作している場合は実装必須ですね。

treastrain
iOS・watchOS App「Japan NFC Reader」を作っています。 Nat. Institute of Tech., Hachinohe College → Muroran Institute of Tech. Student Apple Teacher Swift Playgrounds認定
https://treastrain.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした