これが可能かどうかはわかりませんが、このシナリオはあります。
UIWebViewに表示されているWebサイトがあり、UISegmentedControllerにリンクが設定されています。彼らのウェブサイトは、あなたがwifi上にいるのか3gネットワーク上にいるのかを検出できます。
これで、セグメント化されたコントローラーは2つの異なるページをポイントします。1-iPhoneに優しいログイン画面2-ログイン後のホームページ.
ここで質問です:
WIFIまたは3Gのどちらであるかを検出するようにアプリケーションをプログラムすることはできますか(これを行うことができます)、その後、答えに基づいてセグメント1または2に進みます
このようなもの:
if (iPhone device is on 3g) {
Go to Segment 1;
} else {
Go to Segment 0;
}
Appleが提供するコードを使用する here
Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
NetworkStatus status = [reachability currentReachabilityStatus];
if(status == NotReachable)
{
//No internet
}
else if (status == ReachableViaWiFi)
{
//WiFi
}
else if (status == ReachableViaWWAN)
{
//3G
}
Reachabilityライブラリをインポートしたり、通知機能を処理したくない場合は、次の単純な同期メソッドを使用できます。
typedef enum {
ConnectionTypeUnknown,
ConnectionTypeNone,
ConnectionType3G,
ConnectionTypeWiFi
} ConnectionType;
+ (ConnectionType)connectionType
{
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, "8.8.8.8");
SCNetworkReachabilityFlags flags;
BOOL success = SCNetworkReachabilityGetFlags(reachability, &flags);
CFRelease(reachability);
if (!success) {
return ConnectionTypeUnknown;
}
BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0);
BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0);
BOOL isNetworkReachable = (isReachable && !needsConnection);
if (!isNetworkReachable) {
return ConnectionTypeNone;
} else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) {
return ConnectionType3G;
} else {
return ConnectionTypeWiFi;
}
}
Appleの Reachability をインポートして、これを試してください。
#import "Reachability.h"
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
//Try this
Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
NetworkStatus status = [reachability currentReachabilityStatus];
if(status == NotReachable)
{
NSLog(@"none");
//No internet
}
else if (status == ReachableViaWiFi)
{
NSLog(@"Wifi");
//WiFi
}
else if (status == ReachableViaWWAN)
{
NSLog(@"WWAN");
//connection type
CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
_carrier = [[netinfo subscriberCellularProvider] carrierName];
if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) {
NSLog(@"2G");
} else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) {
NSLog(@"2G");
} else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) {
NSLog(@"3G");
} else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) {
NSLog(@"3G");
} else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) {
NSLog(@"3G");
} else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) {
NSLog(@"2G");
} else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) {
NSLog(@"3G");
} else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) {
NSLog(@"3G");
} else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) {
NSLog(@"3G");
} else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
NSLog(@"3G");
} else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
NSLog(@"4G");
}
}
参考文献(リンクは将来壊れる可能性があります):
かなり単純なブロックベースのReachabilityラッパーを作成し、Cのような古いReachabilityコードをすべて取り除き、より多くのCocoaフォームに注ぎました。
次のような使用法:
[EPPZReachability reachHost:hostNameOrIPaddress
completition:^(EPPZReachability *reachability)
{
if (reachability.reachableViaCellular) [self doSomeLightweightStuff];
}];
日常使用のブロックでの到達可能性 で eppz!blog を参照するか、または GitHubでのeppz!reachability から直接入手してください。
それはIPアドレスでも動作しますが、これは非常にまれなReachabilityラッパー機能であることが判明しました。
Swiftには次を使用できます。
func getNetworkType()->String {
do{
let reachability:Reachability = try Reachability.reachabilityForInternetConnection()
do{
try reachability.startNotifier()
let status = reachability.currentReachabilityStatus
if(status == .NotReachable){
return ""
}else if (status == .ReachableViaWiFi){
return "Wifi"
}else if (status == .ReachableViaWWAN){
let networkInfo = CTTelephonyNetworkInfo()
let carrierType = networkInfo.currentRadioAccessTechnology
switch carrierType{
case CTRadioAccessTechnologyGPRS?,CTRadioAccessTechnologyEdge?,CTRadioAccessTechnologyCDMA1x?: return "2G"
case CTRadioAccessTechnologyWCDMA?,CTRadioAccessTechnologyHSDPA?,CTRadioAccessTechnologyHSUPA?,CTRadioAccessTechnologyCDMAEVDORev0?,CTRadioAccessTechnologyCDMAEVDORevA?,CTRadioAccessTechnologyCDMAEVDORevB?,CTRadioAccessTechnologyeHRPD?: return "3G"
case CTRadioAccessTechnologyLTE?: return "4G"
default: return ""
}
// Get carrier name
}else{
return ""
}
}catch{
return ""
}
}catch{
return ""
}
}
#import <ifaddrs.h>
#import <arpa/inet.h>
BOOL CheckWiFi() {
struct ifaddrs *interfaces = NULL;
struct ifaddrs *temp_addr = NULL;
BOOL hasWifi = NO;
int err = getifaddrs(&interfaces);
if(err == 0) {
temp_addr = interfaces;
while(temp_addr) {
if(temp_addr->ifa_addr->sa_family == AF_INET) {
struct sockaddr_in *addr = (struct sockaddr_in *)temp_addr->ifa_addr;
if(memcmp(temp_addr->ifa_name, "en", 2) == 0) {
hasWifi = YES;
break;
}
}
temp_addr = temp_addr->ifa_next;
}
}
freeifaddrs(interfaces);
return hasWifi;
}
Wi-Fiに接続しているかどうかを確認するために、接続を確立するためのコストのかかるチェックを省くことができます。インターネット共有を確認するには、ifa_name "bridge"を確認してください。
クラスメソッドは次のとおりです
+(NSString*)connectedNetworkType {
Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
NetworkStatus status = [reachability currentReachabilityStatus];
if(status == NotReachable) {
NSLog(@"none");
//No internet
}
else if (status == ReachableViaWiFi) {
NSLog(@"Wifi");
//WiFi
return @"Wifi";
}
else if (status == ReachableViaWWAN){
NSLog(@"WWAN");
//connection type
CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
// _carrier = [[netinfo subscriberCellularProvider] carrierName];
if (([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS])
||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge])
||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x])) {
NSLog(@"2G");
return @"2G";
}
else if (([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA])
||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA])
||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA])
||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0])
||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA])
||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB])
||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD])){
NSLog(@"3G");
return @"3G";
}
else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
NSLog(@"4G");
return @"4G";
}
}
return @"-1";//default unknown
}
XamarinまたはMonotouchを使用している場合、Xamarin GitHubリポジトリのReachability適合クラスを使用できます。
https://github.com/xamarin/monotouch-samples/blob/master/ReachabilitySample/reachability.cs
それをプロジェクトに追加して、Reachability.InternetConnectionStatus()
を呼び出します
AppleのSimplePingも含まれているiOS 6の更新バージョンを以下に示します。それはARC互換であり、私は別の人のReachabilityへの修正から始めました。 http://elbsolutions.com/projects/reachability-with-simpleping-wrapper/
これが誰かの助けになることを願っています。