我得到一个VOIP套接字在iOS应用程序的后台运行。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];
}
“回调正巧”当我收到的数据获取调用和应用程序是打开,但如果应用程序最小化则不会。但是,当应用程序恢复时,它会处理收到的最小数据量。
我加入了VOIP标签的info.plist中。我的CFReadStreamSetProperty返回true。我在设备上运行而不是模拟器。它仍然不起作用,所以我不知道我的问题可能是什么。我可能只是做了一些愚蠢的事情,但几乎没有任何在线检查我的代码。
编辑:我无法测试任何的答案,因为我不再在这个项目上的工作,并没有进入到Mac/iOS版SDK。如果某个具有类似问题的人发现以下某个答案有用,请告诉我,我将对其进行最佳答案投票。
+1:你还添加了“音频”标签中的plist?我只是从应用程序编程指南中阅读有关多任务处理的内容,但这看起来像是一些不规则的东西。希望你能得到答案。好问题。 –
我还没有播放任何音频,所以不应该有所作为。但我仍然尝试过,并没有奏效。感谢至少给我一些尝试,我只是砸了我的头几个小时。 – Joel
您可以将代码发布到您的保持活动超时处理程序吗? –