2

iPhone OS 4.xが提供する新しいメカニズムを使用して、VoIPアプリケーションのバックグラウンドモードを実装しようとしています。

それでも成功しません...一部のデータがTCPソケットを介してサーバーから到着すると、アプリケーションはバックグラウンドモードでサイレントのままになります。

ドキュメントによると、次の2つのことを行う必要があります。

  1. ファイル内のvoip値を追加Required background modesInfo.plst
  2. オブジェクトのプロパティを値に設定kCFStreamNetworkServiceTypeしますCFReadStreamRefkCFStreamNetworkServiceTypeVoIP

CFReadStreamRef関数でインスタンス化するために、外部で作成されたBSDソケットを使用していCFStreamCreatePairWithSocketます。ソケットハンドルは正しいです-いくつかのテストで確認されました。したがって、正しいオブジェクトを取得していCFReadStreamRefます。これは後で構成して開きます。

コードのチャンクは次のとおりです。

CFSocketNativeHandle socket = (CFSocketNativeHandle)socketHandle; 
CFStreamCreatePairWithSocket(kCFAllocatorDefault, socket, &sipSocketReadStream, nil);
CFReadStreamSetProperty(sipSocketReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
NSInputStream *inputStream = (NSInputStream*)sipSocketReadStream;   
[inputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
CFReadStreamOpen(sipSocketReadStream);

注意してください-私の代理人はイベントNSInputStreamを正常に受信します。Stream Openedしかし、他のイベントはまったく発生しませんでした。TCPトラフィックが到着し始めたときにイベントを受信することを期待していました。

4

3 に答える 3

4

ギラッドが言及した賢明なアドバイスを繰り返します。バックグラウンド TCP ソケットは、シミュレータでは機能しません。シミュレーターの便利さに夢中になって、この問題の真相を突き止めようとかなりの時間を費やしました。

さらに、おそらく私だけかもしれませんが、ドキュメントから、どの値がキーで、どの値がプロパティであるかが明確ではありませんでした。記録のために、これは私がそれを設定する方法であり、それは機能します:

res = [oStream setProperty:NSStreamNetworkServiceTypeVoIP 
                    forKey:NSStreamNetworkServiceType];

if(!res){
   // Error handling here
}
于 2010-10-01T06:45:12.677 に答える
2

plistファイルのオプションをUIBackgroundModes使用して、配列として持っていることを確認する必要があります。voip

<key>UIBackgroundModes</key>
<array>
    <string>voip</string>
</array>

さらに、voipバックグラウンド タスクはシミュレーターでは機能しないため、必ず実際のデバイスでテストしてください。UIBackgroundModesを適切に設定し、ストリーム タイプを に設定した場合kCFStreamNetworkServiceTypeVoIP、私の唯一の結論は、おそらくシミュレーターでテストしているということです。

于 2010-09-16T00:02:09.727 に答える
0

[inputStream open]が欠落していると思います。ストリームを開いたら、デリゲートメソッドを呼び出すことを願っています。

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent

VOIP モードで TCP 接続が成功した後、iOS のみがバックグラウンド モードのアプリでもソケットを維持します。

于 2013-01-09T06:36:53.427 に答える