我正在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”会被调用,但如果应用程序被最小化,则不会被调用。然而,当应用程序重新打开时,它会处理在最小化期间接收到的任何数据。我已将voip标签添加到info.plist中。我的CFReadStreamSetProperty返回true。我正在设备上运行而非模拟器上。尽管如此,它仍然无法正常工作,所以我不知道我的问题是什么。我可能只是做了一些傻事,但几乎没有什么在线资源可以用来检查我的代码。
编辑:我无法测试任何答案,因为我不再从事这个项目,并且没有访问Mac / iOS SDK的权限。如果有人发现以下任何答案有用,请告诉我,我将投票支持它。