アプリに「WiFi のみでダウンロード」というトグルがあります。ただし、そのトグルは iPod touch や WiFi-iPad では役に立ちません。
デバイスにコードでセルラー データ機能があるかどうかを知る方法はありますか? 将来的に機能するものも素晴らしいでしょう (3G を備えた iPod touch 第 5 世代が登場する場合など)。
アプリに「WiFi のみでダウンロード」というトグルがあります。ただし、そのトグルは iPod touch や WiFi-iPad では役に立ちません。
デバイスにコードでセルラー データ機能があるかどうかを知る方法はありますか? 将来的に機能するものも素晴らしいでしょう (3G を備えた iPod touch 第 5 世代が登場する場合など)。
こんにちは、pdp_ip0 インターフェイスがあるかどうかを確認できるはずです
#import <ifaddrs.h>
- (bool) hasCellular {
struct ifaddrs * addrs;
const struct ifaddrs * cursor;
bool found = false;
if (getifaddrs(&addrs) == 0) {
cursor = addrs;
while (cursor != NULL) {
NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];
if ([name isEqualToString:@"pdp_ip0"]) {
found = true;
break;
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return found;
}
これはプライベート API を使用しません。
3G 自体を見つけるのは難しいようです。を使用して、デバイスが通話を発信できるかどうかを調べることができます[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]
。到達可能性コードを使用して、デバイスがインターネットに接続できるかどうか、期間 (および現在発生している方法)を確認できます。
NetworkStatus currentStatus = [[Reachability reachabilityForInternetConnection]
currentReachabilityStatus];
if(currentStatus == kReachableViaWWAN) // 3G
else if(currentStatus == kReachableViaWifi) // ...wifi
else if(currentStatus == kNotReachable) // no connection currently possible
..しかし、それを除けば、デバイスに 3G モデムが存在するかどうかを確認することはできないと思います.***** 電話をかけることができず、現在セルデータがオンになっていない場合Wi-Fi がオフになっていると、3G 対応かどうかを確認できません。
別の方法 (ただし、前方互換性がないため、おそらくこれを行う必要はありません) は、デバイスのモデルを完全なリストと比較し、ここに示すように、どのモデルに 3G モデムが搭載されているかを確認することです。
***** bentech の回答によると、デバイス名を調べたい場合 (Apple が 3g インターフェイス名を変更することを決定した場合、事前の警告なしに動作を停止する可能性があります)、電話getifaddrs
してインターフェイスを確認してくださいpdp_ip0
。
CoreTelephony Frameworkを使用できるはずだと思います。
キャリアが使用するものであると明記されているため、TOSにアクセスすることがTOSに違反しているかどうかはわかりません.
通信事業者は、この情報を使用して、自社の加入者のみにサービスを提供するアプリケーションを作成できます。
これを行う1つの方法は、ユーザーの場所を尋ねることです。可能な限り正確であれば、デバイスにGPSが搭載されているかどうかがわかります。GPSを搭載したすべてのデバイスには3Gが搭載されます。そして、GPSを持たないものは3Gを持っていません。
Apple はここにコードを提供しました。 https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html
Reachability.h と Reachability.m をプロジェクトにコピーし、Reachability.h をクラスにインポートしてから、
Reachability *networkReachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];
while (networkStatus==NotReachable) {
NSLog(@"not reachable");
//no internet connection
return;
}
while (networkStatus==ReachableViaWWAN) {
NSLog(@" ReachableViaWWAN ");
}
while (networkStatus==ReachableViaWiFi) {
NSLog(@"ReachableViaWiFi");
}
別の方法は、これを拡張することです: https://github.com/monospacecollective/UIDevice-Hardware/blob/master/UIDevice-Hardware.mこれで:
-(bool) hasCellular:(NSString*)modelIdentifier {
if ([modelIdentifier hasPrefix:@"iPhone"]) return YES;
if ([modelIdentifier hasPrefix:@"iPod"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad1,1"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,1"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,2"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,3"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,4"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,5"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,6"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,7"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad3,1"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad3,2"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad3,3"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad3,4"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad3,5"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad3,6"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad4,1"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad4,2"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,5"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,6"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,7"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad4,4"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad4,5"]) return YES;
if ([modelIdentifier isEqualToString:@"i386"]) return NO;
if ([modelIdentifier isEqualToString:@"x86_64"]) return NO;
return YES;
}
(明らかに、新しいモデルがある場合にどちらの方法でエラーを発生させたいかに応じて、NO または YES のいずれかを削除するように編集できます...)