アプリに「WiFiのみでダウンロード」というトグルがあります。ただし、そのトグルはiPodtouchや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モデムが含まれているモデルを確認することです ここ =。
*****ベンテックの回答によると、デバイス名を調べたい場合(Apple 3gインターフェイス名を変更することにした場合)、事前の警告なしに動作を停止する可能性があります)、 getifaddrs
そしてpdp_ip0
インターフェースをチェックします。
@bentechの回答のSwift3.0(UIDevice + Extension)
この行をBridgingHeader.hに追加します。
#import <ifaddrs.h>
どこか別の場所:
extension UIDevice {
/// A Boolean value indicating whether the device has cellular data capabilities (true) or not (false).
var hasCellularCapabilites: Bool {
var addrs: UnsafeMutablePointer<ifaddrs>?
var cursor: UnsafeMutablePointer<ifaddrs>?
defer { freeifaddrs(addrs) }
guard getifaddrs(&addrs) == 0 else { return false }
cursor = addrs
while cursor != nil {
guard
let utf8String = cursor?.pointee.ifa_name,
let name = NSString(utf8String: utf8String),
name == "pdp_ip0"
else {
cursor = cursor?.pointee.ifa_next
continue
}
return true
}
return false
}
}
IOS 6.1では、 Core Telephony を使用して、セルラーベースバンド機能の存在を正常にチェックすることができました。これは、私がテストしたすべてのiPadで機能します。サービスがアクティブ化されている場合とされていない場合のVerizon、サービスが現在非アクティブ化されているAT&T、SIMカードの入出力、Wi-FiのみのiPadです。
私が使用したコードは次のようになります。
CTTelephonyNetworkInfo* ctInfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier* carrier = ctInfo.subscriberCellularProvider;
self.hasWWANCapability = carrier != nil;
セルラーベースバンドハードウェアを搭載したすべてのiPadの場合、carrier
はnilではありません。 Wi-FiのみのiPadの場合、carrier
はnilです。
CoreTelephony Framework を使用できるはずだと思います。
運送業者が使用することを明記しているので、TOSがアクセスすることに反対しているかどうかはわかりません。
キャリアはこの情報を使用して、自分の加入者にのみサービスを提供するアプリケーションを作成できます。
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");
}
これを行う1つの方法は、ユーザーの場所を尋ねることです。可能な限り正確であれば、デバイスにGPSが搭載されているかどうかがわかります。 GPSを搭載したすべてのデバイスには3Gが搭載されます。そして、GPSを持たないものは3Gを持っていません。