iOS アプリで通信状態を取得するなら、Reachability より FBNetworkReachability の方がいいんじゃない?

  • 54
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

結論

表題のとおり

ありがたい配布元↓

[iOS] ネットワーク接続状況取得ライブラリを公開
http://cocoadays.blogspot.jp/2011/05/ios_25.html

理由

Reachability や StackOverflow で見つけたインターネットの通信状態の取得をしてくれる処理は、
通信状態の変化がワンテンポ遅れるため、申し訳ないけどちょっと使えないって思ってた

例をあげると、自分の過去の記事で課金について取り上げたことがあるのだけど、そこで

課金中に機内モードにして通信切断すると、直後に課金失敗の反応が返ってくるのに、その時 Reachability で通信状態を確認するとしばらくの間は通信が繋がっているという状態しか返ってこない。
すぐ状態を取得したいのに。どうしよう。

という問題が発生して結構困ったことがあった
(結局 NSURLConnection で自鯖を叩いて通信状態を確認する、というなんか危うい方法を取っていた)

ところがどっこい、FBNetworkReachability を使用すると現在の通信状態が即座に反映されてるんですね
(^ω^)使えるわ〜
NSURLConnection とか いらんかった!


以上の理由をもって FBNetworkReachability を使った方がよくね?
と思いましたとさ

ただ検索かけても「FBNetworkReachability は Rechability を使いやすくラップしたもの」
という情報くらいしかなくて
(´・ω・`).。oO(あれ? 問題発生してるの俺だけ?)
って思ったけどまあいいか
使いやすくなってるっていうしな! うん!
紹介するページが増えることに意義があるんじゃないかなー!(´・ω・`)

おまけ

配布元ページに refresh の表記がなかったけど、
今のところ refresh 呼ばないと最新の状態が反映されない

ConnectUtils.m
+ (BOOL)reachable
{
    FBNetworkReachability *r = [FBNetworkReachability sharedInstance];
    [r refresh];
    return FBNetworkReachableNon != r.connectionMode;
    // return r.reachable;  // ↑と同じ
}

Swift で使うなら Bridging Header つかいましょね

ConnctUtils.swift
public class final func reachable() -> Bool
{
    let r: FBNetworkReachability = FBNetworkReachability.sharedInstance()
    r.refresh()
    return FBNetworkReachabilityConnectionMode.ReachableNon != r.connectionMode
    // return r.reachable;  // ↑と同じ
}