インターネット
 Computer >> コンピューター >  >> ネットワーキング >> インターネット

Swift でのインターネット接続の検出と管理:実践ガイド

ネオ・イゴダロ

多くの場合、モバイル アプリケーションが正しく機能するには、アクティブなインターネット接続が必要です。ただし、インターネット接続が失われるのは正常です。このような場合、エクスペリエンスを耐えられるものにするか、少なくともユーザーに通知する方法を考え出すのは開発者の責任です。

この記事では、Swift でインターネット接続の問題を検出する方法と、それに対処できるいくつかの方法を見ていきます。

ここでは、これから構築するサンプル アプリケーションと、それがさまざまなインターネット接続シナリオをどのように処理するかを示します。

Swift でのインターネット接続の検出と管理:実践ガイド

要件

この記事を進めるには、次の要件が必要です。

  • Xcode がマシンにインストールされている。
  • Swift プログラミング言語に関する知識
  • マシンにインストールされている Cocoapod。

上記の要件を満たしたら、早速始めてみましょう。

ワークスペースのセットアップ

始める前に、遊び場を作成します。ここですべてのユースケースを作成し、処理します。

Swift には接続の問題を検出するための独自の Reachability 実装が付属していますが、ここではサードパーティのライブラリを使用します。これを行うのは、組み込み API よりも API の方が簡単で表現力が高いためです。

Xcode を開いて、新しいプロジェクトをセットアップします。

Swift でのインターネット接続の検出と管理:実践ガイド

このプロジェクトは、実験できるシンプルな遊び場になります。

接続がオフラインになったことを検出するには、Reachability.swift を使用します。 ** パッケージ。これは、「クロージャを使用して Swift で書き直された Apple の Reachability の置き換え」です。

ターミナルを開いて、以下のコマンドを実行します。

$ pod init

これにより、新しい Podfile が作成されます。 ここで、Cocoapod の依存関係を宣言できます。 Podfile を開きます そして、内容を以下のコードに置き換えます。

platform :ios, '9.0'
target 'project_name' do use_frameworks! pod 'ReachabilitySwift' pod 'Alamofire'end

交換する必要があります **project_name** プロジェクトの名前を付けます

ファイルを保存し、以下のコマンドを実行して、プロジェクトにポッドをインストールします。

$ pod install

インストールが完了したら、*.xcworkspace を開きます。 プロジェクトのルートにあるファイル。これにより Xcode が起動します。

ネットワーク到達可能性マネージャーの作成

新しい NetworkManager を作成します クラス。このクラスはネットワーク ステータスを保存し、Reachability への単純なプロキシになります。 パッケージ。ファイルに、以下のコードを貼り付けます。

import Foundationimport Reachability
class NetworkManager: NSObject {
 var reachability: Reachability!
 static let sharedInstance: NetworkManager = { return NetworkManager() }()
 override init() { super.init()
 // Initialise reachability reachability = Reachability()!
 // Register an observer for the network status NotificationCenter.default.addObserver( self, selector: #selector(networkStatusChanged(_:)), name: .reachabilityChanged, object: reachability )
 do { // Start the network status notifier try reachability.startNotifier() } catch { print("Unable to start notifier") } }
 @objc func networkStatusChanged(_ notification: Notification) { // Do something globally here! }
 static func stopNotifier() -> Void { do { // Stop the network status notifier try (NetworkManager.sharedInstance.reachability).startNotifier() } catch { print("Error stopping notifier") } }
 // Network is reachable static func isReachable(completed: @escaping (NetworkManager) -> Void) { if (NetworkManager.sharedInstance.reachability).connection != .none { completed(NetworkManager.sharedInstance) } }
 // Network is unreachable static func isUnreachable(completed: @escaping (NetworkManager) -> Void) { if (NetworkManager.sharedInstance.reachability).connection == .none { completed(NetworkManager.sharedInstance) } }
 // Network is reachable via WWAN/Cellular static func isReachableViaWWAN(completed: @escaping (NetworkManager) -> Void) { if (NetworkManager.sharedInstance.reachability).connection == .cellular { completed(NetworkManager.sharedInstance) } }
 // Network is reachable via WiFi static func isReachableViaWiFi(completed: @escaping (NetworkManager) -> Void) { if (NetworkManager.sharedInstance.reachability).connection == .wifi { completed(NetworkManager.sharedInstance) } }]

上記のクラスでは、ネットワーク ステータスの監視を開始するのに役立ついくつかのヘルパー関数を定義しました。 sharedInstance があります これはシングルトンであり、NetworkManager の複数のインスタンスを作成したくない場合は、これを呼び出すことができます。 クラス。

init で メソッドでは、Reachability のインスタンスを作成します。 次に、NotificationCenter を使用して通知を登録します。 クラス。これで、ネットワークのステータスが変化するたびに、NotificationCenter で指定されたコールバックが実行されます。 (これは networkStatusChanged です )が呼び出されます。これを使用して、ネットワークに到達できないときにアクティブ化されるグローバルな処理を行うことができます。

インターネット接続の状態に応じてコードの実行を一般的に簡単にする他のヘルパー関数を定義しました。 *isReachable* があります 、*isUnreachable**isReachableViaWWAN**isReachableViaWiFi* .

これらのヘルパーのいずれかの使用法は、通常次のようになります。

NetworkManager.isReachable { networkManagerInstance in print("Network is available")}
NetworkManager.isUnreachable { networkManagerInstance in print("Network is Unavailable")}

これはイベント リスナーではないため、一度だけ実行されます。リスナーを使用してネットワークの変更をリアルタイムで取得するには、 NetworkManager.sharedInstance.reachability.whenReachable。この記事の後半で例を紹介します。

マネージャー クラスができたので、これをアプリケーションでどのように使用できるかを見てみましょう。

アプリケーション起動時のネットワーク可用性の処理

場合によっては、アプリケーションがインターネット接続に大きく依存しており、起動時にステータスを検出する必要があることがあります。 NetworkManager を使用してこれを処理する方法を見てみましょう。 クラス。

LaunchViewController という新しいコントローラを作成します。 。ストーリーボード上の最初のコントローラー ビューを起動コントローラーとして扱います。ユーザーのデバイスがオンラインかどうかの検出を試みます。オンラインでない場合は、これを処理するオフライン ページを作成して、ユーザーがアプリケーションにまったくアクセスしないようにします。

LaunchController で 、内容を次のコードに置き換えます。

import UIKit
class LaunchViewController: UIViewController { let network: NetworkManager = NetworkManager.sharedInstance
 override func viewDidLoad() { super.viewDidLoad()
 NetworkManager.isUnreachable { _ in self.showOfflinePage() } }
 private func showOfflinePage() -> Void { DispatchQueue.main.async { self.performSegue( withIdentifier: "NetworkUnavailable", sender: self ) } }}

このクラスでは、NetworkManager を使用します。 *isUnreachable*showOffline を起動するメソッド ネットワークが利用できない場合の方法。そのビューコントローラーを作成しましょう。 OfflineViewController という名前の新しいビュー コントローラーを作成します。 .

Main.storyboard を開きます ファイルを作成し、最初のビューのカスタム クラスを LaunchViewController に設定します。 .

次に、ストーリーボードに新しいビュー コントローラーを作成します。 OfflineViewController を設定します。 この新しいビュー コントローラーのカスタム クラスとして。次に、NetworkUnavailable という名前の手動セグエを作成します。 新しいビュー コントローラーと LaunchViewController の間 。完了すると、次のような内容になるはずです。

Swift でのインターネット接続の検出と管理:実践ガイド

それでは、アプリケーションを実行してみましょう。ただし、iOS シミュレーターはマシンのインターネット接続を使用するため、アプリケーションを実行する前に開発マシンをオフラインにする必要があることに注意してください。アプリケーションを実行すると、作成したオフライン ページが表示されるはずです。

次に、接続があるときに表示されるビュー コントローラーを作成しましょう。

デバイスがオンラインになったときのイベントの処理

Offline View Controller を作成し、デバイスがオフラインのときに機能するようになりました。次に、デバイスがオンラインに戻ったときに何が起こるかを処理しましょう。

Offline View Controller の下のストーリーボードに新しい Navigation View Controller を作成します。最新の Reddit 投稿を表示するコントローラーを作成します。 PostsTableViewController という名前の新しいビュー コントローラー クラスを作成します。 。次に、これを Navigation View Controller にアタッチされる View Controller のカスタム クラスにします。

次に、MainController という名前の手動セグエを作成します。 Navigation ViewController から Launch ViewController および Offline ViewController まで。次のような内容が得られるはずです:

Swift でのインターネット接続の検出と管理:実践ガイド

次に、LaunchViewController を開きます。 クラスと viewDidLoad の下部 メソッドに以下を追加します:

NetworkManager.isReachable { _ in self.showMainPage()}

次に、以下のメソッドをコントローラに追加します。

private func showMainPage() -> Void { DispatchQueue.main.async { self.performSegue( withIdentifier: "MainController", sender: self ) }}

これにより、アプリの起動時に接続が確認され、接続が利用可能な場合は PostsTableViewController が表示されます。 。それ以外の場合は、OfflineViewController が表示されます。 .

素晴らしい!しかし、ユーザーが OfflineViewController を押した場合はどうなるでしょうか。 その後、ネットワークがオンラインに戻りますか?そのシナリオに対処しましょう。

OfflineViewController を開きます コードを以下のコードに置き換えます。

import UIKit
class OfflineViewController: UIViewController { let network = NetworkManager.sharedInstance
 override func viewDidLoad() { super.viewDidLoad()
 // If the network is reachable show the main controller network.reachability.whenReachable = { _ in self.showMainController() } }
 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated)
 navigationController?.setNavigationBarHidden(true, animated: animated) }
 override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated)
 navigationController?.setNavigationBarHidden(false, animated: animated) }
 private func showMainController() -> Void { DispatchQueue.main.async { self.performSegue(withIdentifier: "MainController", sender: self) } }}

上のコントローラーの viewDidLoad にあるのがわかります。 メソッドでは、whenReachable を設定します。 完了してメインコントローラーが表示されます。これは、デバイスがオフラインである限り、デバイスがいつオンラインに戻るかを監視することを意味します。その場合、PostsTableViewController を提示します。 .

viewWillAppear もオーバーライドします。 および viewWillDisappear Offline View Controller にナビゲーション バーが表示されないようにするメソッド。

Swift で Reddit API から投稿を取得する

次に、Reddit からデータを取得して PostsTableViewController に表示するロジックを追加しましょう。 。ファイルを開き、内容を以下のコードに置き換えます。

import UIKitimport Alamofire
struct RedditPost { let title: String! let subreddit: String!}
class PostsTableViewController: UITableViewController { var posts = [RedditPost]()
 let network = NetworkManager.sharedInstance
 override func viewDidLoad() { super.viewDidLoad() navigationItem.title = "Latest Posts"
 // Fetch the posts and then reload the table fetchPosts { posts in self.posts = posts self.tableView.reloadData() } }
 private func fetchPosts(completion: @escaping (_ posts: [RedditPost]) -> Void) -> Void { // Send a request to the Reddit API Alamofire.request("https://api.reddit.com").validate().responseJSON { response in switch response.result { case .success(let JSON): let data = JSON as! [String:AnyObject] guard let children = data["data"]!["children"] as? [AnyObject] else { return } var posts = [RedditPost]()
 // Loop through the Reddit posts and then assign a post to the posts array for child in 0...children.count-1 { let post = children[child]["data"] as! [String: AnyObject]
 posts.append(RedditPost( title: post["title"] as! String, subreddit: "/r/" + (post["subreddit"] as! String) )) }
 DispatchQueue.main.async { completion(posts) } case .failure(let error): print(error) } } }
 override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() }
 // MARK: - Table view data source override func numberOfSections(in tableView: UITableView) -> Int { return 1 }
 // Return the number of posts available override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.posts.count }
 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) let post = posts[indexPath.row] as RedditPost cell.textLabel?.text = post.title cell.detailTextLabel?.text = post.subreddit return cell }}

fetchPosts 内 メソッドでは、Alamofire を使用します。 GET リクエストを Reddit API に送信します。次に、応答を解析し、RedditPost に追加します。 ファイルの先頭に作成した構造体。これにより、tableView に渡すデータが作成されます。

デバイスがオフラインになったときのイベントの処理

ここで、もう 1 つのシナリオを処理してみましょう。 Reddit の最新の投稿を閲覧中に接続が切断されたと想像してください。何が起こるのですか?その場合は、オフライン ページを再度表示しましょう。

以前に行ったように、NetworkUnavailable という手動セグエを作成します。 PostsTableViewController から OfflineViewController へ 。次に、このコードを viewDidLoad の最後に追加します。 メソッド:

network.reachability.whenUnreachable = { reachability in self.showOfflinePage()}

次に、以下のメソッドをコントローラに追加します。

private func showOfflinePage() -> Void { DispatchQueue.main.async { self.performSegue(withIdentifier: "NetworkUnavailable", sender: self) }}

これはデバイスがいつオフラインになるかをリッスンし、オフラインになった場合は showOfflinePage を返します。 .

以上です! Swift の NetworkManager を使用して、オフライン イベントとオンライン イベントを処理できるようになりました。

結論

この記事では、オンライン イベントとオフライン イベントが発生したときにアプリケーションが確実に処理できるようにする方法を検討しました。これはいつでも好きな方法で実装できます。ご質問やフィードバックがございましたら、以下のコメント欄に残してください。

このプレイグラウンドのソース コードは GitHub で入手できます。

この記事は最初に Pusher に公開されました。

無料でコーディングを学びましょう。 freeCodeCamp のオープンソース カリキュラムは、40,000 人以上の人々が開発者としての職に就くのに役立ちました。始めましょう


  1. Firefox 75 (およびそれ以降) でアドレス バーを変更する方法

    Firefox 75 では無意味な変更が行われました。アドレス バー (urlbar) をクリックすると「ズームイン」するようになり、ピン留めしたショートカットを含む周囲の UI が部分的に見えなくなります。このことは完全にモバイルに感じられ、デスクトップでは完全に間違っています.当分の間、上記の記事で示したように、このナンセンスはさまざまな about:config 設定によって元に戻すことができます。 しかし、Firefox 77 (ナイトリー) では、これらのオプションがなくなったため、別のものが必要になります。このチュートリアルでは、古いアドレス バーのルック アンド フィールを取得

  2. ブロックチェーンオペレーティングシステムとは何ですか?

    テクノロジーの世界は最近、ブロックチェーンに夢中です。ブロックチェーンとは何か、そしてなぜ人々がブロックチェーンを欲しがるのかがわからない場合、それは困難になります。ブロックチェーンオペレーティングシステムの作成についての議論では、ループ外の人にとってはもっと複雑なことだけです! この記事では、ブロックチェーンとは何か、およびブロックチェーンを中心にオペレーティングシステムを構築する必要がある理由について説明します。 ブロックチェーンとは何ですか? ブロックチェーンは、改ざんに抵抗するように設計されたイベントまたはトランザクションの元帳です。これは、レコードの単一のマスターコピーがな