3G では正常に機能するが、一部の企業ファイアウォールでは機能しないメッセージング プロトコルを使用したいと考えています。WiFi ネットワークに到達できる場合でも、WiFi 経由での接続に失敗した場合、アプリでセルラー ネットワークの使用を強制するにはどうすればよいですか?
編集: Reachability クラスの実装を読んだ後、2 つが実際に相互に排他的であるかどうかはわかりません。を介して両方のインターフェイスを検出することは十分に可能gethostbyname()
です。
getifaddrs を使用して、ネットワーク インターフェイスを列挙します。「pdp」で始まる ifa_name を探します。これはセルラー インターフェイスになります (例: pdp_ip0)。テスト (ifa_flags & IFF_UP) してインターフェースが稼働していることを確認し、ifa_addr から IP アドレスを取得します。次に bind() を使用してソケットをそのアドレスにバインドします。
まだ起動していない場合、セルラー インターフェイスをアクティブにする方法がわからない。通常、高レベルの http 呼び出しを行って iOS にネットワークを起動させるだけですが、Wi-Fi も利用できる場合にセルラー サービスがアクティブになる条件はわかりません。通常、wifiへのフォールバックとして存在すると思われます。
http://iphonedevsdk.com/discussion/comment/120957
そのスレッドの見た目からすると、それは不可能のようです。最善の策は、プロトコルを使用してみて、それが機能しない場合は「wifiから切断して再試行してください」などと言うことです。
このスレッドはほぼ同じことを言っています:
アップルが作成したReachabilityクラスを使用して、ネットワーク接続が現在3GまたはWiFiを介しているかどうかをテストしたり、特定のリソースがネットワークで利用可能かどうかを確認したりすることもできます。