1

次の2種類のコードを試してみました。

実行時間:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) {
    CFReadStreamSetProperty(theReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
    CFWriteStreamSetProperty(theWriteStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); 
}

コンパイル時間:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 {
    CFReadStreamSetProperty(theReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
    CFWriteStreamSetProperty(theWriteStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); 
}

kCFStreamNetworkServiceTypeおよびkCFStreamNetworkServiceTypeVoIPはiOS4.0で提供される定数です。ただし、いくつかの理由により、iOS3.1を搭載したデバイスに上記のコードを組み込む必要があります。上記のコードをiOS3.1を搭載したデバイスに組み込むと、アプリケーションを開いたときにクラッシュします。問題を解決する方法はありますか?

4

2 に答える 2

1

Xcodeビルド設定でDeploymentTargetをiOS3.1に設定し、最新のBaseSDKでビルドする必要があるというApurvに同意します。ただし、オペレーティングシステムのバージョンでテストすることはお勧めしません。

OSのバージョンは浮動小数点数ではありません。 "3.1.3"は有効なOSバージョンですが、浮動小数点数ではありません。また、浮動小数点数の比較は決して良い考えではありません。

代わりに、この他のStackOverflow回答のマクロを使用してください

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"4.0")) {
    CFReadStreamSetProperty(theReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
    CFWriteStreamSetProperty(theWriteStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); 
}

編集:これが必要な理由の例として、次のコードを検討してください。

NSString* osVersion = @"3.1.3";
float x = [osVersion floatValue];
NSLog(@"OS version = %lf", x);
if (x >= 3.1) {
    NSLog(@"OS >= 3.1");
} else if (x < 3.1) {
    NSLog(@"OS < 3.1");
}

これをiPhone5.0シミュレーターで実行すると、次の出力が生成されますが、これは明らかに希望どおりではありません。

2012-07-31 17:56:38.155 HelloWorld [5856:f803]OSバージョン=3.100000

2012-07-31 17:56:41.257 HelloWorld [5856:f803] OS <3.1

xデバッガーでの値を調べると3.0999999、それがとして表示され、誤った比較結果がトリガーされます。

于 2012-07-31T10:16:44.120 に答える
0

最新のSDKを使用してアプリケーションをビルドし、iOS3.1にデプロイターゲットを提供する必要があります。

以下のチェックを入れている場合は、クラッシュしないはずです。

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) {
    CFReadStreamSetProperty(theReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
    CFWriteStreamSetProperty(theWriteStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); 
}
于 2012-07-31T09:54:45.483 に答える