10

これについてはすでにいくつかの質問がありますが、正確な結果を提供するものは何もないようです。特定の瞬間に電話が携帯電話ネットワークに接続されているかどうかを簡単に判断する必要があります。

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Reference/CTCarrier/Reference/Reference.html

SIM が電話にインストールされていない場合、このクラスは、mobileCountryCode、isoCountryCode、および mobileNetworkCode の値を返すため、正しく文書化されていないようです。携帯電話のロックが解除されている場合、carrierName は「ホーム」ネットワークまたは以前のホーム ネットワークを示します。

また、調べてみると、CoreTelephony フレームワークの文書化されていない方法を使用する次の方法が機能すると主張する人もいましたが、結果は役に立たず、おそらくそれ自体が一貫して更新されていない、一見ランダムな数字を報告しています。

-(int) getSignalStrength
{
    void *libHandle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
    int (*CTGetSignalStrength)();
    CTGetSignalStrength = dlsym(libHandle, "CTGetSignalStrength");
    if( CTGetSignalStrength == NULL) NSLog(@"Could not find CTGetSignalStrength");
    int result CTGetSignalStrength();
    dlclose(libHandle);
    return result;
}

ありがとう。

編集: アプリは内部 Wi-Fi に接続されており、そのままにしておく必要があるため、到達可能性チェックがより困難になります。

4

2 に答える 2

9

私はこの関数をいじっていて、面白い方法で呼び出していることに気付きました。CoreTelephony.framework をコンパイル時のリンクとして追加して呼び出しています。関数自体については、そのプロトタイプをどこか (おそらく呼び出し元のメソッドのすぐ上) で宣言する必要があります。

int CTGetSignalStrength();

これは、CoreTelephony のパブリック ヘッダーにないため、宣言する必要があります。

ここで、毎秒信号強度を出力する簡単なアプリを作成しました。

int CTGetSignalStrength();

- (void)viewDidLoad
{
    [super viewDidLoad];

    while (true) {
        printf("signal strength: %d\n", CTGetSignalStrength());
        sleep(1);
    }
}

iPad mini で実行したところ、手に取るまで安定した値が示され、数値が上昇しました。iPad をスズ箔で包むと (スズ箔は今まで使ったことのないデバッグ ツールです)、数値が下がりました。iPad を機内モードにすると、最後の値が繰り返され続けたので、これは正確な測定値ではありません。

デバイスが現在セルラー データ ネットワークに接続されているかどうかをテストする場合は、到達可能性、特にkSCNetworkReachabilityFlagsIsWWAN.

于 2013-01-30T13:03:02.720 に答える
5

さて、私は今正しい解決策を持っていると思いますが、それは最終的には少し簡単でした。

CTGetSignalStrength()メソッドの問題は、正常に機能することですが、simを削除すると、削除前の最後の信号が報告されます。同じフレームワークでCTSIMSupportGetSIMStatus()と呼ばれる別のメソッドを見つけましたが、これも文書化されていません。これにより、SIMが現在接続されているかどうかを確認できます。次のように両方を使用すると、現在のネットワーク信号を確認できます。

最初にメソッドを宣言します。

NSString * CTSIMSupportGetSIMStatus();
int CTGetSignalStrength();

次に、次のようにセルネットワークへの接続を確認します。

NSString *status = CTSIMSupportGetSIMStatus();
int signalstrength = CTGetSignalStrength();
BOOL connected = ( [status isEqualToString: @"kCTSIMSupportSIMStatusReady"] && signalstrength > 0 );
于 2013-01-31T16:29:43.887 に答える