iOS アプリケーションのバックグラウンドで実行する VOIP ソケットを取得しています。
接続は正常に機能しますが、アプリがバックグラウンドに移行しても復帰しません。ただし、アプリを再度開くと、スリープ中に受け取ったメッセージに応答します。
ストリームを次のように設定しました。
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
(CFStringRef) @"test.iusealocaltestserver.com",
5060,
&myReadStream,
&myWriteStream);
CFReadStreamSetProperty ( myReadStream,
kCFStreamNetworkServiceType,
kCFStreamNetworkServiceTypeVoIP
);
CFSocketNativeHandle native;
CFDataRef nativeProp = CFReadStreamCopyProperty(myReadStream, kCFStreamPropertySocketNativeHandle);
CFDataGetBytes(nativeProp, CFRangeMake(0, CFDataGetLength(nativeProp)), (UInt8 *)&native);
CFRelease(nativeProp);
CFSocketRef theSocket = CFSocketCreateWithNative(kCFAllocatorDefault, native, 0, NULL, NULL);
CFSocketGetContext(theSocket,&theContext);
CFOptionFlags readStreamEvents = kCFStreamEventHasBytesAvailable |
kCFStreamEventErrorOccurred |
kCFStreamEventEndEncountered |
kCFStreamEventOpenCompleted;
CFReadStreamSetClient(myReadStream,
readStreamEvents,
(CFReadStreamClientCallBack)&MyCFReadStreamCallback,
(CFStreamClientContext *)(&theContext));
CFReadStreamScheduleWithRunLoop(myReadStream, CFRunLoopGetCurrent(),
kCFRunLoopCommonModes);
次に、コールバックは次のように設定されます。
static void MyCFReadStreamCallback(CFReadStreamRef stream, CFStreamEventType type, void *pInfo);
static void MyCFReadStreamCallback (CFReadStreamRef stream, CFStreamEventType type, void *pInfo)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"Callback Happened");
[pool release];
}
データを受信し、アプリが開いているときに「Callback Happened」が呼び出されますが、アプリが最小化されている場合は呼び出されません。ただし、アプリが再起動すると、最小化中に受信したすべてのデータが処理されます。
info.plist に voip タグを追加しました。私の CFReadStreamSetProperty は true を返します。シミュレーターではなくデバイスで実行しています。それでもうまくいかないので、何が問題なのかわかりません。ばかげたことをしただけかもしれませんが、オンラインでコードをチェックできるものはほとんどありません。
編集:このプロジェクトに取り組んでおらず、mac/iOs sdk にアクセスできないため、回答をテストできません。同様の問題を抱えている人が以下の回答のいずれかが役立つと感じた場合は、お知らせください。ベストアンサーに投票します。